编译原理(原书第2版)(龙书)(12月1日china-pub全国独家首发)(09年度畅销榜TOP50)
基本信息
- 作者: (美)Alfred V.Aho Monica S.Lam Ravi Sethi Jeffrey D.Ullman [作译者介绍]
- 译者: 赵建华 郑滔 戴新宇
- 丛书名: 计算机科学丛书
- 出版社:机械工业出版社
- ISBN:9787111251217
- 上架时间:2008-12-1
- 出版日期:2009 年1月
- 开本:16开
- 页码:631
- 版次:2-1
- 所属分类:
计算机 > 软件与程序设计 > 汇编语言/编译原理 > 编译原理
教材 > 研究生/本科/专科教材 > 工学 > 计算机
教材 > 教材汇编分册 > 高等理工
编辑推荐
编译领域里程碑式的经典著作——龙书,20年后终于出版新版!
这是一个延绵30年的故事,这是一部关于龙书的传奇!
最新版本,增添两章节内容,使龙书地位更权威!
技术社区推荐:
W3china社区
Chinaunix社区
java社区
CSDN java大社区
看雪论坛
博客园
推荐阅读
内容简介回到顶部↑
本书全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并在相关章节中给出大量的实例。与上一版相比,本书进行了全面修订,涵盖了编译器开发方面最新进展。每章中都提供了大量的实例及参考文献。
本书是编译原理课程方面的经典教材,内容丰富,适合作为高等院校计算机及相关专业本科生及研究生的编译原理课程的教材,也是广大技术人员的极佳参考读物。
本书是编译原理课程方面的经典教材,内容丰富,适合作为高等院校计算机及相关专业本科生及研究生的编译原理课程的教材,也是广大技术人员的极佳参考读物。
作译者回到顶部↑
本书提供作译者介绍
Alfred V.Aho,美国歌伦比亚大学教授,美国国家工程院院士,ACM和IEEE会士,曾获得IEEE的冯·诺伊曼奖。著有多部算法、数据结构、编译器、数据库系统及计算机科学基础方面的著作。
.. << 查看详细
.. << 查看详细
目录回到顶部↑
出版者的话
译者序
前言
第1章 引论
1.1 语言处理器
1.2 一个编译器的结构
1.2.1 词法分析
1.2.2 语法分析
1.2.3 语义分析
1.2.4 中间代码生成
1.2.5 代码优化
1.2.6 代码生成
1.2.7 符号表管理
1.2.8 将多个步骤组合成趟
1.2.9 编译器构造工具
1.3 程序设计语言的发展历程
1.3.1 走向高级程序设计语言
1.3.2 对编译器的影响
1.3.3 1.3节的练习
1.4 构建一个编译器的相关科学
译者序
前言
第1章 引论
1.1 语言处理器
1.2 一个编译器的结构
1.2.1 词法分析
1.2.2 语法分析
1.2.3 语义分析
1.2.4 中间代码生成
1.2.5 代码优化
1.2.6 代码生成
1.2.7 符号表管理
1.2.8 将多个步骤组合成趟
1.2.9 编译器构造工具
1.3 程序设计语言的发展历程
1.3.1 走向高级程序设计语言
1.3.2 对编译器的影响
1.3.3 1.3节的练习
1.4 构建一个编译器的相关科学
译者序回到顶部↑
绝大部分软件是使用高级程序设计语言来编写的。用这些语言编写的软件必须经过编译器的编译,才能转换为可以在计算机上运行的机器代码。编译器所生成代码的正确性和质量会直接影响成千上万个软件。因此,编译器构造原理和技术是计算机科学技术领域中的一个非常重要的组成部分。不仅如此,编译技术在当前已经广泛应用于编译器构造之外的其他领域,比如程序分析/验证、模型转换、语言处理等领域。因此,虽然大部分读者不会参与设计商用编译器,但拥有编译的相关知识仍然会对他们的研究开发生涯产生有益的影响。.
A.V.Aho等人撰写的《Compilers:Principles,Techniques,and Tools》被誉为编译教科书中的“龙书”。这说明这本书具有很高的权威性。我们有幸受机械工业出版社的委托,翻译龙书的第2版。
本书不仅包含了词法分析、语法分析、语义分析、代码生成等传统、经典的编译知识,还详细介绍了一些最新研究成果,比如过程间指针分析的最新进展。这使得本书不仅适用于编译原理的初学者,还可以作为研究人员的参考书目。本书不仅介绍编译器构造的基本原理和技术,还详细介绍一些有用的编译器构造工具,比如对Lex和Yacc的介绍使得读者可以了解这些工具的工作原理和使用方法。除此之外,读者还可以看到很多其他领域的概念在编译器构造中的应用。比如在第9章,读者可以看到群论中的抽象概念“格”被完美地应用于数据流分析算法的设计。而在第11章,线性规划和整数规划技术被成功地应用于程序并行化技术。这些内容对拓展读者的视野和思路有很大的好处。..
由于本书覆盖的范围非常广,不可能在一个学期内讲完本书的全部内容。因此我建议采用本书作为本科生教材的老师只选择讲授其中的基础部分,即第1章到第9章中的大部分内容。第2章是对后面各章内容的介绍,可以在讲授相应内容之前指导学生预习。
最后感谢机械工业出版社的温莉芳女士以及姚蕾和朱劫两位编辑在本书的翻译过程中给予我们的有力帮助,也感谢其他给予我们支持的同事。由于水平有限,翻译中的错漏之处在所难免,欢迎读者批评指正。...
译者
2008年6月于南京
A.V.Aho等人撰写的《Compilers:Principles,Techniques,and Tools》被誉为编译教科书中的“龙书”。这说明这本书具有很高的权威性。我们有幸受机械工业出版社的委托,翻译龙书的第2版。
本书不仅包含了词法分析、语法分析、语义分析、代码生成等传统、经典的编译知识,还详细介绍了一些最新研究成果,比如过程间指针分析的最新进展。这使得本书不仅适用于编译原理的初学者,还可以作为研究人员的参考书目。本书不仅介绍编译器构造的基本原理和技术,还详细介绍一些有用的编译器构造工具,比如对Lex和Yacc的介绍使得读者可以了解这些工具的工作原理和使用方法。除此之外,读者还可以看到很多其他领域的概念在编译器构造中的应用。比如在第9章,读者可以看到群论中的抽象概念“格”被完美地应用于数据流分析算法的设计。而在第11章,线性规划和整数规划技术被成功地应用于程序并行化技术。这些内容对拓展读者的视野和思路有很大的好处。..
由于本书覆盖的范围非常广,不可能在一个学期内讲完本书的全部内容。因此我建议采用本书作为本科生教材的老师只选择讲授其中的基础部分,即第1章到第9章中的大部分内容。第2章是对后面各章内容的介绍,可以在讲授相应内容之前指导学生预习。
最后感谢机械工业出版社的温莉芳女士以及姚蕾和朱劫两位编辑在本书的翻译过程中给予我们的有力帮助,也感谢其他给予我们支持的同事。由于水平有限,翻译中的错漏之处在所难免,欢迎读者批评指正。...
译者
2008年6月于南京
前言回到顶部↑
从本书的1986版出版到现在,编译器设计领域已经发生了很大的改变。随着程序设计语言的发展,提出了新的编译问题。计算机体系结构提供了多种多样的资源,而编译器设计者必须能够充分利用这些资源。最有意思的事情可能是,古老的代码优化技术已经在编译器之外找到了新的应用。现在,有些工具利用这些技术来寻找软件中的缺陷,以及(最重要的是)寻找现有代码中的安全漏洞。而且,很多“前端”技术——文法、正则表达式、语法分析器以及语法制导翻译器等——仍然被广泛应用。.
因此,本书先前的版本所体现的我们的价值观一直没有改变。我们知道,只有很少的读者将会去构建甚至维护一个主流程序设计语言的编译器。但是,和编译器相关的模型、理论和算法可以被应用到软件设计和开发中出现的各种各样的问题上。因此,我们会关注那些在设计一个语言处理器时常常会碰到的问题,而不考虑具体的源语言和目标机器究竟是什么。
使用本书
要学完本书的全部或大部分内容至少需要两个学季(quarter),甚至两个学期(semester)。通常会在一门本科课程中讲授本书的前半部分内容;而本书的后半部分(强调代码优化)会在研究生层面或另一门小范围的课程中讲授。下面是各章的概要介绍:
第1章给出一些关于学习动机的资料,同时也将给出一些关于计算机体系结构和程序设计语言原则的背景知识。
第2章会开发一个小型的编译器,并介绍很多重要概念。这些概念将在后面的各章中深入介绍。这个编译器本身将在附录中给出。
第3章将讨论词法分析、正则表达式、有穷状态自动机和词法分析器的生成器工具。这些内容是各种文本处理的基础。
第4章将讨论主流的语法分析方法,包括自顶向下方法(递归下降法、LL技术)和自底向上方法(LR技术和它的变体)。
第5章将介绍语法制导定义和语法制导翻译的基本思想。
第6章将使用第5章中的理论,并说明如何使用这些理论为一个典型的程序设计语言生成中间代码。
第7章将讨论运行时刻环境,特别是运行时刻栈的管理和垃圾回收机制。
第8章将主要讨论目标代码生成技术。该章会讨论基本块的构造,从表达式和基本块生成代码的方法,以及寄存器分配技术。
第9章将介绍代码优化技术,包括流图、数据流分析框架以及求解这些框架的迭代算法。
第10章将讨论指令级优化。该章的重点是从小段指令代码中抽取并行性,并在那些可以同时做多件事情的单处理器上调度这些指令。
第11章将介绍大规模并行性的检测和利用。这里的重点是数值计算代码。这些代码具有对多维数组进行遍历的紧致循环。
第12章将介绍过程间分析技术。它将讨论指针分析、别名和数据流分析。这些分析都考虑了到达代码中某个给定点时的过程调用序列。
哥伦比亚大学、哈佛大学、斯坦福大学已经开设了讲授本书内容的课程。哥伦比亚大学定期开设一门关于程序设计语言和翻译器的课程,使用了本书前8章的内容。该课程常年面向高年级本科生/一年级研究生讲授,这门课程的亮点是一个长达一个学期的课程实践项目。在该项目中,学生分成小组,创建并实现一个他们自己设计的小型语言。学生创建的语言涉及多个应用领域,包括量子计算、音乐合成、计算机图形学、游戏、矩阵运算和很多其他领域。在构建他们自己的编译器时,学生们使用了很多种可以生成编译器组件的工具,比如ANTLR、Lex和Yacc;他们还使用了第2章和第5章中讨论的语法制导翻译技术。后续的研究生课程的重点是本书第9章到第12章的内容,着重强调适用于当代计算机(包括网络处理器和多处理器体系结构)的代码生成和优化技术。..
斯坦福大学开设了一门历时一个学季的入门课程,大致涵盖了本书第1章到第8章的内容,同时还会简介本书第9章中全局代码优化的相关内容。第二门编译器课程包括本书第9章到第12章的内容,另外还包括第7章中更为深入的有关垃圾收集的内容。学生使用一个该校开发的、基于Java的系统Joeq来实现数据流分析算法。
预备知识
学习本书的读者应该拥有一些“计算机科学的综合知识”,至少学过两门程序设计课程,以及数据结构和离散数学的课程。具备多种程序设计语言的知识对学习本书会有所帮助。
因此,本书先前的版本所体现的我们的价值观一直没有改变。我们知道,只有很少的读者将会去构建甚至维护一个主流程序设计语言的编译器。但是,和编译器相关的模型、理论和算法可以被应用到软件设计和开发中出现的各种各样的问题上。因此,我们会关注那些在设计一个语言处理器时常常会碰到的问题,而不考虑具体的源语言和目标机器究竟是什么。
使用本书
要学完本书的全部或大部分内容至少需要两个学季(quarter),甚至两个学期(semester)。通常会在一门本科课程中讲授本书的前半部分内容;而本书的后半部分(强调代码优化)会在研究生层面或另一门小范围的课程中讲授。下面是各章的概要介绍:
第1章给出一些关于学习动机的资料,同时也将给出一些关于计算机体系结构和程序设计语言原则的背景知识。
第2章会开发一个小型的编译器,并介绍很多重要概念。这些概念将在后面的各章中深入介绍。这个编译器本身将在附录中给出。
第3章将讨论词法分析、正则表达式、有穷状态自动机和词法分析器的生成器工具。这些内容是各种文本处理的基础。
第4章将讨论主流的语法分析方法,包括自顶向下方法(递归下降法、LL技术)和自底向上方法(LR技术和它的变体)。
第5章将介绍语法制导定义和语法制导翻译的基本思想。
第6章将使用第5章中的理论,并说明如何使用这些理论为一个典型的程序设计语言生成中间代码。
第7章将讨论运行时刻环境,特别是运行时刻栈的管理和垃圾回收机制。
第8章将主要讨论目标代码生成技术。该章会讨论基本块的构造,从表达式和基本块生成代码的方法,以及寄存器分配技术。
第9章将介绍代码优化技术,包括流图、数据流分析框架以及求解这些框架的迭代算法。
第10章将讨论指令级优化。该章的重点是从小段指令代码中抽取并行性,并在那些可以同时做多件事情的单处理器上调度这些指令。
第11章将介绍大规模并行性的检测和利用。这里的重点是数值计算代码。这些代码具有对多维数组进行遍历的紧致循环。
第12章将介绍过程间分析技术。它将讨论指针分析、别名和数据流分析。这些分析都考虑了到达代码中某个给定点时的过程调用序列。
哥伦比亚大学、哈佛大学、斯坦福大学已经开设了讲授本书内容的课程。哥伦比亚大学定期开设一门关于程序设计语言和翻译器的课程,使用了本书前8章的内容。该课程常年面向高年级本科生/一年级研究生讲授,这门课程的亮点是一个长达一个学期的课程实践项目。在该项目中,学生分成小组,创建并实现一个他们自己设计的小型语言。学生创建的语言涉及多个应用领域,包括量子计算、音乐合成、计算机图形学、游戏、矩阵运算和很多其他领域。在构建他们自己的编译器时,学生们使用了很多种可以生成编译器组件的工具,比如ANTLR、Lex和Yacc;他们还使用了第2章和第5章中讨论的语法制导翻译技术。后续的研究生课程的重点是本书第9章到第12章的内容,着重强调适用于当代计算机(包括网络处理器和多处理器体系结构)的代码生成和优化技术。..
斯坦福大学开设了一门历时一个学季的入门课程,大致涵盖了本书第1章到第8章的内容,同时还会简介本书第9章中全局代码优化的相关内容。第二门编译器课程包括本书第9章到第12章的内容,另外还包括第7章中更为深入的有关垃圾收集的内容。学生使用一个该校开发的、基于Java的系统Joeq来实现数据流分析算法。
预备知识
学习本书的读者应该拥有一些“计算机科学的综合知识”,至少学过两门程序设计课程,以及数据结构和离散数学的课程。具备多种程序设计语言的知识对学习本书会有所帮助。
书摘回到顶部↑
第4章 语法分析
4.1 引论
在本节中,我们将考察语法分析器是按照什么方法被集成到一个典型的编译器中的。然后我们将研究算术表达式的典型文法。表达式文法已经足以演示语法分析的本质,因为处理表达式的语法分析技术可以被用于处理程序设计语言的大部分构造。这一节的最后讨论了错误处理的问题,因为当语法分析程序发现它的输入不能由它的文法生成时,它必须作出得体的反应。
4.1.1 语法分析器的角色
在我们的编译器模型中,语法分析器从词法分析器获得一个由词法单元组成的串,并验证这个串可以由源语言的文法生成,如图4.1所示。我们期望语法分析器能够以易于理解的方式报告语法错误,并且能够从常见的错误中恢复并继续处理程序的其余部分。从概念上讲,对于良构的程序,语法分析器构造出一棵语法分析树,并把它传递给编译器的其余部分进一步处理。实际上并不需要显式地构造出这棵语法分析树,因为正如我们将看到的,对源程序的检查和翻译处理可以和语法分析过程交错完成。因此,语法分析器和前端的其它部分可以用一个模块来实现。
……
4.1 引论
在本节中,我们将考察语法分析器是按照什么方法被集成到一个典型的编译器中的。然后我们将研究算术表达式的典型文法。表达式文法已经足以演示语法分析的本质,因为处理表达式的语法分析技术可以被用于处理程序设计语言的大部分构造。这一节的最后讨论了错误处理的问题,因为当语法分析程序发现它的输入不能由它的文法生成时,它必须作出得体的反应。
4.1.1 语法分析器的角色
在我们的编译器模型中,语法分析器从词法分析器获得一个由词法单元组成的串,并验证这个串可以由源语言的文法生成,如图4.1所示。我们期望语法分析器能够以易于理解的方式报告语法错误,并且能够从常见的错误中恢复并继续处理程序的其余部分。从概念上讲,对于良构的程序,语法分析器构造出一棵语法分析树,并把它传递给编译器的其余部分进一步处理。实际上并不需要显式地构造出这棵语法分析树,因为正如我们将看到的,对源程序的检查和翻译处理可以和语法分析过程交错完成。因此,语法分析器和前端的其它部分可以用一个模块来实现。
……


点击看大图










加载中...
