假设我正在创建自己的C ++虚拟机,它支持我自己的基于中间字节码指令的程序代码。
然后将编译的IL加载到VM中并执行。如何获取指令列表然后将它们作为本机指令存储在内存中?
通过这个,我的意思是:如果我有一个字节数组都是操作码指令,并且我顺序循环它们并使用switch语句来处理执行,我怎么能真正地将它编译为原生的'及时'并在每次执行特定指令集时执行它?
我真的很困惑这在虚拟机中是如何工作的?虚拟机如何将中间指令编译为本机指令,然后将这些本机(asm?)指令存储在内存中,以便在每次调用指令集时执行这些指令?
我很想进一步理解这个概念。很抱歉,如果我对低级VM设计的理解不足。我不明白如何编译switch语句的结果,无论如何 - 不确定VM实际上是如何做到的,是本机的,已编译的代码。
答案 0 :(得分:0)
将字节码指令简单地宏编译为本机指令序列是非常低效的。 JIT编译器通常首先从字节码构建一个中间表示(理想情况下是SSA形式),然后应用与独立编译器相同的所有编译技术,只需避免使用最昂贵的编译器。将堆栈机器字节码转换为SSA是一种反编译形式,因此寄存器机器字节码可以更高效(但更难生成)。
还有另一种方法在目前越来越受欢迎 - tracing JITs,JIT管道的最高层做同样的事情,作为一个独立的编译器,但仅限于一个基本块(由追踪产生)。在这种方法中,作为第一层JIT,可以接受天真的宏扩展。
而且,如果你真的希望能够在没有任何修改的情况下获取你的switch语句,可以使用一些字节码并将它们翻译成编译代码,你应该看看partial evaluation技术(又名Supercompilation aka First Futamura)投影)。