自己动手构建编程语言:如何设计编译器、解释器和DSL
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.2 组织字节码语言实现

在很大程度上,本书的结构遵循字节码编译器及其相应虚拟机的经典组织结构。这些组件定义如下,图1.1进行了总结:

图1.1 简单编程语言中的各阶段和数据流

词法分析器(lexical analyzer)读入源代码字符并计算出它们是如何组合成一系列单词或标记的。

语法分析器(syntax analyzer)读入一系列标记,并根据语言的文法判断该序列是否合法。如果标记的顺序是合法的,则会生成一个语法树。

语义分析器(semantic analyzer)检查并确保所有正在使用的名称对于正使用它们的操作都是合法的。它检查它们的类型,以精准确认正在执行的操作。所有这些检查都会让语法树变得繁重,充满了关于变量声明位置和类型的额外信息。

中间代码生成器(intermediate code generator)计算出所有变量的内存位置以及程序可能突然改变执行流程的所有位置,例如循环和函数调用。中间代码生成器将这些位置添加到语法树中,然后在构建与机器无关的中间代码指令列表之前遍历这棵更大的树。

最终代码生成器(final code generator)将中间代码指令列表转换为文件格式的实际字节码,这样可以有效地加载和执行。

在这个字节码虚拟机编译器的步骤之外,可以编写一个字节码解释器(bytecode interpreter)来加载和执行程序。这是一个包含switch语句的巨大循环,但对于外来编程语言来说,编译器可能没什么大不了的,所有的魔法都将发生在字节码解释器中,整个组织可以通过图1.1进行总结。

说明如何构建编程语言的字节码机器实现将需要大量代码。代码的呈现方式很重要,它将告诉我们需要了解的内容,以及我们可能会从本书中学到的许多内容。