我用 C 语言编写了一个虚拟机,它对于非 JIT 虚拟机具有不错的性能,但我想学习一些新东西并提高性能。我当前的实现只是使用一个开关将 VM 字节码转换为指令,然后编译为跳转表。就像我说的那样,性能不错,但我遇到了只能通过 JIT 编译器克服的障碍。
不久前我已经问过一个关于自修改代码的类似问题,但我意识到我没有问对正确的问题。
所以我的目标是为这个 C 虚拟机写一个 JIT 编译器,我想用 x86 汇编来做。(我使用 NASM 作为我的汇编程序)我不太确定如何去做。我对汇编很满意,并且查看了一些自修改代码示例,但我还没有弄清楚如何进行代码生成。
到目前为止,我的主要工作是将指令复制到可执行内存中,并带有我的参数。我知道我可以在 NASM 中标记某行,并使用静态参数从该地址复制整行,但这不是很动态,并且不适用于 JIT 编译器。我需要能够解释来自字节码的指令,将其复制到可执行内存,解释第一个参数,将其复制到内存,然后解释第二个参数,并将其复制到内存。
我被告知有几个库可以使这项任务变得更容易,例如 GNU Lightning,甚至 LLVM。但是,在使用外部资源之前,我想先手动编写它,以了解它是如何工作的。
该社区是否可以提供任何资源或示例来帮助我开始执行此任务?一个简单的例子展示了两个或三个指令,如“add”和“mov”,用于在内存中动态生成可执行代码,并带有参数,会产生奇迹。