字节码堆栈与三个地址

rwa*_*ace 8 interpreter bytecode compilation language-implementation

在设计字节码解释器时,这些天是否有关于堆栈或三种地址格式(或其他什么?)更好的共识?我正在考虑这些考虑因素:

  1. 目标语言是一种非常类似于Javascript的动态语言.

  2. 性能很重要,但目前开发速度和可移植性更是如此.

  3. 因此,实施将严格地作为解释者; 资源许可后,JIT编译器可能会更晚出现.

  4. 口译员将用C语言编写.

lhf*_*lhf 7

阅读Lua的演变Lua 5.0的实现,了解Lua如何从基于堆栈的虚拟机转变为基于寄存器的虚拟机,以及为什么它获得了性能.


Nor*_*sey 5

David Gregg和Roberto Ierusalimschy完成的实验表明,基于寄存器的字节码比基于堆栈的字节码效果更好,因为执行相同任务需要更少的字节码指令(因此解码开销更少).所以三地址格式是一个明显的赢家.


SK-*_*gic 0

看一下 OCaml 字节码解释器 - 它是同类中最快的之一。它几乎是一个堆栈机,在加载时转换为线程代码(使用 GNU 计算的 goto 扩展)。您也可以生成类似 Forth 的线程代码,应该相对容易做到。

但是,如果您考虑到未来的 JIT 编译,请确保您的堆栈机并不是真正功能齐全的堆栈机,而是表达式树序列化形式(如 .NET CLI) - 这样您就能够将“堆栈”字节码转换为 3 地址形式,然后转换为 SSA。