编译器构造,C语言描述(英文版)
作者 : Charles N.Fischer, Richard J.LeBlanc
丛书名 : 经典原版书库
出版日期 : 2005-03-11
ISBN : 7-111-15897-0
定价 : 79.00元
教辅资源下载
扩展信息
语种 : 英文
页数 : 812
开本 : 16开
原书名 : Crafting A Compiler with C
原出版社: Benjamin/Cummings Publishing Company,Inc
属性分类: 教材
包含CD :
绝版 :
图书简介

本书提供了创新的编译器构造方法,通过大量的示例和练习,读者可以从头至尾学习如何设计一个可用的编译器。书中均衡讨论了编译器设计中的理论与实现两大部分,详细讨论了标准编译器设计的相关主题 (如自顶向下和自底向上的语法分析、语义分析、中间表示和代码生成) 。本书中所有的程序均采用易读的基于C语言的代码来表示。本书是一本优秀的编译器构造方面的教材,已经被国际上多所大学所采纳,适用于高等院校计算机专业的学生和使用C语言的专业程序员。均衡讨论编译器设计的理论与实现两大部分,既很好地介绍了编译器理论,又提供了大量的编译器设计示例和练习。

本书的主要特点
  强调使用可以生成语法分析器和词法分析器的编译器工具。
  彻底讨论LR语法分析和归约技术。
  介绍了FLex和ScanGen。
  在每章末尾包含可选的高级主题。

图书特色

图书前言

本书以作者实现编译器和开发编译器构造课程的经验为基础,介绍了编译器构造的实际方法。其宗旨是使读者不仅能够对编译器的所有组件有深入的理解,而且能够对编译器的各组件如何实际组合、构成一个可以工作的编译器有感性认识。我们相信这种理念是本书一个与众不同的特色。因为我们专注于对现代编译器构造技术的介绍,所以强调尽可能地使用编译器工具生成编译器的组件。(附录B~F中所述工具的源代码,可以从出版社网站下载。)
  本书和Crafting a Compiler一书基本相同,只是其中的算法和伪代码示例使用C而不是Ada语法。由于C语言在编译器课程中广泛使用,因此许多教师认为这样的版本会很有价值。为使所有伪代码即使对于那些不是C语言专家的读者也尽可能易读,我们使用了一些标准C语法的扩展(在下面描述),而且并不总是使用通用的C语言惯用法。由于本书作者均不是熟练的C程序员,因此我们感谢Arnold Robbins对本书做了从Ada语言到C语言的转换工作,并给出很多编辑上的建议。

教科书和参考书
  作为教学用书,本书主要面向近15年来我们开发的一种课程组织结构。但是,本书的使用可以非常灵活,已经用于从为期10周的3学分高年级本科生课程到为期3个月的6学分研究生课程教学中。本书也可作为一本有价值的专业参考书,因为它完整覆盖了对编译器编写者和设计者有着重要实际意义的技术。

课程设计方法
  本书全面地覆盖了与构造编译器相关的理论主题。而且,一个密切相关的课程设计实现也是我们课程组织的重要组成部分。因此,本书也是面向课程设计的。附录A包含一个称为 Ada/CS的语言定义,而Ada/CS这种语言主要是Ada程序设计语言的一个重要子集。但出于教学目的,这里介绍的Ada/CS主要是Ada程序设计语言的一个非严格的子集。针对使用本书的课程,我们建议的课程设计可以涉及部分或完整的Ada/CS实现,具体情况要根据课程的长度、层次以及授课教师的要求来定。
本书第2章介绍并讨论一个针对非常简单的Ada/CS子集的递归下降编译器。将上述课程设计实施为该编译器的扩充,可以让学生即使在短到一个学期的课程中也能完成一个较大的课程设计。在时间充裕的情况下,这种扩充方法同样有价值。要求学生阅读并扩充一个实际的程序,可使他们获得在许多计算机科学课程中难以得到的重要经验。这也教会他们如何将编译器的各部分组合起来,而这种知识是难以用其他任何方式来讲授的。

