3 compiler-construction interpreter programming-languages bytecode
"字节码程序通常通过一次解析一个指令来执行.这种字节码解释器非常便携.一些系统,称为动态转换器,或"即时"(JIT)编译器,将字节码转换为机器语言在运行时必要时:这使得虚拟机不可移植."
关于这一段的问题是:在处理字节码之后,解析的指令和机器语言(或机器代码)之间有什么区别?
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++编译器来发出处理器特定的指令.