编译程序设计艺术:理论与实践
基本信息
- 作者: (美)皮特曼(Pittman, T.) 皮特斯(Peters, J.)
- 译者: 李文军 高晓燕
- 丛书名: 计算机科学丛书
- 出版社:机械工业出版社
- ISBN:9787111288107
- 上架时间:2010-1-4
- 出版日期:2010 年1月
- 开本:16开
- 页码:341
- 版次:1-1
- 所属分类:
计算机 > 软件与程序设计 > 汇编语言/编译原理 > 编译原理
推荐阅读
内容简介回到顶部↑
本书详细介绍了编译程序设计中的词法分析(扫描程序)、语法分析(分析程序)、语义分析(约束程序)、中间代码优化以及代码生成等内容。作为颇受好评的编译原理经典教材,本书的最大特色是在全书贯穿了一种基于文法的指导思路,语义分析、代码优化、代码生成等均采用文法定义其规格说明,并且最后给出了变换属性文法(tag)的一种自编译实现。此外,本书还探讨了面向不同计算机体系结构的代码生成技术以及非过程式语言的编译问题。
本书适合作为高等院校计算机科学与技术、软件工程以及相关专业编译原理课程的教学参考书,同时也可供计算机语言及其处理技术爱好者参考。
本书适合作为高等院校计算机科学与技术、软件工程以及相关专业编译原理课程的教学参考书,同时也可供计算机语言及其处理技术爱好者参考。
目录回到顶部↑
出版者的话
译者序
前言
第1章 编译程序理论概述1
1.1 简介1
1.2 语言与翻译程序1
1.3 文法的作用2
1.4 若干例子4
1.5 编译程序的结构6
1.5.1 词法分析7
1.5.2 字符串表8
1.5.3 语法分析9
1.5.4 约束9
1.5.5 符号表9
1.5.6 代码生成9
1.5.7 优化10
符号11
缩略词11
关键术语11
练习12
译者序
前言
第1章 编译程序理论概述1
1.1 简介1
1.2 语言与翻译程序1
1.3 文法的作用2
1.4 若干例子4
1.5 编译程序的结构6
1.5.1 词法分析7
1.5.2 字符串表8
1.5.3 语法分析9
1.5.4 约束9
1.5.5 符号表9
1.5.6 代码生成9
1.5.7 优化10
符号11
缩略词11
关键术语11
练习12
译者序回到顶部↑
长期以来,编译原理一直是计算机相关专业本科生的专业主干课程。提起编译原理的英文原版教材,许多人自然想到龙书(A. Aho等人所著《Compilers: Principles, Techniques, and Tools》,俗称Dragon Book)、虎书(A. Appel所著《Modern Compiler Implementation in C/Java/ML》,俗称Tiger Book)、鲸书(S. Muchnick所著《Advanced Compiler Design and Implementation》,俗称Whale Book)等经典著作,其中鲸书侧重于编译程序的后端,并不适合第一门编译原理课程使用。此外,较有影响力的教材还有K. Louden所著《Compiler Construction: Principles and Practice》、C. Fischer等人所著《Crafting a Compiler with C》、K. Cooper等人所著《Engineering a Compiler》以及A. Holub所著《Compiler Design in C》等。
与上述流行教材相比,由美国阿肯色大学T. Pittman和J. Peters合著的本书的最大特色,是在全书贯穿了一种基于文法的指导思路:在语法分析阶段,该书遵循了一般教材采用的上下文无关文法;在语义分析阶段,采用以上下文无关文法为基础的属性文法;而在代码优化和代码生成阶段,则采用了变换属性文法。书中最后还给出变换属性文法的一种自编译实现。由于将文法技术贯穿于编译程序设计的每一方面,设计人员可以在规格说明层次定义一种语言的语法和语义,这将有益于编译程序的实现(无论采用手工方式,还是基于生成工具的自动方式)。例如,书中“Tiny BASIC解释程序”和“Micro-Modula美化打印工具”这两个例子很好地展示了这一方法的强大能力,以及独立于具体实现语言的特性。
本书虽然扎根于文法,但又不至于赘述文法。例如,与很多教材不同的是,本书基于下推自动机模型讲解LL(k)分析技术,有助于读者更好地理解编译程序设计与其理论基础之间的关联。又如,定义正则语言的形式化工具包括正则表达式、正则文法(左线性和右线性)、有穷状态自动机(确定的和不确定的)等多种等价方式,它们之间的等价转换是编译原理的重要理论基础;本书在词法分析部分重点介绍了从定义词法规则的正则表达式(或正则文法)到约简的确定有穷状态自动机这一变换路径上的各个环节,而不像一些教材那样将形式语言和自动机理论的许多内容未加以精心筛选就照搬到编译原理课程中。
尽管本书在编译程序设计的应用技术与理论基础之间的折中可圈可点,但也有未尽人意之处,例如第7章关于LR(k)分析技术的介绍可能会令许多初学者“知其然而不知其所以然”。在介绍编译程序后端的许多内容时,本书也因为过于简略并且缺少具体例子的解说,给读者理解相关技术造成困难。
鉴于本书编写年代较早,书中未涉及近十多年来编译程序的原理、方法、技术、工具等方面的最新进展,譬如面向对象程序设计语言的编译、垃圾收集机制的实现、许多代码优化技术等,这是读者使用本教材时应注意的地方。但这并不妨碍本书作为第一门编译原理课程的优秀入门教材或参考书,这些不足可通过其他较新的教材弥补。
中山大学计算机科学系软件工程实验室(selab@sysu)的周晓聪、乔海燕、罗达、李曦、朱建伟、梁焯佳、吴梓彦仔细阅读了译稿,并提出了宝贵的意见和建议,译者对此表示衷心感谢。由于译者水平所限,书中谬误之处在所难免,恳请广大读者不吝批评指正。
李文军 高晓燕
2009年9月于广州康乐园
与上述流行教材相比,由美国阿肯色大学T. Pittman和J. Peters合著的本书的最大特色,是在全书贯穿了一种基于文法的指导思路:在语法分析阶段,该书遵循了一般教材采用的上下文无关文法;在语义分析阶段,采用以上下文无关文法为基础的属性文法;而在代码优化和代码生成阶段,则采用了变换属性文法。书中最后还给出变换属性文法的一种自编译实现。由于将文法技术贯穿于编译程序设计的每一方面,设计人员可以在规格说明层次定义一种语言的语法和语义,这将有益于编译程序的实现(无论采用手工方式,还是基于生成工具的自动方式)。例如,书中“Tiny BASIC解释程序”和“Micro-Modula美化打印工具”这两个例子很好地展示了这一方法的强大能力,以及独立于具体实现语言的特性。
本书虽然扎根于文法,但又不至于赘述文法。例如,与很多教材不同的是,本书基于下推自动机模型讲解LL(k)分析技术,有助于读者更好地理解编译程序设计与其理论基础之间的关联。又如,定义正则语言的形式化工具包括正则表达式、正则文法(左线性和右线性)、有穷状态自动机(确定的和不确定的)等多种等价方式,它们之间的等价转换是编译原理的重要理论基础;本书在词法分析部分重点介绍了从定义词法规则的正则表达式(或正则文法)到约简的确定有穷状态自动机这一变换路径上的各个环节,而不像一些教材那样将形式语言和自动机理论的许多内容未加以精心筛选就照搬到编译原理课程中。
尽管本书在编译程序设计的应用技术与理论基础之间的折中可圈可点,但也有未尽人意之处,例如第7章关于LR(k)分析技术的介绍可能会令许多初学者“知其然而不知其所以然”。在介绍编译程序后端的许多内容时,本书也因为过于简略并且缺少具体例子的解说,给读者理解相关技术造成困难。
鉴于本书编写年代较早,书中未涉及近十多年来编译程序的原理、方法、技术、工具等方面的最新进展,譬如面向对象程序设计语言的编译、垃圾收集机制的实现、许多代码优化技术等,这是读者使用本教材时应注意的地方。但这并不妨碍本书作为第一门编译原理课程的优秀入门教材或参考书,这些不足可通过其他较新的教材弥补。
中山大学计算机科学系软件工程实验室(selab@sysu)的周晓聪、乔海燕、罗达、李曦、朱建伟、梁焯佳、吴梓彦仔细阅读了译稿,并提出了宝贵的意见和建议,译者对此表示衷心感谢。由于译者水平所限,书中谬误之处在所难免,恳请广大读者不吝批评指正。
李文军 高晓燕
2009年9月于广州康乐园
前言回到顶部↑
实用且复杂的现代信息系统并不是从累积的偶然事件中发展起来的。编译程序作为一个实用的信息系统,只有经过精心设计,才能以简单的措辞理解其复杂性。不仅未经设计的编译程序会有功能缺陷,编译程序理论本身还依赖于它与两种理论之间的一种微妙关系,其中一种理论是源自人类自然语言的语言学原理,另一种理论是将计算机看作有穷状态自动机。理解并利用这一关系需在文法理论的基本原理方面有扎实的根基,并熟练掌握其机械化实现过程。因而编译程序设计的教学亦涉及一个复杂的信息系统,需精心设计才能以连贯、合理的次序展示相关概念,从而让学生体会到编译程序设计的内容既是相关的,也是可管理的。
本书并非一本试图以所有可能的方法去构造所有可能的编译程序的百科全书,而是依次介绍编译程序设计中的最基本问题;其内容的深度足以让勤奋的学生有能力通过手工方式或使用编译程序生成工具(亦或两种方式之结合),构造实用且高效的编译程序。更重要的是,学生将明白这些工具是如何工作的,以及为什么必须以某种方式书写文法方可取得预期的结果。这正是设计的原则。因此,尽管大多数现代分析程序生成工具采用自底向上分析技术,但本书深入研究有更多限制的自顶向下分析理论,然后才利用相对简短(但完整)的一章内容学习自底向上分析程序。本书每一章的目标都是先灌输对基本概念的理解,然后再将这些概念应用到实践中。
与同类教材相比,本书在四个重要方面有显著特色。第一个特色是,它坚定不移地扎根于文法,一开始就介绍文法和语言识别器之间的理论关系,然后贯穿全书将文法技术应用到编译程序设计的每一方面。第二个特色是,统一将实用的属性文法作为编译程序语义的载体,坚持这一立场自然会产生一个完全由属性文法定义的、可编译其自身的“编译程序-编译程序”,这正是本书最后一章的重点。第三个特色是,具有非常实用的特征,编译程序的设计必须以属性文法定义,而编译程序的构造则需要可执行的代码,并且每一个重要的理论原则均需通过一种真实程序设计语言的大量代码清单加以阐明,不断展示文法与机器代码之间极其自然的关系。第四个特色是,选择Modula-2作为演示代码的程序设计语言,旨在概念抽象与具体效率之间取得平衡;与C语言等更低级的语言相比,应用本书后几章所介绍的优化技术能以更低的开销更显著地提高Modula-2程序的效率。
本书可用于一学期的编译原理入门课程,重点介绍前6章或前7章。本书亦可用于整学年的学习,更好地涉猎更多的高级课题。一学期的课程学习可安排在半年或一个季度的时间内完成;经过不断优化和实际教学检验,本书循序渐进地布置学生实验项目,并在期末完成一个可工作的Itty Bitty Modula编译程序,该编译程序可在最终的实验项目中用于编译另一个分析程序,例如第6章最后概述的美化打印工具或Tiny BASIC语言解释程序。
书中的某些章节和练习被设计为任选的。虽然我们坚信编译程序设计需要扎实的理论基础,但根据时间安排或学生能力等,某些章节中的一些趣味数学内容可略过,这些内容在其页边空白处用一个“教师授课”图标
注明。另一些章节虽与编译程序设计的主要问题密切相关,但由于本书的定位是初学编译原理的学生,他们的水平难以理解这些内容,因而在这些章节的页边空白处标注了一个“石中剑”图标 。类似地,有些问题富有挑战性,读者解决这些问题有助于更好地理解编译程序设计的错综复杂,但不在这些问题上花费额外的时间和精力,也不影响对课程内容的良好理解,因而在这些问题的页边空白处也标注了“石中剑”图标。
尽管无法逐一向所有对本教材作出贡献的人致谢,我们仍要首先感谢Brad Blaker,没有他的鼓励和早期协助,本书将不会面世;感谢Bill Hankley、Austin Melton和堪萨斯州立大学耐心的同学们,他们坚持使用了早期的书稿;感谢Frank DeRemer孕育了书中的许多思想。Thom Boyer、Dick Karpinski、Brian Kernighan、Marvin Zelkowitz、Wayne Citrin、Norman C. Hutchinson、Johnson M. Hart、Bernhard Weinberg、Will Gillett,特别是Dean Pittman、Chota和Dave Schmidt等人提出的意见和建议对本书的最终定稿有莫大帮助。
Thomas Pittman
James Peters
本书并非一本试图以所有可能的方法去构造所有可能的编译程序的百科全书,而是依次介绍编译程序设计中的最基本问题;其内容的深度足以让勤奋的学生有能力通过手工方式或使用编译程序生成工具(亦或两种方式之结合),构造实用且高效的编译程序。更重要的是,学生将明白这些工具是如何工作的,以及为什么必须以某种方式书写文法方可取得预期的结果。这正是设计的原则。因此,尽管大多数现代分析程序生成工具采用自底向上分析技术,但本书深入研究有更多限制的自顶向下分析理论,然后才利用相对简短(但完整)的一章内容学习自底向上分析程序。本书每一章的目标都是先灌输对基本概念的理解,然后再将这些概念应用到实践中。
与同类教材相比,本书在四个重要方面有显著特色。第一个特色是,它坚定不移地扎根于文法,一开始就介绍文法和语言识别器之间的理论关系,然后贯穿全书将文法技术应用到编译程序设计的每一方面。第二个特色是,统一将实用的属性文法作为编译程序语义的载体,坚持这一立场自然会产生一个完全由属性文法定义的、可编译其自身的“编译程序-编译程序”,这正是本书最后一章的重点。第三个特色是,具有非常实用的特征,编译程序的设计必须以属性文法定义,而编译程序的构造则需要可执行的代码,并且每一个重要的理论原则均需通过一种真实程序设计语言的大量代码清单加以阐明,不断展示文法与机器代码之间极其自然的关系。第四个特色是,选择Modula-2作为演示代码的程序设计语言,旨在概念抽象与具体效率之间取得平衡;与C语言等更低级的语言相比,应用本书后几章所介绍的优化技术能以更低的开销更显著地提高Modula-2程序的效率。
本书可用于一学期的编译原理入门课程,重点介绍前6章或前7章。本书亦可用于整学年的学习,更好地涉猎更多的高级课题。一学期的课程学习可安排在半年或一个季度的时间内完成;经过不断优化和实际教学检验,本书循序渐进地布置学生实验项目,并在期末完成一个可工作的Itty Bitty Modula编译程序,该编译程序可在最终的实验项目中用于编译另一个分析程序,例如第6章最后概述的美化打印工具或Tiny BASIC语言解释程序。
书中的某些章节和练习被设计为任选的。虽然我们坚信编译程序设计需要扎实的理论基础,但根据时间安排或学生能力等,某些章节中的一些趣味数学内容可略过,这些内容在其页边空白处用一个“教师授课”图标
注明。另一些章节虽与编译程序设计的主要问题密切相关,但由于本书的定位是初学编译原理的学生,他们的水平难以理解这些内容,因而在这些章节的页边空白处标注了一个“石中剑”图标 。类似地,有些问题富有挑战性,读者解决这些问题有助于更好地理解编译程序设计的错综复杂,但不在这些问题上花费额外的时间和精力,也不影响对课程内容的良好理解,因而在这些问题的页边空白处也标注了“石中剑”图标。
尽管无法逐一向所有对本教材作出贡献的人致谢,我们仍要首先感谢Brad Blaker,没有他的鼓励和早期协助,本书将不会面世;感谢Bill Hankley、Austin Melton和堪萨斯州立大学耐心的同学们,他们坚持使用了早期的书稿;感谢Frank DeRemer孕育了书中的许多思想。Thom Boyer、Dick Karpinski、Brian Kernighan、Marvin Zelkowitz、Wayne Citrin、Norman C. Hutchinson、Johnson M. Hart、Bernhard Weinberg、Will Gillett,特别是Dean Pittman、Chota和Dave Schmidt等人提出的意见和建议对本书的最终定稿有莫大帮助。
Thomas Pittman
James Peters

点击看大图






加载中...
