这article by Brian Goetz的第一行让我在SO中发布这个问题。这又是一行:
动态编写和解释性能基准 编译语言,比如Java,要困难得多 静态编译的语言,如C或C ++。
我知道answer of statically typed vs dynamically typed language。但动态编译语言与静态编译语言之间的区别是什么?
答案 0 :(得分:24)
动态编译和动态类型彼此没有多大关系。键入是语言语法的一部分,而编译策略是语言实现的一部分。
动态类型意味着您在声明变量时不必声明类型,并且在大多数情况下类型之间的转换会自动发生。
动态编译意味着在执行程序时将语言编译为机器代码,而不是之前。这允许,例如,即时优化 - 在应用程序运行时优化代码。 JIT优化器的优势在于它具有更可靠的信息,这些信息关于代码的哪些分支最常使用以及它们通常如何使用,因为它可以在应用优化之前观察应用程序的运行情况。
动态编译是自动基准测试的一个问题,因为同一程序代码部分的多次测量可以比较完全不同的机器代码解释,因为优化器决定在两次运行之间更改实现。
答案 1 :(得分:7)
C和C ++源代码通常由编译器编译为本机机器代码。
Java编译器将Java编译为字节码。运行Java程序时,just-in-time (JIT) compiler可能会将Java字节码编译为运行程序的CPU的本机代码。
程序运行时将程序编译为本机机器代码也称为dynamic compilation。
答案 2 :(得分:4)
动态与静态编译是指在执行期间如何以及是否可以更改编译器生成的代码以更改性能或程序。
静态编译不允许这样的操作,因为所有地址和跳转都是固定的(除非您自己编写代码以在执行期间更改指令顺序)。
动态编译允许在程序执行期间进行检查,并且可以使用收集的信息使事情运行得更快。 Wikipedia article易于阅读且信息丰富。
答案 3 :(得分:3)
从基准的角度来看,差异在于动态编译程序的执行时间在执行期间会发生显着变化。通常首先解释java代码,然后,当解释器发现某些方法被多次调用时,它会调用JIT编译器将它们转换为本机代码。编译后的代码仍然受到监控,当经常执行部分代码(“热点”)时,它们会进一步优化。
动态编译语言的基准测试至少必须将“升温阶段”(代码优化时)与执行的其余部分分开处理。