内容简介
本书是作者多年来在编译器领域中钻研、教学的成果,并以在该学科领域与学生的交流以及他们的反馈和研究作为依据。本书全面介绍了编译器设计中的原理和技术,阐述了编译领域中的难点,并详细描述了编译器设计的各个阶段。 因为编译器的设计过程是将自动机理论、数据结构、算法、计算机体系结构和操作系统等领域知识进行综合的过程,所以编译器设计者必须要有较好的计算机科学理论的背景。本书详细描述了各种类型的解析器,从最简单的递归下降和LL解析器到复杂的LR、规范LR和LALR解析器,尤其强调了LR解析器。 本书主要用于计算机科学专业的本科生和研究生一个学期的教材,该书也可供专业人员作为参考书。
本书源于笔者多年来对编译器的学习和教学经验,并以在该学科领域与学生的交流以及他们的反馈和研究作为依据。编译器的设计过程是将自动机理论、数据结构、算法、计算机体系机构和操作系统等领域知识进行综合的过程。编译器设计者必须要有较好的计算机科学理论的背景。同时,还应能掌握各种可用的软硬件平台。因此,任何编译器的书籍都应强调这些领域的作用,并向读者介绍编译领域中的难点和技术。同时,书籍应足够精炼,以便能在一个学期内完成课程。另外,还需要介绍编译器设计中各种可用的工具。本书涵盖了编译器中所有应掌握的主题,一共分为9章。 第1章介绍了编译器及其应用,并着重介绍了大量的应用领域,以使读者能理解该领域的范围。然后介绍了编译器的各个阶段,列举了各个阶段的任务。依据机器中软/硬件的功能和用户的需求,详细介绍了编译器设计的难点。本章以一个示例结束。 第2章展示了编译器中词法分析阶段的理论和设计。在介绍完正式的表示法如正则表达式、非确定和确定的有限自动机后,本书详细描述了使用正则表达式开始表示语言中单词规范的方式,并依据正则表达式构造识别器来标识输入流中语言的合法单词。最后,介绍了轻松生成词法分析器的自动化工具—— Lex。 第3章介绍了语法分析。首先明确了在指定的语言中文法的作用、文法的符号约定以及相关定义。本章详细描述了各种不同类型的解析器,首先介绍了最简单的自上而下分析,如递归下降和LL。然后介绍了先进的自下而上分析,如LR、规范LR和LALR。因为大多数编译器使用LR解析器,所以主要强调了LR分析,并介绍了工具yacc,用于自动生成LALR解析器。本章最后介绍了使用解析器来执行输入流的各种语法制导翻译的方式。 第4章介绍了类型检查,并介绍了类型检查的相关问题,以及使用这些理论检查类型等价的方式。最后介绍了类型转换,用于展示编译器自动推断必要的类型转换的方式。 第5章介绍了编译器中符号表的用法。根据语言的作用域规则,介绍了各种不同的数据结构来存储标识符,因此,编译器能有效地使用这些信息。 第6章介绍了编译器在程序执行时维持运行环境的职责,然后介绍了活动记录,并展示了使用不同而有效的数据结构维护活动记录的方式。 第7章详细介绍了中间代码的生成。这是编译器中的可选阶段,有助于将代码重定向到不同的体系结构中。首先介绍中间代码不同的表现方式,然后使用语法制导模式将常用的编程语言结构翻译成中间代码的形式。 第8章列举了目标代码的生成技术。在讨论完影响代码生成的因素后,介绍了使用基本的代码块表示中间语言程序的方式,然后从基本的代码块生成目标代码。同时也讨论了寄存器分配、缓存管理的问题及相应的解决策略。 第9章是代码优化阶段。在讨论完优化阶段必要且相关的问题后,介绍了优化的分类。然后介绍了不同的优化变换,如编译时计算、公共子表达式消除等。接下来介绍了全局优化和数据流问题。最后根据建立和求解数据流等式的技术解决一些数据流问题。 本书提供了编译器设计领域中的所有要点,适合作为本科生一个学期的学习内容。如果能有效地使用本书,将会得到很大的收获。同时欢迎读者给出任何对内容有改进的建设性意见。 Santanu Chattopadhyay