用Go语言自制编译器
上QQ阅读APP看书,第一时间看更新

第2章 你好,字节码!

本章的目标是完成编译并执行以下Monkey表达式:

1 + 2

这听起来并不是一个远大的目标,但为了实现它,我们不得不学习许多新知识,并构建将在后续章节中使用的大量基础架构。选择简单的表达式1 + 2,是为了避免因Monkey代码本身及其工作原理分心,从而专注于实现编译器和虚拟机。

本章结束后,我们的编译器应该具备以下技能。

  • 能够接受Monkey表达式1 + 2作为输入。
  • 利用已有的包lexertokenparser对表达式进行标记和语法分析。
  • 生成AST,其节点定义在ast包中。
  • 将AST作为输入,并将其编译成字节码。
  • 将字节码作为新构建虚拟机的输入,并由虚拟机执行。
  • 确保虚拟机输出结果3

1 + 2表达式将贯穿新系统的所有主要部分,如图2-1所示。

图 2-1

对于数据结构来说,在最终输出结果3之前,你会看到多次数据结构转换,如图2-2所示。

图 2-2

由于可以复用上一本书中构建的多个包,因此我们已经能够处理AST之前的所有内容。在这之后,我们将进入未知领域。我们需要定义字节码指令,并构建编译器和虚拟机——只是为了将1 + 2变成3。有没有被吓到?不用担心,我们将像往常一样,一步一步地从字节码开始构建。