Brian Goetz的这篇文章的第一行让我在 SO 中发布了这个问题。这又是一行:
为动态编译语言(如 Java)编写和解释性能基准远比为静态编译语言(如 C 或 C++)困难得多。
我知道静态类型与动态类型语言的答案。但是动态编译语言和静态编译语言有什么区别呢?
Brian Goetz的这篇文章的第一行让我在 SO 中发布了这个问题。这又是一行:
为动态编译语言(如 Java)编写和解释性能基准远比为静态编译语言(如 C 或 C++)困难得多。
我知道静态类型与动态类型语言的答案。但是动态编译语言和静态编译语言有什么区别呢?
动态编译和动态类型之间没有太大关系。类型是语言语法的一部分,而编译策略是语言实现的一部分。
动态类型意味着您不必在声明变量时声明类型,并且类型之间的转换在大多数情况下会自动发生。
动态编译意味着在程序执行时将语言编译为机器代码,而不是之前。例如,这允许即时优化 - 代码在应用程序运行时进行优化。JIT 优化器的优点是它拥有关于哪些代码分支最常使用以及它们通常如何使用的更可靠的信息,因为它可以在应用优化之前观察正在运行的应用程序。
动态编译是自动基准测试的一个问题,因为同一程序代码部分的多次测量可以比较完全不同的机器代码解释,因为优化器已决定在两次运行之间更改实现。
C 和 C++ 源代码通常由编译器编译为本机机器代码。
Java 由 Java 编译器编译为字节码。当您运行 Java 程序时,即时 (JIT) 编译器可能会将 Java 字节码编译为运行该程序的 CPU 的本机机器代码。
在程序运行时将程序编译为本机代码也称为动态编译。
动态与静态编译是指如何以及是否可以在执行期间更改编译器生成的代码以更改性能或程序。
静态编译不允许这样的操作,因为所有地址和跳转都是固定的(除非您自己编写代码以在执行期间更改指令顺序)。
动态编译允许在程序执行期间进行检查,收集的信息可用于使事情运行得更快。维基百科的文章很容易阅读并且信息量很大。
从基准测试的角度来看,不同之处在于动态编译程序的执行时间在执行过程中会发生巨大变化。通常是先解释 java 代码,然后当解释器发现某个方法被多次调用时,它会调用 JIT 编译器将其转换为原生代码。编译后的代码仍然受到监控,并且当确定频繁执行的代码部分(“热点”)时,它们会被进一步优化。
作为最低限度,动态编译语言的基准测试必须将“升温阶段”(当代码优化时)与执行的其余部分分开处理。