Dynamically compiled language vs statically compiled language
布莱恩·戈茨这篇文章的第一行让我把这个问题贴在了SO中。这又是一句台词:
Writing and interpreting performance benchmarks for dynamically
compiled languages, such as Java, is far more difficult than for
statically compiled languages like C or C++.
我知道静态类型和动态类型语言的答案。但是,动态编译语言和静态编译语言之间的区别是什么?
动态编译和动态类型化之间没有太多关系。输入是语言语法的一部分,而编译策略是语言实现的一部分。
动态类型化意味着在声明变量时不必声明类型,而且在大多数情况下类型之间的转换都是自动进行的。
动态编译是指在执行程序时,而不是在执行之前,将语言编译为机器代码。例如,这允许实时优化——代码在应用程序运行时得到优化。JIT优化器的优点是,它具有更可靠的信息,说明最常用的代码分支以及它们通常的使用方式,因为它可以在应用优化之前观察应用程序的运行情况。
动态编译是自动基准测试的一个问题,因为同一程序代码段的多个度量可以比较完全不同的机器代码解释,因为优化器决定在两次运行之间更改实现。
C和C++源代码通常由编译器编译为本机代码。
Java被Java编译器编译成字节码。当运行Java程序时,准时(JIT)编译器可以将Java字节码编译为程序运行的CPU的本机代码。
当程序运行时,将程序编译为本机代码也称为动态编译。
动态编译与静态编译是指编译器生成的代码在执行过程中如何和如果可以更改,以更改性能或程序。
静态编译不允许这样的操作,因为所有地址和跳转都是固定的(除非您自己编写代码以在执行期间更改指令顺序)。
动态编译允许在程序执行期间进行检查,收集到的信息可以用来加快运行速度。维基百科的这篇文章读起来很容易,内容也很丰富。
从基准的角度来看,不同之处在于动态编译程序的执行时间在执行过程中会发生显著的变化。通常Java代码首先被解释,然后,当解释器发现某些方法被多次调用时,它调用JIT编译器将它们转换为本机代码。编译后的代码仍然受到监控,当确定经常执行的代码部分("热点")时,它们会进一步优化。
作为最低要求,动态编译语言的基准必须与其他执行分开对待"预热阶段"(当代码被优化时)。