内容介绍
基本信息
| 书名: | 程序设计语言编译原理(D3版) |
| 作者: | 陈火旺//刘春林//谭庆平//赵克佳//刘越 | 开本: | |
| YJ: | 39 | 页数: | |
| 现价: | 见1;CY =CY部 | 出版时间 | 2014-12-01 |
| 书号: | 9787118022070 | 印刷时间: | |
| 出版社: | 国防工业出版社 | 版次: | |
| 商品类型: | 正版图书 | 印次: | |
内容提要 作者简介 精彩导读 D一章引论
1.1什么叫编译程序
使用过现代计算机的人都知道,多数用户是应用GJ语言来实现他们所需要的计算的。现代计算机系统一般都含有不止一个的GJ语言编译程序,对有些GJ语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。GJ语言编译程序是计算机系统软件Z重要的组成部分之一,也是用户Z直接关心的工具之一。
在计算机上执行一个GJ语言程序一般要分为两步:D一步,用一个编译程序把GJ语言翻译成机器语言程序;D二步,运行所得的机器语言程序求得计算结果。
通常所说的翻译程序是指这样的一个程序,它能够把某一种语言程序(称为源语言程序)转换成另一种语言程序(称为目标语言程序),而后者与前者在逻辑上是等价的。如果源语言是诸如FORTRAN、Pascal、C、Ada、Smalhalk或Java这样的“GJ语言”,而目标语言是诸如汇编语言或机器语言之类的“低级语言”,这样的一个翻译程序J称为编译程序。
GJ语言程序除了像上面所说的先编译后执行外,有时也可“解释’’执行。一个源语言的解释程序是这样的程序,它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。本书将不对解释程序作专门的讨论。实际上,许多编译程序的构造与实现技术同样适用于解释程序。
根据不同的用途和侧重,编译程序还可进一步分类。专门用于帮助程序开发和调试的编译程序称为诊断编译程序(DiagDsticCompiler),着重于提高目标代码效率的编译程序”4优化编译程序(0ptiIIlizingCompiler)。现在很多编译程序同时提供了调试、优化等多种功能,用户可以通过“开关”进行选择。运行编译程序的计算机称宿主机,运行编译程序所产生目标代码的计算机称目标机。如果一个编译程序产生不同于其宿主机的机器代码,则称它为交叉编译程序(CrossCompiler)。如果不需重写编译程序中与机器无关的部分J能改变目标机,则称该编译程序为可变目标编译程序(RetargetableCompile,)。
SJ上D一个编译程序——FORrⅡ认N编译程序是20世纪50年代中期研制成功的。D时,人们普遍认为设计和实现编译程序是一件十分困难、令人生畏的事情。经过40年的努力,编译理论与技术得到迅速发展,现在已形成了一套比较成熟的、系统化的理论与方法,并且开发出了一些好的编译程序的实现语言、环境与工具。在此基础上设计并实现一个编译程序不再是高不可攀的事情。
本书主要介绍设计和构造编译程序的基本原理和方法。我们不想罗列太多细节性的材料,着重讲一些原理性的东西,但将反映一些ZX的进展。
…… 目录 D一章 引论 1.1 什么叫编译程序 1.2 编译过程概述 1.3 编译程序的结构 1.3.1 编译程序总框 1.3.2 表格与表格管理 I.3.3 出错处理 1.3.4 遍 1.3.5 编译前端与后端 1.4 编译程序与程序设计环境 1.5 编译程序的生成 D二章 GJ语言及其语法描述 2.1 程序语言的定义 2.1.1 语法 2.1.2 语义 2.2 GJ语言的一般特性 2.2.1 GJ语言的分类 2.2.2 程序结构 2.2.3 数据类型与操作 2.2.4 语句与控制结构 2.3 程序语言的语法描述 2.3.1 上下文无关文法 2.3.2 语法分析树与二义性 2.3.3 形式语言鸟瞰 练 习 D三章 词法分析 3.1 对于词法分析器的要求 3.1.1 词法分析器的功能和输出形式 3.1.2 词法分析器作为一个D立子程序 3.2 词法分析器的设计 3.2.1 输入、预处理 3.2.2 单词符号的识别:超前搜索 3.2.3 状态转换图 3.2.4 状态转换图的实现 3.3 正规表达式与有限自动机 3.3.1 正规式与正规集 3.3.2 确定有限自动机(DFA) 3.3.3 非确定有限自动机(NFA) 3.3.4 正规文法与有限自动机的等价性 3.3.5 正规式与有限自动机的等价性 3.3.6 确定有限自动机的化简 3.4 词法分析器的自动产生 3.4.1 语言LEX的一般描述 3.4.2 超前搜索 3.4.3 LEX的实现 练 习 D四章 语法分析——自上而下分析 4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.3.1 左递归的消除 4.3.2 消除回溯、提左因子 4.3.3 LL(1)分析条件 4.4 递归下降分析程序构造 4.5 预测分析程序 4.5.1 预测分析程序工作过程 4.5.2 预测分析表的构造 4.6 LL(1)分析中的错误处理 练 习 D五章 语法分析——自下而上分析 5.1 自下而上分析基本问题 5.1.1 归约 5.1.2 规范归约简述 5.1.3 符号栈的使用与语法树的表示 5.2 算符优先分析 5.2.1 算符优先文法及优先表构造 5.2.2 算符优先分析算法 5.2.3 优先函数 5.2.4 算符优先分析中的出错处理 *5.3 LR分析法 5.3.1 LR分析器 5.3.2 LR(0)项目集族和LR(0)分析表的构造 5.3.3 SLR分析表的构造 5.3.4 规范LR分析表的构造 5.3.5 LALR分析表的构造 5.3.6 二义文法的应用 5.3.7 LR分析中的出错处理 5.4 语法分析器的自动产生工具YAcc 练 习 D六章 属性文法和语法制导翻译 6.1 属性文法 6.2 基于属性文法的处理方法 6.2.1 依赖图 6.2.2 树遍历的属性计算方法 6.2.3 一遍扫描的处理方法 6.2.4 抽象语法树 6.3 S一属性文法的自下而上计算 6.4 L一属性文法和自1;CY =CY向下翻译 6.4.1 翻译模式 6.4.2 自1;CY =CY向下翻译 6.4.3 递归下降翻译器的设计 6.5 自下而上计算继承属性 6.5.1 从翻译模式中去掉嵌入在产生式中间的动作一 6.5.2 分析栈中的继承属性 6.5.3 模拟继承属性的计算 6.5.4 用综合属性代替继承属性 练 习 D七章 语义分析和中间代码产生 7.1 中间语言 7.1.1 后缀式 7.1.2 图表示法 7.1.3 三地址代码 7.2 说明语句 7.2.1 过程中的说明语句 7.2.2 保留作用域信息 7.2.3 记录中的域名 7.3 赋值语句的翻译 7.3.1 简单算术表达式及赋值语句 7.3.2 数组元素的引用 7.3.3 记录中域的引用 7.4 布尔表达式的翻译 7.4.1 数值表示法 7.4.2 作为条件控制的布尔式翻译 7.5 控制语句的翻译 7.5.1 控制流语句 7.5.2 标号与got语句 7.5.3 CASE语句的翻译 7.6 过程调用的处理 7.7 类型检查 7.7.1 类型系统 7.7.2 类型检查器的规格说明 7.7.3 函数和运算符的重载 7.7.4 多态函数 练 习 D八章 符号表 8.1 符号表的组织与作用 8.1.1 符号表的作用 8.1.2 符号表的组织方式 8.2 整理与查找 8.2.1 线性表 8.2.2 对折查找与二叉树 8.2.3 杂凑技术 8.3 名字的作用范围 8.3.1 FORTRAN的符号表组织 8.3.2 Pascal的符号表组织 8.4 符号表的内容 练 习 D九章 运行时存储空间组织 9.1 目标程序运行时的活动 9.1.1 过程的活动 9.1.2 参数传递 9.2 运行时存储器的划分 9.2.1 运行时存储器的划分 9.2.2 活动记录 9.2.3 存储分配策略 9.3 静态存储分配 9.3.1 数据区 *9.3.2 公用语句的处理 *9.3.3 等价语句的处理 *9.3.4 地址分配 9.3.5 临时变量的地址分配 9.4 简单的栈式存储分配 9.4.1 C的活动记录 9.4.2 C的过程调用、过程进入、数组空间分配和过程返回 9.5 嵌套过程语言的栈式实现 9.5.1 非局部名字的访问的实现 9.5.2 参数传递的实现 9.6 堆式动态存储分配 9.6.1 堆式动态存储分配的实现 9.6.2 隐式存储回收 练 习 D十章 优化 10.1 概述 10.2 局部优化 10.2.1 基本块及流图 10.2.2 基本块的DAG表示及其应用. 10.3 循环优化 10.3.1 代码外提 10.3.2 强度削弱 10.3.3 删除归纳变量 *10.4 数据流分析 10.4.1 任意路径数据流分析 10.4.2 全路径数据流分析 10.4.3 数据流问题的分类 10.4.4 其它主要的数据流问题 10.4.5 利用数据流信息进行全局优化 练 习 D十一章 目标代码生成 11.1 基本问题 11.2 目标机器模型 11.3 一个简单的代码生成器 11.3.1 待用信息 11.3.2 寄存器描述和地址描述 11.3.3 代码生成算法 11.4 寄存器分配 11.5 DAG的目标代码 11.6 窥孔优化 练 习 D十二章 并行编译基础 12.1 并行计算机及其编译系统. 12.1.1 向量计算机 12.1.2 共享存储器多处理机 12.1.3 分布存储器大规模并行计算机 12.1.4 并行编译系统的结构 12.2 基本概念 12.2.1 向量与向量的次序 12.2.2 循环模型与索引空间 12.2.3 输入与输出集合 12.2.4 语句的执行顺序 12.3 依赖关系 12.3.1 依赖关系定义 12.3.2 语句依赖图 12.3.3 依赖距离、依赖方向与依赖层次 12.4 依赖关系问题 12.5 依赖关系测试 12.6 循环的向量化与并行化 12.7 循环变换技术 练 习 参考文献
目录
。。。。。。。。。。
《程序设计语言编译原理(第3版)》简介 本书是一部深入剖析程序设计语言实现机制的经典著作,旨在为读者构建一座坚实的理论桥梁,连接抽象的编程语言概念与实际的计算机执行过程。本书的第三版,在继承前两版精华的基础上,结合了近年来编译技术的新发展和学术界的新思考,内容更加翔实,案例更加丰富,理论更加深化,旨在为有志于深入理解程序设计语言本质、掌握高级程序设计技术、甚至投身于编译器设计与开发的读者提供一份全面而系统的指导。 核心内容与结构概览: 本书的整体架构紧密围绕着编译器的典型工作流程展开,从前端的词法分析、语法分析、语义分析,到后端的中间代码生成、代码优化,再到最终的目标代码生成,层层递进,环环相扣。每一部分都进行了详尽的阐述,力求让读者在掌握理论知识的同时,也能理解其在实际编译器构建中的应用。 第一部分:编译器的基本概念与回顾 在深入探讨具体编译技术之前,本书首先为读者构建了一个宏观的理解框架。 何为编译器? 这里不仅仅是定义,更是对编译器在现代软件开发生态中的重要性进行定位。从高级语言到机器语言的转换,是软件运行的基石。本书将追溯编译器的历史演进,分析不同类型编译器的特点(如解释器、汇编器、链接器等),并简要介绍编译过程中涉及的主要阶段和相互关系。 抽象语法树(AST)与中间表示(IR):在词法和语法分析之后,源代码会被转换成一种更易于计算机处理的中间形式。本书将详细讲解AST的概念,它如何精确地反映程序的结构,以及如何在后续阶段被进一步加工。此外,对多种常见的中间表示(IR)形式,如三地址码、控制流图(CFG)等,也会进行介绍,并阐述它们在代码优化中的关键作用。 编译器的设计哲学:本书还会探讨一些指导编译器设计的核心理念,例如模块化设计、可移植性、效率与正确性的权衡等,为读者提供一个高屋建瓴的视角。 第二部分:前端——源代码的理解与解析 这是编译器工作的开端,其核心任务是理解并解析输入的源代码,将其转化为结构化的中间表示。 词法分析(Lexical Analysis): 基本原理:详细讲解如何将源代码字符串分解成一系列有意义的“标记”(tokens)。这包括对字母、数字、运算符、关键字、标识符等的识别。 正则表达式与有限自动机:深入介绍正则表达式作为描述词法模式的强大工具,以及如何将正则表达式转换为确定性有限自动机(DFA)或非确定性有限自动机(NFA),进而实现高效的词法扫描。书中会给出大量的例子,演示如何构造这些自动机来匹配各种语言结构。 词法分析器的实现:提供构建实际词法分析器的策略和技巧,包括如何处理关键字、标识符的区分,以及如何报告词法错误。 语法分析(Syntax Analysis): 文法与语法树:介绍形式文法的概念,特别是上下文无关文法(Context-Free Grammar, CFG),并阐述语法规则如何定义程序的合法结构。 自顶向下与自底向上分析:详细讲解两种主要的语法分析方法。 自顶向下分析:包括递归下降分析、LL(1)分析等。重点解释预测分析表的构建,以及如何处理左递归和左因子等文法问题。 自底向上分析:包括移入-归约分析、LR(0)、SLR(1)、LALR(1)以及LR(1)分析等。书中会深入讲解LR分析的核心思想,状态转移表的构造,以及如何生成并使用解析器。 语法制导翻译:将语法分析与语义信息的提取紧密结合,通过在语法规则中嵌入语义动作,实现对语法结构的语义属性的计算。 错误恢复:分析语法分析过程中可能出现的错误,并介绍一些有效的错误恢复策略,使得编译器在遇到错误时能够继续分析,从而报告更多的错误信息。 语义分析(Semantic Analysis): 类型检查(Type Checking):这是语义分析的核心部分。本书将详细介绍如何检查程序中的类型兼容性,包括基本数据类型、复合数据类型(如数组、结构体、指针)的类型规则,以及函数调用、运算符重载等涉及的类型匹配问题。 符号表管理(Symbol Table Management):介绍符号表的作用,如何存储和查找标识符的信息(如类型、作用域、存储位置等),以及在编译过程中如何动态地维护符号表。 作用域规则:讲解变量、函数等标识符的作用域规则,包括静态作用域和动态作用域,以及如何根据作用域规则进行访问控制和名字解析。 控制流与数据流分析的初步:为后续的优化阶段打下基础,介绍一些初步的控制流和数据流分析的概念,为理解程序逻辑的连贯性和信息传递提供基础。 第三部分:后端——程序的高效执行 在理解了程序的结构和含义之后,后端的工作是将中间表示转换为高效可执行的目标代码。 中间代码生成(Intermediate Code Generation): 多样的中间表示:除了前述的AST和三地址码,还会介绍更适合代码生成的中间表示,如静态单赋值(SSA)形式。 基于语法制导的生成:如何从语法分析阶段产生的中间结果高效地生成高质量的中间代码。 具体代码生成示例:针对各种语言结构(如表达式、语句、函数调用、控制流语句)提供具体的中间代码生成模式。 代码优化(Code Optimization): 优化目标与分类:解释代码优化的目的,如减小代码尺寸、提高执行速度、降低功耗等。并按优化发生的层次(如机器无关优化、机器相关优化)进行分类。 局部优化:针对单个基本块内的优化,如常量折叠、代数简化、公共子表达式消除等。 全局优化:针对整个函数或程序的优化,如循环优化(循环不变代码外提、代码调度)、过程间分析与优化、死代码消除、强度削弱等。 数据流分析:深入讲解各种数据流分析技术(如定义-使用链、活跃变量分析、常数传播、到达定义分析等),它们是实现许多全局优化的基础。 控制流图(CFG):介绍如何构建和利用CFG来分析程序的控制流,为全局优化提供支持。 指令选择与寄存器分配:将中间代码转换为目标机器指令,并高效地分配寄存器,以减少对内存的访问,提高执行效率。 目标代码生成(Target Code Generation): 指令集架构(ISA):介绍不同目标平台(如x86、ARM等)的指令集特点,以及如何根据ISA生成相应的机器码。 指令选择:将中间代码中的操作映射到具体的目标机器指令。 寄存器分配:一种至关重要的优化技术,本书将深入探讨图着色算法等经典的寄存器分配方法。 指令调度:重新安排指令的顺序,以最大化指令流水线的使用效率。 代码复用与链接:介绍编译器如何处理库函数调用、外部符号引用等,并简要涉及链接器的作用。 第四部分:高级主题与现代编译技术 本书的第三版特别增加了对现代编译技术和相关领域前沿的探讨。 面向对象语言的编译:针对C++、Java等面向对象语言的特性,如类、继承、多态、虚函数等,讲解其在编译过程中的特殊处理方式,如方法查找、对象布局、动态分派等。 函数式语言的编译:介绍函数式语言的特点(如不可变性、高阶函数、惰性求值等),以及它们在编译过程中面临的挑战和解决方案。 并行与并发程序的编译:探讨如何针对多核处理器和并行计算模型生成高效的代码,如线程调度、同步机制、数据并行等。 即时编译(JIT)与动态代码生成:深入讲解Java虚拟机(JVM)和.NET CLR等中的JIT编译技术,以及其在性能提升方面的作用。 程序分析与静态检查:除了编译过程本身,本书还会触及静态程序分析的技术,如污点分析、别名分析等,这些技术在代码安全性和可靠性方面扮演着重要角色。 现代编译工具与框架:简要介绍一些业界主流的编译器框架,如LLVM、GCC等,让读者了解实际开发中的工具链。 贯穿全书的特点: 理论与实践并重:本书不仅提供了扎实的理论基础,还通过大量的算法描述、伪代码示例以及对实际编译器设计中的权衡进行分析,帮助读者将理论知识转化为实践能力。 清晰的逻辑与循序渐进:本书的章节安排遵循编译器工作的自然流程,从简单到复杂,从基础到高级,确保读者能够逐步建立起完整的知识体系。 丰富的例证:书中穿插了大量来自常见程序设计语言(如C、Java、Python等)的例子,使得抽象的概念更加具体生动,易于理解。 面向读者群体:本书适合计算机科学与技术、软件工程等专业的本科生、研究生,以及对编译器技术、程序语言理论、软件开发工具等领域感兴趣的从业人员。 通过学习本书,读者将能够深入理解程序设计语言的内在机制,能够更有效地编写和调试程序,能够独立设计和实现简单的编译器,并为进一步探索计算科学更深层次的奥秘打下坚实的基础。本书是每一位追求技术深度和理论严谨的计算机科学爱好者的必备读物。