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

1.1.3 示例中使用的语言

本书使用并行翻译模型同时提供两种编程语言的代码示例。第一种示例语言是Java,因为这种语言无处不在。希望读者已了解Java或C++语言,并能够以中等熟练程度阅读示例。第二种示例语言是作者自己的编程语言Unicon。在阅读本书时,读者可以自己判断哪种语言更适合构建自己的编程语言。本书将以这两种语言提供尽可能多的示例,并且两种语言的示例将尽可能类似地编写,这样做有时对较小的语言有利。

Java和Unicon之间的差异是显而易见的,但我们要使用的编译器构建工具在一定程度上降低了这种差异的重要性。我们将使用久负盛名的Lex和YACC的最新衍生工具来生成扫描器和解析器。通过坚持使用与原始Lex和YACC尽可能兼容的Java和Unicon工具,我们的编译器的前端在两种语言中几乎相同。Lex和YACC是声明性编程语言,它们在比Java或Unicon更高的级别上解决了一些难题。

当使用Java和Unicon作为实现语言时,我们还需要讨论另外一种语言,即我们正在构建的示例语言。它是我们决定要构建的编程语言的一种替代。出于某种随意性,我将为此引入一种称为Jzero的语言。Niklaus Wirth发明了一种称为PL/0的“玩具”语言(编程语言zero,该名称是PL/1语言名称的一个翻版),用于编译器构造课程。Jzero是Java的一个很小的子集,用于类似的目的。我进行了非常仔细的查找(也就是说,我搜索了Jzero,然后搜索了Jzero编译器),想看看是否有人已经发布了一个我们可以使用的Jzero定义,但我没有找到一个同名的定义,所以我们会在工作过程中进行弥补。

本书中的Java示例将使用OpenJDK 14进行测试。也许其他版本的Java(如OpenJDK 12或Oracle Java JDK)也会同样工作,也可能不会。可以从http://openjdk.java.net网站获得OpenJDK。或者,如果在Linux操作系统上,则可能有一个可以安装的OpenJDK包。Java示例所需的其他编程语言构造工具(JFlex和BYACC/J)将在后续章节中介绍。我们支持的Java实现可能更受运行这些语言构造工具的版本的限制。

本书中的Unicon示例使用Unicon版本13.2,可从http://unicon.org中获得。要在Windows上安装Unicon,必须下载.msi文件并运行安装程序。要在Linux上安装,通常要对源代码做git克隆,然后输入make,还要把unicon/bin目录添加到PATH中,如下所示:

在了解了本书如何组织和要使用的实现语言之后,也许我们应该再看看什么时候需要设计编程语言,什么时候可以通过开发库来避免另外设计编程语言。