19

我正在研究我自己的玩具编程语言。现在我正在解释来自 AST 的源语言,我想知道编译成字节码然后解释它可以为我提供什么优势。

目前,我想到了三件事:

  • 遍历语法树数百次可能比在数组中运行指令要慢,特别是如果数组支持 O(1) 随机访问(即上下跳转 10 条指令)。
  • 在类型化的执行环境中,我有一些运行时成本,因为我的 AST 是类型化的,并且我不断地遍历它(即,我有 10 种类型的节点,我需要检查我现在要执行的类型)。也许编译成无类型的字节码可以帮助改善这一点,因为在类型检查和编译之后,我会有一个无类型的值和代码。
  • 编译成字节码可以提供更好的可移植性。

我的观点正确吗?编译为字节码的其他动机是什么?

4

2 回答 2

11

速度是主要原因;在实践中解释 AST 太慢了。

使用字节码的另一个原因是它可以简单地序列化(存储在磁盘上),以便您可以分发它。这就是 Java 所做的。

于 2012-07-11T13:22:15.203 回答
9

生成字节码(或任何其他“易于解释”的形式,如线程代码)本质上是性能。

为了让 AST 解释器决定下一步做什么,它需要遍历树、检查节点、确定节点类型、检查任何操作数的类型、验证合法性,并决定适用 AST 指定运算符的哪种特殊情况(它说“+”,但它意味着 16 位添加或字符串连接?),在它最终执行一些操作之前。

如果一个人采取最终行动并生成某种易于解释的结构,那么在“执行”时,解释器可以简单地专注于执行操作而无需所有检查/特殊情况确定。

最近的另一个借口是,如果您为许多著名的虚拟机(JVM、MSIL、Parrot 等)中的任何一个生成字节码,您甚至不必为解释器编写代码。对于 JVM 和 MSIL,您还可以获得与它们相关的 JIT 编译器的好处,并且通过精心设计您的语言,与庞大的库兼容,这是 Java 和 C# 的真正吸引力。

于 2012-07-15T22:40:47.760 回答