将 AST 转换为字节码

Converting an AST to bytecode

所以我目前正在为我创建的一种语言(与 Python 非常相似)用 C 编写一个小解释器。我已经编写了词法分析器和解析器,目前我的程序输出一个 AST,现在我正试图将这个 AST 转换为字节码。目前我的算法遍历AST(深度优先),可以生成简单算术的字节码,现在我正在尝试实现if语句。

我无法在此处复制我的所有代码,因为它的代码量相当大,但目前程序采用的 AST 可能看起来像

ADD
|-- 1
|-- MUL
    |-- 2
    |-- 3

然后把它变成

LOAD 1 //the real code doesn't put the value here, but a number representing the position of this value in an array
LOAD 2
LOAD 3
MUL
ADD

这对于简单的表达式来说很容易,但我真的不知道如何为 if 语句生成字节码。我知道如果比较为假,我将不得不跳转到 else 子句,并且还从每个 if/else if 块的末尾跳转,但是如果跳转超过 256 字节,我该如何处理字节码?

你应该阅读 SICP, the Dragon Book, then Lisp In Small Pieces

我希望你能重新设计你的字节码。然后你可以有一些 FARJUMP 字节码,其后是 四个 字节 abcd(被视为每个 8 位的 uint8_t 无符号整数),您将跳转到 (a<<24) + (b<<16) + (c<<8) +d 偏移量。

您可能希望能够前后跳跃。要么有一个 BACKFARJUMP 向后跳转,要么使用一些 signed 偏移...

使用这样的操作码,您将能够跳转到超过 40 亿字节码(正好是 232)。那可能更容易。

如果 40 亿字节码偏移量还不够,您可以泛化。

不要忘记,您的计算机不太可能拥有超过 1 TB 的 RAM(而且这样的计算机比汽车还贵)。