C程序设计语言
  本书中的示例伪代码是采用基于ANSI C的一种语法编写的。从PC机到大型机直到超级计算机,C语言在许多计算环境中都是流行的语言,它小巧且富于表达力、高效,同时通常具有很好的可移植性。C语言最近已成为美国国家标准(ANSI 1989)。支持标准C语法的编译器也已广泛可用,而且将会更加普及。因此,我们选择为示例程序使用ANSI语法而不是在Kernighan和Ritchie的书(1978)中描述的更广为人知的语法。而Kernighan和Ritchie的新书(1988)则是ANSI C的优秀参考书。
  为了将算法尽可能以最易读的方式描述(而不关注语法细节),我们以几种方式扩充了C语言。首先,在正文的几个地方使用了匿名联合(anonymous union),该特性借用自C++语言(Stroustrup 1986)。一个匿名联合看起来像这样:
  注意:该结构的union成员没有名字,联合中的元素作为结构的元素被直接引用。在传统的C语言中,同样的行为通常通过宏预处理器获得:
  其次,从第10章开始,使用匿名结构(anonymous structure)作为匿名联合的成员。实际编程中,这些结构需要通过上面描述的预处理器方案实现。
  最后,在许多高层伪代码示例中,使用下列构造函数(constructor)机制来创建结构表达式:
  尽管这种结构不能使用一个宏来代替,但其含义显而易见。
  一般情况下,在使用高层伪代码而不是正规C语言时,我们将这些图标记为“算法”而不是“程序”。
  与Crafting a Compiler一样,在使用本书的课程中不必使用任何特定的语言来实现课程设计。不论选择哪种实现语言,伪代码都是极佳的设计描述手段。此外,我们提供的词法分析器和语法分析器生成工具生成的是表格而不是程序,因此它们可用于任何语言环境中。为了那些使用C语言实现课程设计的读者,我们也讨论Lex和Yacc的使用。

Ada的角色
  我们所建议的课程设计和对语言特性的讨论都基于Ada语言,因为它事实上包含了在语义分析部分我们希望讨论的所有语言特性。假如选择任何其他语言作为基础(例如Modular-2),就必须描述很多扩充以讨论编译这些东西(比如exit语句、异常处理和操作符重载)的技术。
  使用本书的学生当然不必熟悉Ada语言。附录A中的Ada/CS介绍可以作为在语义分析部分所讨论的Ada语言特性的教程。在适当的情况下,我们也考虑从其他语言(包括Modula-2、Pascal、C、ALGOL-60、ALGOL-68以及Simula)中抽取的语言特性的翻译。

各章描述
  本书作为入门课程,可以讲授第1~4章、第5章或第6章、第7章以及第8~13章和第15章的部分内容。
  本书作为高级课程,可以包含讲述语法分析的各章(第5~6章)的内容,以及第8~13章和第15章加上第14、16和17章的高级主题部分。
  第1章  绪论
  在本书的一开始概述编译过程,强调从一组组件构造编译器的概念,介绍使用工具生成其中一些组件的思想。
  第2章  一个简单编译器
  介绍一个非常简单的语言Micro,讨论编译Micro的编译器的每个组件。本章包含Micro编译器的部分文本(用Ada语言编写)。而对更全面的Ada子集的语言特性的编译则引出了以下各章所介绍的技术。
  第3章  词法分析——理论与实践
  介绍构造编译器词法分析组件的基本概念和技术。本章中的讨论既包括开发手写的词法分析器,又包括使用词法分析器生成工具实现表驱动的词法分析器。
  第4章  文法和分析
  介绍形式语言概念和文法的基本知识,包括上下文无关文法、BNF表示法、推导和语法分析树。由于在自顶向下和自底向上的语法分析技术的定义中都用到First和Follow集,本章也对它们进行了定义。本章还包括对语言和文法关系的讨论。
  第5章  LL(1)文法及分析器
  介绍语法分析的第一种方法—自顶向下的语法分析。讨论递归下降和LL(1),重点放在后者。语法分析器生成器的使用是本章的重点。
  第6章  LR分析
  介绍另一种语法分析方法—自底向上的语法分析。介绍LR、SLR和LALR语法分析概念及其与LL技术的比较。语法分析器生成器的使用也是本章的重点。
  第7章  语义处理
  本章结合自顶向下和自底向上语法分析器来介绍语义处理的基本原理。主题包括:不同编译器组织方式的比较,(在自顶向下的语法分析中)向文法增加动作符号,(在自底向上的语法分析中)为“语义钩子”(semantic hook)重写文法,定义语义记录和使用语义栈,检查语义正确性,产生中间代码。
  第8章  符号表
  本章强调符号表的使用,它作为一个抽象组件由编译器的其他组件通过精确定义的接口使用。本章介绍其可能的实现,随后讨论用符号表处理嵌套的作用域和其他用来定义可从外围作用域(例如记录和Ada中的包)访问的名字的语言特性。
  第9章  运行时存储组织
  介绍运行时存储管理的基本技术,包括静态分配、基于栈的分配和一般动态(堆)分配的讨论。
  第10章  处理声明
  讨论处理类型、变量和常量声明的基本技术。这些内容的组织基于处理特定语言特性的语义例程。
  第11章  处理表达式和数据结构引用
  概述处理变量引用和算术、布尔表达式的语义例程。在对变量引用的讨论中,包括针对数组元素和记录域的地址计算方法。在本章及随后两章中,强调检查语义正确性和产生被目标代码生成器使用的中间代码的技术。
  第12章  翻译控制结构
  本章的重点是针对像if语句、case语句和各种循环结构这样的特性的编译技术。强调使用语义栈或语法树简化这些结构的处理。这些结构可以嵌套并扩展到任意规模的程序文本中。学生应通过特定的方法来了解这种通用技术的优点。
  第13章  翻译过程和函数
  介绍处理子程序声明和调用的技术。由于这个主题的很多复杂性涉及参数,本章提供了很多材料来讲述创建参数描述、检查子程序调用中实际参数的正确性以及不同参数模式所需的代码生成技术。这里讨论运行时活动栈的概念,给出实现它所必需的支持例程。
  第14章  属性文法和多遍翻译
  多遍翻译由遍历中间代码形式模拟。本章强调信息流的属性模型。
  第15章  代码生成和局部代码优化
  介绍代码生成器,它作为一个独立组件,将语义例程生成的中间代码翻译为编译器最终的目标代码。介绍像指令选择、寄存器管理和寻址模式的使用等主题。本章还包括对基本块优化的讨论。
  第16章  全局优化
  本章的焦点是那些通过适度的努力可以生成有用代码改进的实用技术。因此,本章的主要部分包括全局数据流分析、优化子程序调用和优化循环。
  第17章  现实世界中的语法分析
  本章包括实现一个实际编译器必需的两个主要课题:语法错误处理和表压缩。错误处理部分介绍用于递归下降、LL和LR分析器的错误恢复和错误修复技术。表压缩技术用于LL和LR分析器,以及词法分析器表和任何其他需要用快速访问稀疏表中的元素来高效存储的场合。

