将 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
字节码,其后是 四个 字节 a
、b
、c
、d
(被视为每个 8 位的 uint8_t
无符号整数),您将跳转到 (a<<24) + (b<<16) + (c<<8) +d
偏移量。
您可能希望能够前后跳跃。要么有一个 BACKFARJUMP
向后跳转,要么使用一些 signed 偏移...
使用这样的操作码,您将能够跳转到超过 40 亿字节码(正好是 232)。那可能更容易。
如果 40 亿字节码偏移量还不够,您可以泛化。
不要忘记,您的计算机不太可能拥有超过 1 TB 的 RAM(而且这样的计算机比汽车还贵)。
所以我目前正在为我创建的一种语言(与 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
字节码,其后是 四个 字节 a
、b
、c
、d
(被视为每个 8 位的 uint8_t
无符号整数),您将跳转到 (a<<24) + (b<<16) + (c<<8) +d
偏移量。
您可能希望能够前后跳跃。要么有一个 BACKFARJUMP
向后跳转,要么使用一些 signed 偏移...
使用这样的操作码,您将能够跳转到超过 40 亿字节码(正好是 232)。那可能更容易。
如果 40 亿字节码偏移量还不够,您可以泛化。
不要忘记,您的计算机不太可能拥有超过 1 TB 的 RAM(而且这样的计算机比汽车还贵)。