前言
从本书的1986版的出版到现在,编译器设计的世界已经发生了很大的改变。程序设计语言的发展提出了新的编译问题。计算机体系结构提供了多种多样的资源,而编译器设计者必须能够充分利用这些资源。可能最有意思的事情是,古老的代码优化技术已经在编译器之外找到了新的应用。现在,这些技术被有些工具用于寻找软件中错误,以及,最重要的是,寻找现有代码中的安全漏洞。并且,很多“前端”技术——文法、正则表达式、语法分析器、以及语法制导翻译器等——仍然被广泛应用。
因此,本书的先前版本所体现的我们的价值观一直没有改变。我们认识到只有很少的读者将会去构建,甚至维护,一个主流程序设计语言的编译器。但是,和编译器相关的模型、理论和算法可以被应用到软件设计和开发中出现的各种各样的问题上。因此我们的重点是那些在设计一个语言处理器时常常会碰到的问题,而不考虑具体的源语言和目标机器究竟是什么。
使用本书
要学完本书的全部或大部分内容至少需要两个季度、甚至两个学期。通常会在一门本科课程中讲授本书的前半部分内容;而本书的后半部分——强调代码优化——会在研究生层面或小范围的另一门课程中讲授。下面是各个章节的概要介绍:
第一章是一些关于学习动机的资料,同时也给出了一些关于计算机体系结构和程序设计语言原理的背景知识。
第二章开发了一个缩微的编译器,并介绍了很多重要的概念。这些概念将在后面的各个章节中深入介绍。这个编译器本身在附录中给出。
第三章讨论了词法分析、正则表达式、有穷状态自动机、和词法分析器的生成工具。这些内容是各种正文处理的基础。
第四章讨论了主流的语法分析方法, 包括自顶向下方法(递归下降法,LL技术)和自底向上方法(LR技术和它的变体)。
第五章介绍了语法制导定义和语法制导翻译的基本思想。
第六章使用第五章中的理论,显示了如何使用这些理论为一个典型的程序设计语言生成中间代码。
第七章讨论了运行时刻环境,主要是运行时刻栈的管理和垃圾收集机制。
第八章是关于目标代码生成的。它讨论了基本块的构造,从表达式和基本块生成代码的方法,以及寄存器分配技术。
第九章介绍了代码优化技术,包括流图、数据流分析框架以及求解这些框架的迭代算法。
第十章讨论了指令级优化。本章的重点是从小段指令代码中抽取并行性,并在那些可以同时做多件事情的单处理器上调度这些指令。
第十一章讲的是大规模并行的检测和利用。这里的重点是数值计算代码。这些代码具有对多维数组进行遍历的紧致循环。
第十二章是关于过程间分析技术的。它讨论了指针分析、别名和数据流分析。这些分析中都考虑了到达代码中某个给定点时过程调用序列。
一些使用本书内容的课程已经在Columbia、Harvard、Stanford讲授。在Columbia,一门关于程序设计语言和翻译器的课程使用了本书前八章的内容。该课程常年面向高年级本科生/一年级研究生讲授。这门课程的亮点是一个长达一个学期的课程实践项目。在该项目中,学生分成小组,创建并实现一个他们自己设计的小型语言。学生创建的语言涉及了多个应用领域,包括量子计算、音乐合成、计算机图形学、游戏、矩阵运算和很多其它领域。在构建他们自己的编译器时,学生们使用了很多种可以生成编译器组件的工具,比如ANTLR、Lex和Yacc;他们还使用了第二章和第五章中讨论的语法制导翻译技术。后续的研究生课程的重点是本书第九章到第十二章的内容,着重强调针对当代计算机的代码生成和优化。这些计算机包括网络处理器和多处理器体系结构。
在Stanford,一门一个季度的入门课程大致涵盖了第一章到第八章的内容,同时还包括了对第九章中全局代码优化的介绍。第二门编译器课程包括了第九章到第十二章,另外还包括了第七章中有关垃圾收集的深入内容。学生使用一个本校开发的、基于Java的系统Joeq来实现数据流分析算法。
课程的预备知识
读者应该拥有一些“计算机科学的综合知识”,至少学过两门关于编程的课程,以及关于数据结构和离散数学的课程。有关多个不同程序设计语言的知识对本课程的学习会有所帮助。
练习
本书包含了广泛的练习,几乎每一节都有一些练习。我们用感叹号来表示较难的练习或练习中的一部分。最难的练习有两个感叹号。
Gradiance在线家庭作业
第三版的一个新特点是使用Gradiance公司开发的技术,给出了一组附加的在线家庭作业。指导教师可以把这些家庭作业布置给学生,没有参加课程的学生也可以参加一个“公共课程”,允许他们(在没有参加由教师创建的课程时)把这些家庭作业当作一个学习指南。Gradiance问题看起来和通常的问题一样,但是你给出的解答讲被采样收集。如果你选择了错误的答案,你会得到一个特定的建议或反馈,帮助你更正你的解答。如果你的教师允许,你可以继续尝试,直到你得到一个完美的得分。
本教材的每一个在北美出售的新拷贝都提供了对Gradiance服务的订阅。要获取更多信息,请访问Addison-Wesley出版社的Web站点www.aw.com/gradiance,或者发电子邮件到computing@aw.com询问。
万维网上的支持
本书的homepage是
dragonbook.stanford.edu
你将在这里找到我们所知错误的勘误表以及一些支持性资料。我们希望将我们讲授的每一门与编译器相关的课程的可用讲义,包括家庭作业、答案和练习等,都提供出来。我们也计划贴出由一些重要编译器的作者写的关于这些编译器的描述。
致谢
封面艺术由Strange Tonic Productions的S.D.Ullman设计。
Jon Bentley针对这本书的早期草稿中的多章内容向我们提出了广泛深入的评论。我们收到了来自下列人员的有帮助的评价和勘误:Domenico
bianculli, Peter Bosch, Marcio Buss, Marc Eaddy, Stephen Edwards, Vibbav Garg,
Kim Hazelwood, Gaurav Kc, Wei Li, Mike Smith, Art Stamness, Krysta Svore,
Olivier Tardieu, and Jia Zeng. 我们衷心感谢这些人的帮助。当然,书中的残留错误是因为我们自身的原因。
另外,Monica希望能够向她在SUIF编译器团队的同事表示感谢,感谢他们在18年的时间里传授给她的编译器相关知识:Gerald Aigner, Dzintars
Avots, Saman Amarasinghe, Jennifer Anderson, Michael Carbin, Gerald Cheong, Amer
Diwan, Robert French, Anwar Ghuloum, Mary Hall, John Hennessy, David Heine,
Shih-Wei Liao, Amy Lim, Benjamin Livshits, Michael Martin, Dror Maydan, Todd
Mowry, Brian Murphy, Jeffrey Oplinger, Karen Pieper, Martin Rinard, Olatunji
Ruwase, Constantine Sapuntzakis, Patrick Sathyanathan, Michael Smith, Steven
Tjiang, Chau-Wen Tseng, Christopher Unkel, John Whaley, Robert Wilson,
Christopher Wilson, and Michael Wolf.
A.V.A., Chatham NJ
M.S.L., Menlo Park CA
R.S., Far Hill NJ
J.D.U., Stanford CA
2006年六月