字节码解析指令和机器语言的区别是什么?

4
“字节码程序通常通过逐条解析指令来执行。这种字节码解释器非常便携。有些系统称为动态翻译器或“即时”(JIT)编译器,在运行时将字节码按需转换为机器语言:这使得虚拟机不可移植。”关于这一段的问题是:在字节码处理完成后,解析指令和机器语言(或机器码)之间有什么区别?

这真的取决于你所说的“解析指令”的含义 - 你是指在抽象语法树中的表示吗? - none
4个回答

7

考虑以下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 ++编译器发出特定于处理器的指令。

2
在字节码解释器中,指令格式通常设计为使用移位和掩码运算符非常快速的“解析”(我更喜欢称之为“解码”) 。解释器在“解析”指令后,立即更新虚拟机的状态,然后开始解码下一条指令。因此,在通过解释器处理字节码后,没有任何遗留物。
在JIT编译器中,字节以比单个指令更大的单元进行处理。最小单元是基本块,但现代JIT将转换更大的路径为机器代码。这是一个翻译步骤,翻译步骤的输出机器代码。原始字节码可能仍然存在于内存中,但它不用于实现 - 因此没有真正的区别。(尽管JIT虚拟机的机器代码执行与本地代码编译器发出的机器代码执行不同,这仍然是典型情况。)

1

没有区别 - JIT编译器就是为此而设计的 - 它生成在硬件上执行的机器代码。


1

最终所有的都归结于机器指令。

  1. 本地应用程序 - 包含直接执行的机器指令。
  2. JIT 应用程序 - 字节码被编译成机器指令并执行。
  3. 翻译应用程序 - 字节码由虚拟机翻译为本地应用程序。

可以看出,在第一种情况下,开销最小,而在第三种情况下,开销最大。所以,性能应该是第一种情况下最快,并且在初始编译开销之后,第二种情况下同样快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接