致谢
  很多人为Crafting a Compiler和本书做出贡献。首先,感谢威斯康星大学麦迪逊分校CS 701/2和乔治亚理工学院ICS 4410中的许多学生,他们使用了本书最初版本和最终成为本书部分章节的讲义。此外,还要感谢两所学校里使用我们的讲义授课的许多教师。其中包括Raphael Finkel、Marvin Solomon和K. N. King,他们为我们的讲义贡献了部分材料;还有Nancy Lynch、Martin   McKendry、Nancy Griffeth和David Pitts,他们也使用了我们的讲义。乔治亚理工学院的Arnold Robbins提供了正文中出现的所有C语言代码。他还提供了一些章节的习题、封面设计的想法以及许多对我们写作风格很有用的建议。G A Venkatesh、Will Winsborough和Felix Wu提供了大部分习题的参考答案。Jon Mauney、Gary Sevitsky、Robert Gray和Felix Wu开发了附录中描述的编译器工具。Kathy Schultz出色地完成了手稿的最终订正,Sheryl Pomraning出色地完成了美工工作。
  我们感谢 C. Wrandel Barth、Jean Gallier、James Harp、Harry Lewis、Eric Roberts和Henry Shapiro,他们对我们最初的提议和样章提供了有价值的反馈。我们非常感激Steve Allan、Henry Bauer、Roger Eggen、Norman Hutchinson、Sathis Menon、Jim Bitner、Charles Shipley、Donald K. Friesen、Donald Cooley、Susan Graham、Steve Zeigler,尤其是Paul Hilfinger和Alan
  Wendt—他们作为审阅者提供了大量意见,使我们在很长时间内忙于完成本书及其早期版本。
  最后,感谢Miriam Robbins,她在Arnold努力将大量的Ada算法转换为清晰而精确的C算法时表现出了极大的耐心。

作者简介

Charles N.Fischer, Richard J.LeBlanc:Charles N.Fischer: Charles N. Fischer是威斯康星大学麦迪逊分校的计算机教授,他的研究兴趣主要包括编译器设计和实现等。Richard J. LeBlanc, Jr.是佐治亚理工学院计算学院的教授和副主任,ACM和IEEE计算机协会的会员,他的研究兴趣主要包括软件工程、编程语言设计和实现、编程环境等。
Richard J.LeBlanc: 佐治亚理工学院计算学院的教授和副主任,ACM和IEEE计算机协会会员,他的研究兴趣主要包括软件工程、编程语言设计和实现、编程环境等。

