“字节码程序通常通过逐条解析指令来执行。这种字节码解释器非常便携。有些系统称为动态翻译器或“即时”(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
没有区别 - JIT编译器就是为此而设计的 - 它生成在硬件上执行的机器代码。
最终所有的都归结于机器指令。
可以看出,在第一种情况下,开销最小,而在第三种情况下,开销最大。所以,性能应该是第一种情况下最快,并且在初始编译开销之后,第二种情况下同样快。