如何在 C++ 中复制中间字节码 JIT 编译?

How can you replicate intermediate bytecode JIT compilation in C++?

假设我正在创建自己的 C++ 虚拟机,它支持我自己的基于中间字节码指令的程序代码。

然后将编译后的 IL 加载到 VM 中并执行。如何获取指令列表,然后将它们实际存储为内存中的本机指令?

我的意思是:如果我有一个字节数组,这些字节都是操作码指令,我按顺序循环遍历它们并使用 switch 语句来处理执行,我怎么能实际上将其编译为本机 'just in time' 并在每次执行特定指令集时执行?

我真的很困惑这在虚拟机中是如何工作的?虚拟机如何将中间指令编译为本机指令,然后将这些本机(asm?)指令存储在内存中,以便在每次调用指令集时执行?

我很想进一步了解这个概念。抱歉,如果我缺乏对低级 VM 设计的理解。我不明白如何将 switch 语句的结果编译成本机编译代码,无论如何在我的例子中 - 不确定 VM 实际上是如何做到的。

将字节码指令简单地宏编译为本机指令序列的效率非常低。 JIT 编译器通常会首先从字节码构建一个中间表示(理想情况下是 SSA 形式),然后应用与独立编译器相同的所有编译技术,只是避免使用最昂贵的技术。将堆栈机器字节码翻译成 SSA 是一种反编译形式,因此寄存器机器字节码可能更有效(但更难生成)。

目前还有另一种方法越来越受欢迎 - tracing JITs,最高层的 JIT 管道做几乎相同的事情,同样,作为一个独立的编译器,但对于一个基本的仅块(通过跟踪生成)。在这种方法中,朴素的宏扩展作为第一层 JIT 是可以接受的。

并且,如果您真的希望能够在不进行任何修改的情况下使用您的 switch 语句,使用一些字节码并将它们都转换为编译代码,您应该查看 partial evaluation 技术(又名超级编译又名第一二村投影)。