不要JIT和非JIT启用的解释器最终生成机器代码

B M*_*Mac 7 interpreter jit jvm native

好的,我已经阅读了几个关于JIT和非JIT启用的解释器之间的差异的讨论,以及为什么JIT通常会提高性能.

但是,我的问题是:

最终,非JIT启用的解释器是否必须将字节码(逐行)转换为要执行的机器/本机代码,就像JIT编译器一样?我已经看到过它的帖子和教科书,以及说它没有的帖子.后一个参数是解释器/ JVM直接执行此字节码而不与机器/本机代码交互.

如果非JIT解释器确实将每一行转换为机器代码,那么JIT的主要好处似乎是......

  1. 缓存字节码的所有(正常JIT)或经常遇到(热点/自适应优化)部分的智能,以便每次都不需要机器代码编译步骤.

  2. 任何优化JIT编译器都可以将字节码转换为机器代码.

那是准确的吗?在通过非JIT和JIT启用的解释器将字节码转换为机器代码之间似乎没有什么区别(除了可能的优化,或者可能是逐行的JITting块).

提前致谢.

Ale*_*x D 9

非JIT解释器不会将字节码转换为机器码.您可以想象非JIT字节码解释器的工作方式(我将使用类似Java的伪代码):

int[] bytecodes = { ... };
int   ip        = 0; // instruction pointer
while(true) {
  int code = bytecodes[ip];
  switch(code) {
    case 0;
      // do something
      ip += 1; break;
    case 1:
      // do something else
      ip += 1; break;
    // and so on...
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于每个执行的字节码,解释器必须检索代码,切换其值以决定要做什么,并在进入下一次迭代之前递增其"指令指针".

使用JIT,所有开销都将减少到零.它只需要适当的开关分支的内容(表示"//做某事"的部分),在内存中将它们串在一起,然后执行跳转到第一个分支的开头.不需要软件"指令指针" - 只有CPU的硬件指令指针.不从内存中检索字节码并切换它们的值.

编写虚拟机并不困难(如果它不必具有极高的性能),并且可以是一个有趣的练习.我为嵌入式项目做过一次,程序代码必须非常紧凑.