本书介绍程序设计语言编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。为计算机科学和技术专业的本科生提供教材。
尽管"编译程序"是特指将高级程序设计语言翻译成低级语言的软件,但编译程序构造的基本原理和技术也广泛应用于一般软件的设计和实现,因此本书也是从事系统软件和软件工具研究及开发者的参考书。
几年来的教学实践证明,本教材第一版的内容和架构都不错,受到广大读者的欢迎,且被一些院校选用,目前已出版20余万册。随着嵌入式系统的迅速发展和高性能体系结构的推陈出新,对支持多源语言多目标机的编译技术的研究显得尤为重要,同时,面向对象技术的兴起与广泛使用也对传统的编译技术提出了新的挑战和要求,这些发展变化应在教材中有所体现。本书在第一版的基础上,修改和添加了相应章节。首先从剖析一个简单的编译程序(PL/o)人手,对编译程序设计的基本理论,如有穷自动机、上下文无关文法等给予必要的介绍;对于广泛使用的语法分析方法和语义分析技术,如递归子程序法、算符优先分析、LR分析及语法制导翻译等进行了详细的讲解;对编译程序的结构及其各部分功能、实现方法以及整体的设计考虑等给予了描述;还介绍了编译程序的构造技术,包括可重定向编译器的开发方法;此外,讨论了面向对象语言的编译技术以及利用面向对象方法构造编译程序的基本思想。并在附录中给出了PL/o的编译程序文本(包括C和Pascal两种语言文本)。
本书的第1章、第3章、第4章、第8章、第10章和第11章由张素琴编写,第2章、第5章至第7章由吕映之编写,第9章、第14章和第15章由蒋维杜编写,第12章和第13章由戴桂兰编写。另外,感谢蔡锐提供了PL/0编译程序的C版本。
书中若有不妥之处,请读者批评指正。
目录
- 第1章 引论
- 1.1 什么是编译程序
- 1.2 编译过程和编译程序的结构
- 1.2.1 编译过程概述
- 1.2.2 编译程序的结构
- 1.2.3 编译阶段的组合
- 1.3 解释程序和一些软件工具
- 1.3.1 解释程序
- 1.3.2 处理源程序的软件工具
- 1.4 程序设计语言范型
- 练习第2章 PL/0编程程序的实现
- 2.1 PL/0语言描述
- 2.1.1 PL/0语言的语汉描述图
- 2.1.2 PL/0语言文法的EBNF表示
- 2.2 PL/0编译程序的结构
- 2.3 PL/0编译程序的词法分析
- 2.4 PL/0编译程序的语法语义分析
- 2.5 PL/0编译程序的目标代码结构和代码生成
- 2.6 PL/0编译程序的语法错误处理
- 2.7 PL/0编译程序的目标代码解释执行时的存储分配
- 练习第3章 文法和语言
- 3.1 文法的直观概念
- 3.2 符号和符号串
- 3.3 文法和语言的形式定义
- 3.4 文法的类型
- 3.5 上下文无关文法及其语法树
- 3.6 句型的分析
- 3.6.1 自上而下的分析方法
- 3.6.2 自下而上的分析方法
- 3.6.3 句型分析的有关问题
- 3.7 有关文法实用中的一些说明
- 3.7.1 有关文法的实用限制
- 3.7.2 上下文无关文法中的规则
- 3.8 典型例题解答
- 练习第4章 词法分析
- 4.1 词法分析程序的设计
- 4.1.1 词法分析程序与语法分析程序的接口方式
- 4.1.2 词法分析程序的输出
- 4.1.3 将词法分析工作分离的考虑
- 4.2 单词的描述工具
- 4.2.1 正规文法
- 4.2.2 正规式
- 4.2.3 正规文法和正规式的等性
- 4.3 有穷自动机
- 4.3.1 确定的有穷自动机(DFA)
- 4.3.2 不确定的有穷自动机(NFA)
- 4.3.3 NFA转换为等价的DFA
- 4.3.4 确定有穷自动机的化简
- 4.4 正规式和有穷自动机的等价性
- 4.5 正规文法和有穷自动机的等价性
- 4.6 词法分析程序的自动构造工具
- 4.7 典型例题及解答
- 练习第5章 自顶向下语法分析方法
- 5.1 确定的自顶向下分析思想
- 5.2 LL(1)文法的判别
- 5.3 某些非LL(1)文法到LL(1)文法的等价变换
- 5.4 不确定的自顶向下分析思想
- 5.5 确定的自顶向下分析方法
- 5.5.1 递归子程序法
- 5.5.2 预测分析方法
- 5.6 典型例题及解答
- 练习第6章 自底向上优先分析
- 6.1 自底向上优先分析概述
- 6.2 简单优先分析法
- 6.2.1 优先关系
- 6.2.2 简单优先文法的定义
- 6.2.3 简单优先分析法的操作步骤
- 6.3 算符优先分析法
- 6.3.1 直观算符优先分析法
- 6.3.2 算符优先文法的定义
- 6.3.3 算符优先关系表的构造
- 6.3.4 算符优先分析算法
- 6.3.5 优先函数
- 6.3.6 算符优先分析法的局限性
- 6.4 典型例题及解答
- 练习第7章 LR分析
- 7.1 LR分析概述
- 7.2 LR(0)分析
- 7.2.1 可归前缀和子前缀
- 7.2.2 识别活前缀的有限自动机
- 7.2.3 活前缀及其可归前缀的一般计算方法
- 7.2.4 LR(0)项目集规范族的构造
- 7.3 SLR(1)分析
- 7.4 LR(1)分析
- 7.4.1 LR(1)项目集族的构造
- 7.4.2 LR(1)分析表的构造
- 7.5 LALR(1)分析
- 7.6 二义性文法在LR分析中的应用
- 7.7 语法分析程序的自动构造工具YACC
- 7.8 典型例题及解答
- 练习第8章 语法制导翻译和中间代码生成
- 8.1 属性文法
- 8.2 语法制导翻译概论
- 8.2.1 计算语义规则
- 8.2.2 S-属性方法和自下而上翻译
- 8.2.3 L-属性文法在自上而下分析中的实现
- 8.2.4 L-属性文法在自下而上分析中的实现
- 8.3 中间代码的形式
- 8.3.1 逆波壮大记号
- 8.3.2 三元式和树表表示
- 8.3.3 四元式
- 8.4 简单赋值语句的翻译
- 8.5 布尔表达式的翻译
- 8.5.1 布尔表达式的翻译方法
- 8.5.2 控制语句中布尔表达式的翻译
- 8.6 控制结构的翻译
- 8.6.1 条件转移
- 8.6.2 开关语句
- 8.6.3 for循环语句
- 8.6.4 出口语句
- 8.6.5 goto语句
- 8.6.6 过程调用的四元式产生
- 8.7 说明语句的翻译
- 8.7.1 简单说明语句的翻译
- 8.7.2 过程中的说明
- 8.8 数组和结构的翻译
- 8.8.1 数组说明和数组元素的引用
- 8.8.2 结构(记录)说明和引用的翻译
- 练习
- 第9章 符号表
- 9.1 符号表的作用和地位
- 9.2 符号的主要属性及作用
- 9.3 符号表的组织
- 9.3.1 符号表的总体组织
- 9.3.2 符号表项的排列
- 9.3.3 关键字域的组织
- 9.3.4 其他域的组织
- 9.3.5 下堆链域的组织
- 9.4 符号表的管理
- 9.4.1 符号表的初始化
- 9.4.2 符号的登录
- 9.4.3 符号的查找
- 9.4.4 符号表的分程序结构层次的管理
- 第10章 目标程序运行时的存储组织
- 10.1 数据空间的三种不同使用方法和管理方法
- 10.1.1 静态存储分配
- 10.1.2 动态存储分配
- 10.1.3 栈式动态存储分配
- 10.1.4 堆式动态存储分配
- 10.2 栈式存储分配的实现
- 10.2.1 简单的栈式存储分配的实现
- 10.2.2 嵌套过程语言的栈式实现
- 10.2.3 分程序结构的存储管理
- 10.3 参数传递
- 10.3.1 传值
- 10.3.2 传地址
- 10.3.3 过程参数
- 10.4 过程调用、过程进入和过程返回
- 练习
- 第11章 代码优化
- 11.1 优化技术简介
- 11.2 局部优化
- 11.2.1 基本块的划分
- 11.2.2 基本块的变换
- 11.2.3 基本块的有向图DAG(Directed Acyclic Graph)表示
- 11.2.4 DAG的应用
- 11.3 控制流分析和循环优化
- 11.3.1 程序流图
- 11.3.2 循环的查找
- 11.3.3 循环优化
- 11.4 数据流的分析与全局优化
- 11.4.1 一些主要的概念
- 11.4.2 数据流言程的一般形式
- 11.4.3 到达-定值数据流方程
- 11.4.4 可用表达式及其数据流方程
- 11.4.5 活跃变量数据流方程
- 11.4.6 复写传播
- 练习
- 第12章 代码生成
- 12.1 代码生成概述
- 12.1.1 代码生成程序在编译系统中的位置
- 12.1.2 设计代码生成程序的基本问题
- 12.2 一个简单的代码生成程序
- 12.2.1 计算机模型
- 12.2.2 待用信息链表法
- 12.2.3 代码生成算法
- 12.3 几种常用的代码生成程序的开发方法
- 12.3.1 解释性代码生成法
- 12.3.2 模式匹配代码生成法
- 12.3.3 表驱动代码生成法
- 12.4 全局寄存器分配(图着色法)
- 12.4.1 概述
- 12.4.2 图着色寄存器分配法的相关技术
- 12.4.3 示例
- 12.5 代码生成程序的自动化构造
- 12.5.1 模式匹配与动态规划
- 12.5.2 基于语法制导的代码生成程序自动构造技术
- 12.5.3 基于语义制导的代码生成程序自动构造技术
- 练习
- 第13章 编译程序的构造
- 13.1 编译程序的书写
- 13.1.1 编译程序的书写语言与T型图
- 13.1.2 编译程序的自展技术
- 13.2 可重定向编译程序
- 13.2.1 概述
- 13.2.2 支持可重定向编译的关键技术
- 13.2.3 常用的可重定编译程序
- 13.3 GCC的剖析
- 13.3.1 GCC的总体结构
- 13.3.2 GCC的中间表示
- 13.3.3 GCC的机器描述
- 13.3.4 GCC的代码生成与机器描述的接口
- 13.4 GCC的定制
- 13.4.1 GCC的剪裁
- 13.4.2 GCC编译程序的安装与配置
- 13.5 GCC的优化
- 13.5.1 概述
- 13.5.2 窥孔优化
- 13.5.3 基于机器描述的窥孔优化
- 13.5.4 修改GCC源程序的窥孔优化
- 练习
- 第14章 面向对象语言的编译
- 14.1 面向对象语言的基本概念
- 14.2 面向对象语言语法结构及语义处理的特征
- 14.2.1 面向对象语言的类的语法结构及语义
- 14.2.2 面向对象语言的有效类、延迟类及延迟成员
- 14.2.3 面向对象语言的类属类
- 14.2.4 面向对象语言的继承类
- 14.3 多态实例变量、多态引用的类型检查及绑定
- 14.3.1 实例变量和多态引用
- 14.3.2 静态类型检查及动态类型检查
- 14.3.3 对象的创建
- 14.4 面向对象操作的语义
- 14.4.1 类名的属性构造
- 14.4.2 类名的属性及其结构
- 14.5 类成员名的属性及其结构
- 14.5.1 类名的属性及其结构
- 14.5.2 类成员名的属性及其结构
- 14.6 对象的存储管理及废弃单元回收
- 14.6.1 对象的三种存储区组织管理方式
- 14.6.2 静态模型和栈式模型废弃单元的回收
- 14.6.3 堆式模型废弃单元的回收
- 练习
- 第15章 编译程序的面向对象构造
- 15.1 编译程序面向对象构造的基本概念
- 15.1.1 编译程序的需求
- 15.1.2 编译程序的分解
- 15.1.3 类的构造层次
- 15.1.4 类的特性定义
- 15.2 构造编译程序的面向对象类库
- 15.2.1 对传统编译程序构造中软件复用的分析
- 15.2.2 面向对象编译类库的地位
- 15.2.3 语言编译论的面向对象论域分析
- 15.3面向对象编译程序的符号表构造
- 练习
- 附录A PL、0编译程序文本
- A.1 Pascal版本
- A.2 C版本
- 参考文献