基本信息
- 原书名:Engineering a Compiler,Second Edition
- 原出版社: Morgan Kaufmann; 2 edition
- 作者: (美)Keith D. Cooper Linda Torczon
- 译者: 郭旭
- 丛书名: 图灵程序设计丛书
- 出版社:人民邮电出版社
- ISBN:9787115301949
- 上架时间:2012-12-26
- 出版日期:2013 年1月
- 开本:16开
- 页码:578
- 版次:1-1
- 所属分类:计算机 > 软件与程序设计 > 汇编语言/编译原理 > 编译原理
【插图】

编辑推荐
深入剖析现代编译器运用的算法和技术
强调代码优化和代码生成
体现编译原理教学的最新理念
内容简介
作译者
Linda Torczon 莱斯大学计算机科学系高级研究员。Torczon的研究内容主要包括代码生成、过程间数据流分析和优化、编程环境。
郭旭 资深软件设计师。主要兴趣是复杂软件系统的分析和设计,目前从事高性能数据集成工具的研发。译有《深入Linux内核架构》、《C语言接口及实现》等书。
目录
第1章 编译概观 1
1.1 简介 1
1.2 编译器结构 4
1.3 转换概述 7
1.3.1 前端 8
1.3.2 优化器 10
1.3.3 后端 11
1.4 小结和展望 15
第2章 词法分析器 17
2.1 简介 17
2.2 识别单词 18
2.2.1 识别器的形式化 20
2.2.2 识别更复杂的单词 21
2.3 正则表达式 24
2.3.1 符号表示法的形式化 25
2.3.2 示例 26
2.3.3 RE的闭包性质 28
2.4 从正则表达式到词法分析器 30
2.4.1 非确定性有限自动机 30
前言
同时,编译器构建社区还将继续产生新的思路和算法,并重新发现原本有效但在很大程度上却被遗忘的旧技术。围绕着寄存器分配中弦图(chordal graph)使用(参见13.5.2节)的最新研究颇为令人振奋。该项工作承诺可以简化图着色分配器(graph-coloring allocator)的某些方面。Brzozowski的算法是一种DFA最小化技术,可以追溯到20世纪60年代早期,但却已有数十年未在编译器课程中讲授了(参见2.6.2节)。 该算法提供了一种容易的路径,可以从子集构造(subset construction)的实现得到一个最小化DFA的实现。编译器构建方面的现代课程本该同时包括这两种思想。
那么,为了让学习者准备好进入这个不断变化的领域,我们该如何设计编译器构建课程的结构呢?我们相信,这门课应该使每个学生学会建立新编译器组件和修改现存编译器所需的各项基本技能。学生既需要理解笼统的概念,如链接约定中隐含的编译器、链接器、装载器和操作系统之间的协作,也需要理解微小的细节,如编译器编写者如何减少每个过程调用时保存寄存器的代码总共所占的空间。
第2版中的改变
本书提供了两种视角:编译器构建领域中各问题的整体图景,以及各种可选算法方案的详细讨论。在构思本书的过程中,我们专注于该书的可用性,使其既可作为教科书,又可用做专业人士的参考书。为此,我们特别进行了下述改动。
改进了阐述思想的流程,以帮助按顺序阅读本书的学生。每章章首简介会解释该章的目的,列出主要的概念,并概述主题相关内容。书中的示例已经重写过,使得章与章之间的内容具有连续性。此外,每章都从摘要和一组关键词开始,以帮助那些会将本书用做参考书的读者。
在每节末尾都增加了本节回顾和复习题。复习题用于快速检查读者是否理解了该节的要点。
关键术语的定义放在了它们被首次定义和讨论的段落之后。
大量修订了有关优化的内容,使其能够更广泛地涵盖优化编译器的各种可能性。
现在的编译器开发专注于优化和代码生成。对于新雇用的编译器编写者来说,他们往往会被指派去将代码生成器移植到新处理器,或去修改优化趟,而不会去编写词法分析器或语法分析器。成功的编译器编写者必须熟悉优化(如静态单赋值形式的构建)和代码生成领域当前最好的实践技术(如软件流水线)。他们还必须拥有相关的背景和洞察力,能理解未来可能出现的新技术。最后,他们必须深刻理解词法分析、语法分析和语义推敲(semantic elaboration)技术,能构建或修改编译器前端。
本书是一本教科书、一门教程,帮助学生接触到现代编译器领域中的各种关键问题,并向学生提供解决这些问题所需的背景知识。从第1版开始,我们就维持了各主题之间的基本均衡。前端是实用组件,可以从可靠的厂商购买或由某个开源系统改编而得。但是,优化器和代码生成器通常是对特定处理器定制的,有时甚至针对单个处理器型号定制,因为性能严重依赖于所生成代码的底层细节。这些事实影响到了当今构建编译器的方法,它们也应该影响我们讲授编译器构建课程的方法。
本书结构
本书内容划分为篇幅大致相等的四个部分。
第一部分(第2章~第4章)涵盖编译器前端及建立前端所用工具的设计和构建。
第二部分(第5章~第7章)探讨从源代码到编译器的中间形式的映射,这些章考查前端为优化器和后端所生成代码的种类。
第三部分(第8章~第10章)介绍代码优化。第8章提供对优化的概述。第9章和第10章包含了对分析和转换的更深入的处理,本科课程通常略去这两章。
第四部分(第11章~第13章)专注于编译器的后端所使用的算法。
编译的艺术性与科学性
编译器构建的内容有两部分,一是将理论应用到实践方面所取得的惊人成就,一是对我们能力受限之处的探讨。这些成就包括:现代词法分析器是通过应用正则语言的理论自动构建识别器而建立的;LR语法分析器使用同样的技术执行句柄识别,进而驱动了一个移进归约语法分析器;数据流分析巧妙有效地将格理论应用到程序分析中;代码生成中使用的近似算法为许多真正困难的问题提供了较好的解。
另一方面,编译器构建也揭示了一些难以解决的复杂问题。用于现代处理器的编译器后端对两个以上的NP完全问题(指令调度、寄存器分配,也许还包括指令和数据安排)采用了近似算法来获取答案。这些NP完全问题,虽然看起来与诸如表达式的代数重新关联这种问题相近(示例见图7-1)。但后者有着大量的解决方案,更糟的是,对于这些NP完全问题来说,所要的解往往取决于编译器和应用程序代码中的上下文信息。在编译器对此类问题近似求解时,会面临编译时间和可用内存上的限制。好的编译器会巧妙地混合理论、实践知识、技术和经验。
媒体评论
——Michael D. Smith,哈佛大学文理学院院长,
工程与应用科学John H. Finley Jr.讲席教授
“本书是构建现代优化编译器的最佳指南。作者汲取了编译器构建领域大量的经验,以帮助学生掌握整体设计思路,同时引导学生了解构建有效的优化编译器所必需的许多重要而微妙的细节。尤其值得一提的是,在我读过的书中,本书对静态单赋值形式的阐述最为清晰。”
——Jeffery von Ronne,得克萨斯大学圣安东尼奥分校计算机科学系助理教授
“本书采用了更常规且一致的结构,还包含大量辅助教学的内容,如复习题、附加示例、术语解释和文本框说明等,这提升了它作为教科书的价值。本书还包括大量技术上的更新,包括非传统语言、实际编译器和编译器技术非传统用途方面的更多内容。优化方面的内容是第1版的特色,这一版中变得更为清晰易读。”
——Michael L. Sccot,罗彻斯特大学计算机科学系教授,
Programming Language Pragmatics的作者
“Keith Cooper和Linda Torczon不仅很好地讲述了编译器的历史,也从实践者的角度阐述了如何开发编译器。书中包括了大量颇具实用价值的讨论和说明,既涉及理论,也涉及众多现存编译器的实例(如Lisp、FORTRAN等)。对入门和高级“分配”与“优化”概念的全面讨论,实际上涵盖了编译器设计的整个生命周期。对于计算机科学专业的学生以及编译器设计和开发人员来说,本书都是必备参考书。”
——David Orleans,诺瓦东南大学
“这本书写得实在是棒极了,内容翔实,辅以大量图表和示例说明,作为大学编译器课程的教科书和从业人员的参考书再合适不过了。代码优化是其重点。”
——Reviews.com