商家名称 |
信用等级 |
购买信息 |
订购本书 |
|
 |
编译器设计基础 |
 |
|
 |
编译器设计基础 |
 |

基本信息·出版社:清华大学出版社
·页码:277 页
·出版日期:2009年04月
·ISBN:7302193347/9787302193340
·条形码:9787302193340
·版本:第1版
·装帧:平装
·开本:16
·正文语种:中文
·丛书名:世界著名计算机教材精选
·外文书名:ELEMENTS OF COMPILER DESIGN
内容简介 《编译器设计基础》是编译器编写方面的入门教材,适用于一个学期的高年级本科课程。《编译器设计基础》坚持在这一主题的理论和实践方法之间维持一种平衡。从理论角度来看,《编译器设计基础》介绍了编译及其核心阶段的基本模型。基于这些模型,它讲解了编译器中用到的概念、方法和技术。《编译器设计基础》还简述了编译以及相关话题的数学基础,这些话题包括形式语言理论、自动机和变换机。同时,从实践的视角来看,《编译器设计基础》描述了编译器技术是如何实现的。一个案例学习贯穿全书,《编译器设计基础》设计一种新的类Pascal程序设计语言,并构造其编译器;在讨论编译器各种方法的同时,这个案例学习用作其实现的实例说明。此外,《编译器设计基础》提供了许多详细的例子和计算机程序,以强调编译算法的实际应用。《编译器设计基础》中也涵盖了核心软件工具。学完《编译器设计基础》之后,学生应该能够掌握编译过程,编写简单的真实编译器,并可以继续学习关于该主题的更深入的书籍。
作者简介 Alexander Meduna,PhD,布尔诺理工大学计算机科学系教授,于1988年在那里获得博士学位。从1988至1997年,他在美国密苏里哥伦比亚大学讲授计算机科学。从2000年起,他在布尔诺理工大学任教,更加专注于讲授计算机科学和数学。除了这两所大学,他还在美洲、欧洲和日本的几所大学短期讲授计算机科学。他的课程主要集中于编译器的编写。他所教授的内容也涵盖了多种主题,包括自动机、离散数学、形式语言、操作系统、程序设计语言原理以及计算理论。
编辑推荐 编译器是计算机系统最核心最基础的支撑软件之一。由AlexanderMeduna教授编写的《编译器设计基础》是一本编译器设计方面的入门教材,他所坚持的理念是在理论和实践方法之间维持一种平衡。《编译器设计基础》对于基本原理的讲解很到位,在系统性以及理论与实践方法之间的融合方面优于多数目前我们所能见到的教材。通过《编译器设计基础》的学习,读者既可以深入学习基础理论如何指导实际编译器中的词法、语法及语义分析程序的设计,又可以轻松了解有关(中间与目标)代码生成和代码优化的整体知识框架。每章后面提供了丰富的习题,并给出了部分习题的解答。《编译器设计基础》附录包含,一个C++源代码,它实现了一个真实编译器的重要部分。更多的支持材料,包括课程讲稿、教学指导、家庭作业、勘误、考试、练习解答以及编译器的实现。
目录 第1章 导引/1
1.1 数学基础/1
1.1.1 集合与序列/1
1.1.2 语言/2
1.1.3 关系与翻译/3
1.1.4 图/4
1.1.5 证明/6
1.2 编译/8
1.2.1 编译阶段/8
1.2.2 编译器构造/12
1.3 重写系统/13
1.3.1 语言模型/14
本书要点/15
习题/15
部分习题解答/17
第2章 词法分析/19
2.1 模型/19
2.1.1 正规表达式/19
2.1.2 有穷自动机/20
2.1.3 有穷自动机的表示/22
2.1.4 简化/23
2.1.5 有穷变换机/28
2.2 方法/29
2.2.1 单词与单词记号/29
2.2.2 词法分析器/33
2.2.3 额外的任务/39
2.3 理论/39
2.3.1 正规表达式到有穷自动机的变换/39
2.3.2 有穷自动机的化简/44
2.3.3 非正规词法构造/51
2.3.4 判定问题/60
习题/62
部分习题解答/67
第3章 语法分析/69
3.1 模型/69
3.1.1 文法/69
3.1.2 下推自动机/80
3.2 方法/83
3.2.1 自上而下分析/83
3.2.2 递归下降分析程序/86
3.2.3 消除左递归/89
3.2.4 自下而上分析/91
3.3 理论/96
3.3.1 分析模型的能力/97
3.3.2 验证文法形式的语法描述/97
3.3.3 文法的简化/99
3.3.4 文法的范式和基于它们的分析/108
3.3.5 文法不能描述的语法/114
3.3.6 判定问题/120
习题/122
部分习题解答/127
第4章 确定的自上而下分析/130
4.1 预测集合和LL文法/130
4.2 预测分析/136
4.2.1 递归下降预测分析/136
4.2.2 表驱动的预测分析/139
4.2.3 处理错误/144
习题/145
部分习题解答/149
第5章 确定的自下而上分析/151
5.1 优先分析/151
5.1.1 算符优先分析算法/151
5.1.2 算符优先表的构造/154
5.1.3 处理错误/155
5.1.4 扩展/158
5.1.5 限制/160
5.2 LR语法分析/160
5.2.1 LR分析算法/160
5.2.2 构造LR表/163
5.2.3 LR分析中的错误处理/170
习题/172
部分习题解答/175
第6章 语法制导翻译和中间代码生成/178
6.1 自下而上语法制导翻译和中间代码生成/179
6.1.1 语法树/180
6.1.2 三地址码/185
6.1.3 波兰式/188
6.2 自上而下的语法制导翻译/189
6.3 语义分析/191
6.4 符号表/192
6.4.1 组织/192
6.4.2 存储标识符名字/193
6.4.3 块结构的符号表/194
6.5 语法制导翻译的软件工具/195
6.5.1 Lex/196
6.5.2 Yacc/197
习题/201
部分习题解答/203
第7章 优化和目标代码生成/205
7.1 跟踪变量的使用/205
7.1.1 基本块/206
7.1.2 基本块内变量的使用/208
7.1.3 基本块之间变量的使用/211
7.2 中间代码优化/214
7.3 目标代码的优化和生成/218
习题/222
部分习题解答/225
结束语/226
文献纪要/226
研究生层次的话题/227
当前趋势/230
附录A实现/233
A.1 概念/233
类接口/234
A.2 代码/236
参考文献/256
……
序言 本书是编译器编写方面的入门教材,适用于一个学期的高年级本科课程。它坚持在这一主题的理论和实践方法之间维持一种平衡。从理论角度来看,它介绍了编译及其核心阶段的基本模型。基于这些模型,它讲解了编译器中用到的概念、方法和技术。它还简述了编译以及相关话题的数学基础,这些话题包括形式语言理论、自动机和变换机。同时,从实践的视角来看,本书描述了编译器技术是如何实现的。一个案例学习贯穿全书,它设计一种新的类Pascal程序设计语言,并构造其编译器;在讨论编译器各种方法的同时,这个案例学习用作其实现的实例说明。此外,本书提供了许多详细的例子和计算机程序,以强调编译算法的实际应用。书中也涵盖了核心软件工具。学完本书之后,学生应该能够掌握编译过程,编写简单的真实编译器,并可以继续学习关于该主题的更深入的书籍。
从逻辑的观点来看,本书将编译分为6个内聚性强的阶段。同时,它指出真正的编译器并不是以严格的顺序方式执行这些阶段;与此不同,它们的执行会有一些重叠,目的是为了尽可能加快和改进整个编译过程。因而,本书在按照逐个阶段涵盖编译过程的同时,同步地解释每一个阶段在编译期间是如何被衔接起来的。它描述这种相互衔接是如何反映到编译器构造中的,以达到整体上最好的编译效果。
就学生方面而言,并不假定他们先前有多少关于编译方面的知识。虽然这本书是自成体系的,也就是说并不需要其他额外的资源来理解这些内容,但是熟悉汇编语言和高级语言(如Pascal或C)对加快理解本书是有帮助的。在介绍每一个新的概念和算法之前,都要解释它的目的,并跟随一些例子,计算机程序段以及注释,以强化对它的理解。每一复杂内容之前都有直观的解释。给出的所有应用例子都有实际意义,能够清楚地体现理论概念和它的应用之间是紧密关联的。
严格地讲,在计算机科学中,每一个算法都需要证明它可以终止并能够正确地工作。然而,就本书所给出的算法而言,终止性总是很明显的,因此其证明将全部忽略。复杂算法正确性的证明将详细给出。另一方面,在多数情况下,对于简单算法我们只是给出其要点,而将严格证明留作练习。本书将采用类Pascal记号描述算法,这种记号十分简单和直观,甚至不熟悉 Pascal 的学生都可以读懂它。在这种描述中,Pascal的repeat循环有时用until no change作为结束,含义是循环重复执行直到进一步重复时所得结果不再变化为止。由于本书的编写,尤为重要的是清晰的理解,所以,算法的描述经常会加入文字以使解释更加容易和有效。
文摘 插图:

