编译器构造/关于本书
本书旨在为编写编译器提供实用的建议,并提供一些编译器和解释器的实际示例,以打破构建编译器和解释器是不可能的任务的观念。
有关该主题的基本信息,请查看本书的参考文献或外部链接部分,以及词汇表中相关的维基百科文章。
理论不可避免,但已将其减至最少。如果您在网上搜索“编译器构造”,您会发现大量的信息和许多不同的方法。本书所能做的就是演示构建编译器的许多可能方法中的几种。阅读完本书后,您应该能够更好地评估其他方法。
这是一个维基。读者,请贡献:纠正拼写错误,改写句子,扩展段落,添加部分,编写完整的章节。
本书的编写符合几个目标。本书必须是
- 有用且实用 - 我们有几本优秀的编译器书籍,尤其是龙书。然而,虽然扫描器或语法分析器的技术已经得到很好的发展和了解,但我们认为需要一本涵盖脚本语言或使用字节码进行复杂的动态编译的书籍。
- 非平凡 - 这与第一个目标有关。
- 提供对面向对象语言的良好覆盖 -
- 有大量的参考资料 -
- 更新 - 在线教科书的一个优势是它可以更新以涵盖新的语言或实现技术。
我们希望这本书能帮助您创建一个编译器或任何使用编译器技术的工具。
如果您不熟悉编译器中的术语或基本概念,您应该阅读介绍章节,因为本书的其余部分将假设其作为背景信息。
- 适当的背景
要充分利用本书,您的背景/经验/能力应包括以下大多数内容
- 熟悉基本的计算机体系结构、组件和执行模型。
- 在一两种(最好是多种)高级编程语言中拥有多年的经验。
- 能够处理包含数千行源代码的程序。
- 您不需要任何特定的数学背景,尽管对简单代数有所了解可能会有所帮助。
- 编程需要能够精确地关注细节的逻辑思维。
- 准备好学习各种计算机科学概念。特别是,您应该能够理解本章第 6 节中描述的 EBNF。其他概念将在需要时介绍,例如堆栈、递归。
- 准备好学习简单的汇编语言以及计算机体系结构和寻址模式的各个方面。
即使您没有上述背景,您仍然应该能够通过阅读文本获得一些想法。
您可能能够实现本书中提供的一些或所有程序。如果您具有一些高级编程经验,您还应该能够扩展解释器功能。
- 实现软件
由于这是一本免费提供的书籍,因此使用一些免费提供的实现语言似乎很合适。
我选择使用 C++ 的一个子集,并结合 GNU GCC 编译器。该子集大致对应于将 C++ 作为更好的 C 来使用,包括使用标准 C++ 库,但不涉及 C++ 的面向对象方面。如果您使用 GNU/Linux,那么此编译器将/应该已经可供您使用。否则,您需要在万维网上搜索适用于您系统的免费版本。
如果您使用 Microsoft Windows,那么您可能想考虑 Code::Blocks,这是一个免费的 IDE(集成开发环境),带有 MinGW 编译器(GCC 的移植版本),可从 www.codeblocks.org 获得。
- 简化源语言
为了降低本书的复杂性,我们将对我们为其编写编译器的源语言做出一些简化假设
- 源语言不允许嵌套子例程声明。
- 所有标识符必须在使用前声明。
- 源语言的语法分析可以在一次传递中完成。
- 在语法分析期间,我们只需要查看下一个源代码标记来决定下一步该怎么做。
在后面的章节中,我们将更多地考虑放宽这些假设的影响。
在实践中,这些假设意味着源语言很容易使用简单技术进行翻译,并且消除了一些运行时复杂性。
- 第一个假设排除了 Algol 60 和 Pascal。
- 第二个假设允许单遍编译。
- 第三个假设排除了 Algol 68;根据 Hunter 的说法,语法分析可能需要多达 4 个遍。
- 第二个和第四个假设排除了 Fortran;以下都是有效的 Fortran 语句,但您甚至无法在查看语句的末尾或附近之前确定每种语句的类型(在 Fortran 中,空格不重要,变量不需要声明,并且没有保留关键字)。
Fortran 源代码 | 语义 |
---|---|
IF (expression) GO TO 567
|
条件跳转 |
IF (expression) GO TO = 2.71
|
条件赋值 |
IF (expression) 123,234
|
双向分支:假,真 |
IF (expression) 123,234,345
|
三向分支:<0, =0, >0 |
IF (expression) THEN
|
这实际上启动了一个多行 IF |
IF (expression) THEN = 3.14
|
条件赋值 |
IF (expression) = 36
|
对数组元素赋值 |
DO 10 I = 1,5
|
启动一个循环 |
DO 10 I = 1.5
|
对变量 DO10I 赋值 |
最后两行之间的区别据报道导致了一颗价值数百万美元的太空探测器丢失。
|
本作品采用知识共享 署名-相同方式共享 3.0 未移植版 许可证。简而言之:您可以在以下条件下自由分享和制作本作品的衍生作品:您应适当地署名,并且您只应在相同、类似或兼容的许可证下分发。如果您获得版权持有人的许可,上述任何条件都可以免除。 |
- 特别贡献
- Murray Langton 对明显被废弃的书籍进行了完整的重组。
- TakuyaMurata;我偶尔会添加一些内容。我相信,虽然完成这本书可能需要数年时间,但我们仍然可以制作出对那些对编译器感兴趣的人有用的作品。
- psanand 只要有时间,就喜欢为它贡献一些东西