rwa*_*ace 8 interpreter bytecode compilation language-implementation
在设计字节码解释器时,这些天是否有关于堆栈或三种地址格式(或其他什么?)更好的共识?我正在考虑这些考虑因素:
目标语言是一种非常类似于Javascript的动态语言.
性能很重要,但目前开发速度和可移植性更是如此.
因此,实施将严格地作为解释者; 资源许可后,JIT编译器可能会更晚出现.
口译员将用C语言编写.
David Gregg和Roberto Ierusalimschy完成的实验表明,基于寄存器的字节码比基于堆栈的字节码效果更好,因为执行相同任务需要更少的字节码指令(因此解码开销更少).所以三地址格式是一个明显的赢家.
看一下 OCaml 字节码解释器 - 它是同类中最快的之一。它几乎是一个堆栈机,在加载时转换为线程代码(使用 GNU 计算的 goto 扩展)。您也可以生成类似 Forth 的线程代码,应该相对容易做到。
但是,如果您考虑到未来的 JIT 编译,请确保您的堆栈机并不是真正功能齐全的堆栈机,而是表达式树序列化形式(如 .NET CLI) - 这样您就能够将“堆栈”字节码转换为 3 地址形式,然后转换为 SSA。