我已经在(GNU)C中为简单的基于堆栈的VM编写了字节码解释器。所有VM指令均实现为标签之间的代码。大多数指令不使用内联参数,因为它们只是将其从VM堆栈中弹出(例如add
从堆栈中弹出两个数字a
,b
并重新推入a+b
)
我认为JIT就像识别字节码中的基本块一样简单,只需通过memcpy
将标签之间的标签插入使用{{1}标记为可执行文件的缓冲区中,即可将指令实现缝合在一起,从而生成“动态超级指令” } / mmap
。这对除mprotect
指令以外的所有指令均有效,该指令将字节码流的下一个字节推入VM堆栈(例如push b
)。
有没有至少某种可移植的方式来实现以类似方式使用参数的指令,方法是将参数“注入”到push 17
指令的每个实例中(因此在运行时伪造关闭(?)),或者至少通过某种方式使用setjmp / longjmp的某些变体访问正在运行的实例的PC(尽管提及PC可能固有地不是可移植的)我读了PC值吗?
编辑:通过在伪C(???)中执行以下操作,PC可能会很有用
push
也许这样会更现实?
memcpy