为什么在执行时而不是在安装时编译字节码JIT?

时间:2011-06-18 23:10:28

标签: compilation distribution jit bytecode

将程序编译为字节码而不是本机代码可以实现一定程度的可移植性,因此存在适合的虚拟机。

但我有点疑惑,为什么要推迟编译?为什么不在安装应用程序时简单地编译字节代码?

如果这样做,为什么不将它采用直接编译为本机代码的语言?将它们编译为中间格式,使用安装程序分发“JIT”编译器并在目标机器上编译它。

我唯一能想到的是运行时优化。这是安装时唯一无法完成的重大事情。想法?

3 个答案:

答案 0 :(得分:1)

通常是预编译的。例如,考虑使用NGEN预编译.NET代码。

不预编译所有内容的一个原因是可扩展性。考虑那些允许使用反射在运行时加载其他代码的语言。

答案 1 :(得分:1)

某些JIT编译器(例如Java HotSpot)使用基于type feedback的内联。它们跟踪程序中实际使用的类型,以及内联函数调用基于他们之前看到的内容是他们稍后会看到的内容。为了使其工作,他们需要通过其“热循环”的多次迭代来运行程序,以便知道使用了什么类型。

此优化在安装时完全不可用。

答案 2 :(得分:0)

字节码已经编译,就像编译了C ++代码一样。

JIT编译器,即.NET和Java运行时也是庞大且动态的;并且您无法在程序中预见应用程序使用哪些部分,因此您需要整个运行时。

还必须意识到,针对虚拟机的语言与针对裸机的语言具有非常不同的设计目标。

采用C ++与Java。

  • C ++无法在VM上运行,特别是很多C ++语言设计都面向RAII。
  • 由于种种原因,Java无法在裸机上工作。一个原始类型。
编辑:正如德尔南指出的那样; JIT和类似技术虽然对字节码性能非常有益,但在安装时可能无法使用。编译VM也与编译为本机代码有很大不同。