跳转到内容

编译器构造/关于本书

来自维基教科书,开放世界中的开放书籍

本书旨在为编写编译器提供实用的建议,并提供一些编译器和解释器的实际示例,以打破构建编译器和解释器是不可能的任务的观念。

有关该主题的基本信息,请查看本书的参考文献外部链接部分,以及词汇表中相关的维基百科文章。

理论不可避免,但已将其减至最少。如果您在网上搜索“编译器构造”,您会发现大量的信息和许多不同的方法。本书所能做的就是演示构建编译器的许多可能方法中的几种。阅读完本书后,您应该能够更好地评估其他方法。

这是一个维基。读者,请贡献:纠正拼写错误,改写句子,扩展段落,添加部分,编写完整的章节。

本书的编写符合几个目标。本书必须是

  • 有用且实用 - 我们有几本优秀的编译器书籍,尤其是龙书。然而,虽然扫描器或语法分析器的技术已经得到很好的发展和了解,但我们认为需要一本涵盖脚本语言或使用字节码进行复杂的动态编译的书籍。
  • 非平凡 - 这与第一个目标有关。
  • 提供对面向对象语言的良好覆盖 -
  • 有大量的参考资料 -
  • 更新 - 在线教科书的一个优势是它可以更新以涵盖新的语言或实现技术。

我们希望这本书能帮助您创建一个编译器或任何使用编译器技术的工具。

如果您不熟悉编译器中的术语或基本概念,您应该阅读介绍章节,因为本书的其余部分将假设其作为背景信息。

适当的背景

要充分利用本书,您的背景/经验/能力应包括以下大多数内容

  • 熟悉基本的计算机体系结构、组件和执行模型。
  • 在一两种(最好是多种)高级编程语言中拥有多年的经验。
  • 能够处理包含数千行源代码的程序。
  • 您不需要任何特定的数学背景,尽管对简单代数有所了解可能会有所帮助。
  • 编程需要能够精确地关注细节的逻辑思维。
  • 准备好学习各种计算机科学概念。特别是,您应该能够理解本章第 6 节中描述的 EBNF。其他概念将在需要时介绍,例如堆栈、递归。
  • 准备好学习简单的汇编语言以及计算机体系结构寻址模式的各个方面。

即使您没有上述背景,您仍然应该能够通过阅读文本获得一些想法。

您可能能够实现本书中提供的一些或所有程序。如果您具有一些高级编程经验,您还应该能够扩展解释器功能。

实现软件

由于这是一本免费提供的书籍,因此使用一些免费提供的实现语言似乎很合适。

我选择使用 C++ 的一个子集,并结合 GNU GCC 编译器。该子集大致对应于将 C++ 作为更好的 C 来使用,包括使用标准 C++ 库,但不涉及 C++ 的面向对象方面。如果您使用 GNU/Linux,那么此编译器将/应该已经可供您使用。否则,您需要在万维网上搜索适用于您系统的免费版本。

如果您使用 Microsoft Windows,那么您可能想考虑 Code::Blocks,这是一个免费的 IDE(集成开发环境),带有 MinGW 编译器(GCC 的移植版本),可从 www.codeblocks.org 获得。

简化源语言

为了降低本书的复杂性,我们将对我们为其编写编译器的源语言做出一些简化假设

  1. 源语言不允许嵌套子例程声明。
  2. 所有标识符必须在使用前声明。
  3. 源语言的语法分析可以在一次传递中完成。
  4. 在语法分析期间,我们只需要查看下一个源代码标记来决定下一步该怎么做。

在后面的章节中,我们将更多地考虑放宽这些假设的影响。

在实践中,这些假设意味着源语言很容易使用简单技术进行翻译,并且消除了一些运行时复杂性。

  • 第一个假设排除了 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 赋值
需要处理整个语句的语言结构

最后两行之间的区别据报道导致了一颗价值数百万美元的太空探测器丢失。

下一个 - 介绍编译器和解释器

[编辑 | 编辑源代码]
此页面应包含在编译器构造书籍的任何副本中。
任何包含的源代码,如果未带有不同的声明,应被视为公有领域。
所使用的图片具有自己的版权状态,具体说明在各自的存储库(en.wikibooks.org 或 commons.wikimedia.org)中。
特别贡献
  • Murray Langton 对明显被废弃的书籍进行了完整的重组。
  • TakuyaMurata;我偶尔会添加一些内容。我相信,虽然完成这本书可能需要数年时间,但我们仍然可以制作出对那些对编译器感兴趣的人有用的作品。
  • psanand 只要有时间,就喜欢为它贡献一些东西
华夏公益教科书