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

1.1.1 编程语言实现的类型

不论原因是什么,在构建一种编程语言之前,我们都应该选择能找到的最佳工具和技术来完成这项工作。在本书的案例中,我们将对这些工具和技术进行挑选。首先,在构建编程语言的过程中,有一个关于其语言实现的问题。编程语言学者喜欢吹嘘自己用了某种语言编写自己的语言,但这通常只是半真半假(或者有人非常不切实际,同时又在炫耀自己)。还有一个问题是要构建什么样的编程语言实现:

❑执行源代码本身的纯解释器

本机编译器和运行时系统,例如在C语言中。

❑将编程语言翻译成其他高级语言的转译器

❑带有字节码机器的字节码编译器,例如Java。

第一个选项很有趣,但通常太慢;第二个选项是最好的,但通常太费力了,一个好的本机编译器可能需要很多人多年的努力。

虽然第三个选项是迄今为止最简单、可能也是最有趣的,并且我以前也成功地使用过它,然而如果这不是一个原型,那么这就是骗人的。当然,C++的第一个版本是一个转译器,但这让路给了编译器,而不仅仅是因为它有缺陷。奇怪的是,生成高级代码似乎使你的语言比其他选项更依赖于底层语言,而且语言是移动的目标。好的语言之所以消亡,是因为对其潜在的依赖性消失了,或者已对其造成了无法修复的损坏,这也许是大量小修改不断累积造成的。

本书选择了第四个选项:我们将构建一个附带一个字节码机器的字节码编译器,因为这是一种最佳选择,它在提供最大灵活性的同时仍提供了相当不错的性能。本章将介绍本机代码编译,适用于那些需要最快执行速度的用户。

字节码机器的概念非常古老,它因UCSD的Pascal实现和经典的SmallTalk-80实现等而闻名。随着Java的JVM的发布,它变得无处不在,甚至可以成为普通的英语词汇。字节码机器是由软件解释的抽象处理器,通常称为虚拟机(如Java虚拟机),而我不会使用这个术语,因为它有时也指使用真实硬件指令集的软件工具,例如,IBM的经典平台或更现代的工具,如Virtual Box

字节码机器通常比一块硬件高出一点,因此字节码的实现提供了很大的灵活性,我们下面快速了解一下字节码。