字节码解析指令和机器语言之间的区别?

3 compiler-construction interpreter programming-languages bytecode

"字节码程序通常通过一次解析一个指令来执行.这种字节码解释器非常便携.一些系统,称为动态转换器,或"即时"(JIT)编译器,将字节码转换为机器语言在运行时必要时:这使得虚拟机不可移植."

关于这一段的问题是:在处理字节码之后,解析的指令和机器语言(或机器代码)之间有什么区别?

Ste*_*ven 7

JIT与字节码解释器不同.

考虑以下C函数:

int sum() {
   return 5 + 6;
}
Run Code Online (Sandbox Code Playgroud)

这将直接编译机器代码.关于x86和ARM处理器的确切说明将有所不同.

如果我们编写了一个基本的字节码解释器,它可能看起来像这样:

for(;;) {
   switch(*currentInstruction++) {
   case OP_PUSHINT:
      *stack++ = nextInt(currentInstruction);
      break;
   case OP_ADD:
      --stack;
      stack[-1].add(*stack);
      break;
   case OP_RETURN:
      return stack[-1];
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,这可以解释以下一组说明:

OP_PUSHINT (5)
OP_PUSHINT (6)
OP_ADD
OP_RETURN
Run Code Online (Sandbox Code Playgroud)

如果您在x86或ARM上编译了字节码解释器,那么您将能够运行相同的字节代码而无需进一步重写解释器.

如果您编写了JIT编译器,则需要为每个支持的处理器发出特定于处理器的指令(机器代码),而字节代码解释器依赖于C++编译器来发出处理器特定的指令.