图书目录

Introduction.
Overview and History.
What Do Compilers Do
The Structure of a Compiler.
The Syntax and Semantics of Programming Languages.
Compiler Design and Programming Language Design.
Compiler Classifications.
Influences On Computer Design.
Exercises.
A Simple Compiler.
The Structure of a Micro Compiler.
A Micro Scanner.
The Syntax of Micro.
Recursive Descent Parsing.
Translating Micro.
Exercises.
Scanning--Theory and Practice.
Overview.
Regular Expressions.
Finite Automata and Scanners.
Using a Scanner Generator.
Practical Considerations.
Translating Regular Expressions Into Finite Automata.
Exercises.
Grammars and Parsing.
Context-Free Grammars: Concepts and Notation.
Errors in Context-Free Grammars.
Transforming Extended Bnf Grammars.
Parsers and Recognizers.
Grammar Analysis Algorithms.
Exercises.
Ll(1) Grammars and Parsers.
The Ll(1) Predict Function.
The Ll(1) Parse Table.
Building Recursive Descent Parsers From Ll(1) Tables.
An Ll(1) Parser Driver.
Ll(1) Action Symbols.
Making Grammars Ll(1) / The If-Then-Else Problem in Ll(1) Parsing.
The Llgen Parser Generator.
Properties of Ll(1) Parsers.
Ll(K) Parsing.
Exercises.
Lr Parsing.
Shift-Reduce Parsers.
Lr Parsers.
Lr(1) Parsing.
Slr(1) Parsing.
Lalr(1).
Calling Semantic Routines in Shift-Reduce Parsers.
Using a Parser Generator.
Optimizing Parse Tables.
Practical Lr(1) Parsers.
Properties of Lr Parsers.
Ll(1) Or Lalr(1), That Is The Question.
Other Shift-Reduce Techniques.
Exercises.
Semantic Processing.
Syntax-Directed Translation.
Semantic Processing Techniques.
Intermediate Representations and Code Generation.
Exercises.
Symbol Tables.
A Symbol Table Interface.
Basic Implementation Techniques.
Block-Structured Symbol Tables.
Extensions to Block-Structured Symbol Tables.
Implicit Declarations.
Overloading.
Forward References.
Summary.
Exercises.
Run-Time Storage Organization.
Static Allocation.
Stack Allocation.
Heap Allocation.
Program Layout in Memory.
Static and Dynamic Chains.
Formal Procedures.
Exercises.
Processing Declarations.
Declaration Processing Fundamentals.
Action Routines for Simple Declarations.
Action Routines for Advanced Features.
Exercises.
Processing Expressions and Data Structure References.
Introduction.
Action Routines for Simple Names, Expressions, and Data Structures.
Action Routines for Advanced Features.
Exercises.
Translating Control Structures.
If Statements.
Loops.
Compiling Exits.
The Case Statement.
Compiling Goto Statements.
Exception Handling.
Short-Circuit Boolean Expressions.
Exercises.
Translating Procedures and Functions.
Simple Subprograms.
Passing Parameters to Subprograms.
Processing Subprogram Calls and Parameter Lists.
Subprogram Invocation.
Label Parameters.
Name Parameters.
Exercises.
Attribute Grammars and Multipass Translation.
Attribute Grammars.
Tree-Structured Intermediate Representations.
Exercises.
Code Generation and Local Code Optimization.
An Overview.
Register and Temporary Management.
A Simple Code Generator.
Interpretive Code Generation.
Peephole Optimization.
Generating Code From Trees.
Generating Code From Dags.
Code Generator Generators.
Exercises.
Global Optimization.
An Overview: Goals and Limits.
Optimizing Subprogram Calls.
Loop Optimization.
Global Data Flow Analysis.
Putting it All Together.
Exercises.
Parsing in The Real World.
Compacting Tables.
Syntactic Error Recovery and Repair.
Exercises.
Appendices.
A. Definition of Ada/Cs.
B. Scangen.
C. Llgen User Manual.
D. Lalrgen User Manual.
E. Error-Repair Features of Llgen and Lalrgen.
F. Compiler Development Utilities.
Bibliography.
Index. 0805321667T04062001

教学资源推荐
作者: (美)Y. Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
作者: 杨颂华 熊海灵 主编 杨明 黄春伦 等编著
作者: 孙浩 主编 刘亮 副主编 王宁 张莉萍 参编
参考读物推荐
作者: 快学习教育 编著
作者: (美)Karl Fogel
作者: 揭金良等
作者: 王华 朱时银 史兰 等