8

在设计字节码解释器时,这些天是否就堆栈或三地址格式(或其他什么?)更好?我正在考虑这些考虑:

  1. 目标语言是一种与 Javascript 非常相似的动态语言。

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

  3. 因此,实现暂时将是严格的解释器;JIT 编译器可能会在资源允许的情况下稍后出现。

  4. 解释器将用 C 语言编写。

4

5 回答 5

7

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

于 2011-06-16T01:42:39.837 回答
5

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

于 2011-07-14T00:43:45.907 回答
1

我在这方面没有太多(不是真的)经验,所以您可能想自己验证以下一些内容(或者其他人可以在必要时纠正我?)。

我现在最常使用的两种语言是 C# 和 Java,所以我自然倾向于他们的方法。大多数人都知道,两者都编译为字节码,并且两个平台(CLR 和 JVM)都使用 JIT(至少在主流实现中)。另外,我猜每个平台的抖动都是用 C/C++ 编写的,但我真的不确定。

总而言之,这些语言及其各自的平台与您的情况非常相似(除了动态部分,但我不确定这是否重要)。此外,由于它们是这样的主流语言,我相信它们的实现可以作为您设计的一个很好的指南。


除此之外,我确信 CLR 和 JVM 都是基于堆栈的体系结构。我记得基于堆栈与基于寄存器的一些优点是

  1. 生成的代码更小
  2. 更简单的解释器
  3. 更简单的编译器
  4. 等等

此外,我发现基于堆栈更直观和可读,但这是一个主观的事情,就像我之前说的,我还没有看到太多的字节码。

基于寄存器的架构的一些优点是

  1. 必须执行的指令更少
  2. 更快的口译员(从#1开始)
  3. 可以更容易地转换为机器代码,因为大多数常见的硬件都是基于寄存器的
  4. 等等

当然,总有一些方法可以抵消每种方法的缺点,但我认为这些描述了要考虑的显而易见的事情。

于 2011-06-16T05:43:26.360 回答
0

如果您有 JIT 的想法,那么字节码是唯一的选择。

以防万一您可以查看我的 TIScript: http: //www.codeproject.com/KB/recipes/TIScript.aspx 和来源:http ://code.google.com/p/tiscript/

于 2011-06-16T00:56:37.920 回答
0

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

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

于 2011-06-16T11:08:54.710 回答