如前边案例学习中所描述的那样,在根据某个规则进行展开期间,一些实际属性在所关联的动作执行时可能是未知的。实际上,在某一行发生这类展开的次数可以不受限制,因此必须将它们的执行推迟到所有涉及的实际属性被确定为止。通常,语法制导翻译将所有这些未完成的动作压入特殊的语义下推栈(semantic pushdown),一旦位于栈顶的动作需要的所有实际属性被确定下来,那么将执行这个栈顶动作。这一话题的许多方面超出了这本入门教材的范围,因此我们这里省略关于它的进一步讨论。事实上,贯穿本书剩余部分,我们仅使用综合属性,而不使用继承属性。
6.3语义分析
除了产生中间代码的动作,编译器的分析程序常常引导许多其他的动作,例如,前一节结论部分所讨论的在符号表中记录信息。它还会引导用于验证源程序各语义方面的动作。这些动作的集合称为语义分析(semantic analysis),本节将对此进行讨论。这种分析通常包括进行如下四个方面的检查动作。
控制流检查(Flow-of-control checks)。对于能引起控制流离开某一结构的语句,需要描述一个控制流要转移到的位置。例如,一个跳转语句会使控制续接到一个由标号指明的语句,这样,如果标号没有对应到语句,那么就将出现一个语义错误。另外,通常这一续接的语句必须出现在和跳转语句相同的块中,语义分析将验证这种情况。依惯例,这种验证需要将编译器设计成多遍处理的(见1.2节)。
唯一性检查(Uniqueness checks)。某些对象,如标识符或者case语句的标号,在源程序的一个指定上下文范围内必须只定义一次,因此,语义分析要验证它们的定义是唯一的。
名字相关的检查(Name-related checks)。在源程序中,某些名字必须出现两次或多次。例如,语义分析必须要明确一个块名字一定要出现在某个程序块的开始和结束部分。