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

“字节码程序通常是通过一次一个地解析指令来执行的,这种字节码解释器是非常便携的,有些系统称为动态翻译器或”即时“(JIT)编译器,将字节码翻译成机器语言在运行时根据需要:这使得虚拟机不可移植。“

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


JIT与字节代码解释器不同。

考虑下面的C函数:

int sum() {
   return 5 + 6;
}

这将直接编译机器码。 说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];
   }
}

然后这可以解释以下一组指令:

OP_PUSHINT (5)
OP_PUSHINT (6)
OP_ADD
OP_RETURN

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

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


没有什么区别 - JIT编译器完全是这样做的 - 它生成在硬件上执行的机器代码。


在字节码解释器中,指令格式通常用于使用移位和掩码操作符进行非常快速的“解析”。 解释器在“解析”(我更喜欢“解码”)指令后立即更新虚拟机的状态,然后开始解码下一条指令。 所以在字节码在解释器中被处理后,没有剩余的剩余。

在JIT编译器中,字节以大于单个指令的单位进行处理。 最小单位是基本块,但现代JIT会将较大的路径转换为机器码。 这是一个翻译步骤,翻译步骤的输出是机器代码。 原始字节码可能保留在内存中,但不用于实现 - 所以没有实际区别。 (尽管JITted虚拟机的机器代码与本机代码编译器发出的机器代码不同,但它仍然是典型的。)

链接地址: http://www.djcxy.com/p/52553.html

上一篇: Difference between a bytecode parsed instruction and machine language?

下一篇: What is the difference between implementing a compiler and an interpreter?