编译器设计之路 [平装] 7111321642,978711132

配送至
$ $ USD

《编译器设计之路》系统地介绍了一个实际的Pascal编译器Neo Pascal的设计与实现。结合Neo Pascal的源代码,详细讲述了LL(1)语法分析器、符号表系统、中间表示、类型系统、优化技术、运行时刻的存储管理、代码生成器等编译器设计的核心话题。各章都附有少量以实践应用为主的练习题,既可作为阅读思考题,也可作为课程设计选题。 与国内其他介绍编译技术的图书相比,《编译器设计之路》更关注的是编译器的实现细节,而不仅仅局限于理论阐述。《编译器设计之路》可供从事编译器设计相关工作的工程人员阅读,也可作为高等院校计算机专业的编译原理课程参考书。
编辑推荐
《编译器设计之路》:完整介绍一个实际编译器Neo Pascal的设计与实现,详细讲述LL(1)分析器、符号表系统、优化等核心话题。 阐述系统软件的设计观点 探讨现代编译技术热点 提供编译器全部源代码
目录
出版说明 前言 第1章 概述 1.1 编译技术概述 1.1.1 程序设计语言基础 1.1.2 程序设计语言的翻译机制 1.1.3 编译器的基本结构 1.2 Pascal语言基础 1.2.1 Pascal语言简介 1.2.2 Pascal程序基本组成 1.2.3 Pascal的声明部分 1.2.4 Pascal的类型 1.2.5 Pascal的运算符 1.2.6 Pascal的语句 1.3 开发环境与Delphi基础 1.3.1 开发环境与文件列表 1.3.2 Delphi基础 1.4 深入学习 1.5 实践与思考 1.6 大师风采——Niklaus Wirth 第2章 词法分析 2.1 词法分析概述 2.1.1 词法分析的任务 2.1.2 单词的分类 2.2 词法分析器的设计 2.2.1 识别单词 2.2.2 转换图 2.2.3 构造词法分析器 2.3 词法分析器的实现 2.3.1 词法定义 2.3.2 构造转换图与转换表 2.3.3 相关数据结构 2.3.4 源代码实现 2.4 深入学习 2.5 实践与思考 2.6 大师风采——Dennis M.Ritchie 第3章 语法分析 3.1 程序设计语言的语法描述 3.1.1 上下文无关文法 3.1.2 推导 3.1.3 语法树 3.1.4 归约简介 3.2 语法分析概述 3.2.1 语法分析的任务 3.2.2 自上而下的语法分析法 3.2.3 构造语法分析器 3.3 语法分析器的实现 3.3.I文法定义 3.3.2 语法分析表 3.3.3 源代码实现 3.4 深入学习 3.5 实践与思考 3.6 大师风采——Edsger Wybe Dijkstra 第4章 符号表系统 4.1 语义分析概述 4.1.1 程序设计语言的语义 4.1.2 语义分析与IR生成的任务 4.1.3 语法制导翻译 4.2 符号表设计 4.2.1 符号表概述 4.2.2 符号表的逻辑结构 4.2.3 符号表的实例分析 4.3 声明部分的实现 4.3.1 相关数据结构 4.3.2 主程序首部声明 4.3.3 包含文件声日月部分 4.3.4 标号声明部分 4.3.5 常量声明部分 4.3.6 类型声明部分 4.3.7 变量声明部分 4.3.8 过程、函数声明部分 4.4 深入学习 4.5 实践与思考 4.6 大师风采——John Backus 第5章 中间表示 5.1 IR概述 5.1.1 IR的作用 5.1.2 IR设计及其级别 5.1.3 设计IR的重要意义 5.2 IR生成. 5.2.1 三地址代码概述 5.2.2 Neo Pascal三地址代码的实现 5.2.3 翻译机制概述 5.3 语句翻译概述 5.3.1 语句翻译基础 5.3 12翻译辅助函数及其实现 5.4 if语句 5.4.1 if语句的翻译 5.4.2 源代码实现 5.5 while/repeat语句 5.5.1 while语句的翻译 5.5.2 源代码实现 5.5.3 repeat语句的翻译 5.6 for语句 5.6.1 for语句的翻译 5.6.2 源代码实现 5.7 case语句 5.7.1 case语句的翻译 5.7.2 源代码实现 5.8 其他语句 5.8.1 break、continue语句的翻译 5.8.2 goto语句的翻译 5.8.3 asm语句的翻译 5.9 深入学习 5.10 实践与思考 5.11 大师风采——Kenneth E. Iverson 第6章 表达式语义 6.1 表达式概述 6.2 类型系统基础 6.2.1 类型基础 6.2.2 类型系统 6.2.3 类型转换 6.3 类型系统的实现 6.3.1 类型系统的设计 6.3.2 IR的操作数 6.3.3 类型相容的实现 6.3.4 类型推断的实现 6.4 表达式翻译 6.4.1 表达式翻译基础 6.4.2 深入表达式翻译 6.4.3 表达式翻译的实现 6.5 操作数翻译 6.5.1 操作数的地址与形态 6.5.2 操作数翻译基础 6.5.3 简单变量操作数的翻译 6.5.4 记录字段操作数的翻译 6.5.5 数组翻译基础 6.5.6 数组元素操作数的翻译 6.5.7 指针运算的翻译 6.6 深入学习 6.7 实践与思考 6.8 大师风采——Alan Kay 第7章 优化技术 7.1 优化概述 7.1.1 什么是优化 7.1.2 优化级别 7.2 控制流分析 7.2.1 流图与基本块 7.2.2 流图的数据结构 7.2.3 流图的构造 7.2.4 优化的分类 7.3 数据流分析 7.3.1 数据流的相关概念 7.3.2 数据流分析的策略 7.3.3 活跃变量分析 7.3.4 ud链与du链 7.3.5 更多数据流问题 7.4 数据流分析的实现. 7.4.1 定值点与引用点分析的基础 7.4.2 定值点、引用点分析的相关数据结构 7.4.3 定值点、引用点分析的实现 7.4.4 活跃变量分析的实现 7.4.5 ud链、du链分析的实现 7.5 常量传播与常量折叠 7.5.1 常量传播基础 7.5.2 常量传播的实现 7.6 复写传播 7.6.1 复写传播的基础 7.6.2 复写传播的实现 7.7 代数简化 7.7.1 代数简化基础 7.7.2 代数简化的实现 7.8 跳转优化 7.8.1 跳转优化基础 7.8.2 条件跳转优化的实现 7.8.3 连续跳转优化的实现 7.9 冗余代码删除 7.9.1 冗余代码删除基础 7.9.2 死代码删除的实现 7.9.3 不可到达代码删除的实现 7.1 0深入学习 7.1 1实践与思考 7.1 2大师风采——Richard Stallman 第8章 运行时刻的存储管理 8.1 存储管理概述 8.1.1 存储区域 8.1.2 存储布局 8.1.3 存储分配基础 8.2 栈式存储分配 8.2.1 栈式存储分配基础 8.2.2 i386栈式存储分配 8.2.3 深入理解栈式存储分配 8.3 存储分配的实现 8.4 存储优化 8.4.1 存储优化基础 8.4.2 存储优化的实现 8.5 深入学习 8.6 实践与思考 8.7 大师风采——Bjarne Stroustrup 第9章 目标代码生成 9.1 目标代码生成概述 9.1.1 目标代码生成基础 9.1.2 指令选择 9.1.3 寄存器分配 9.2 目标机简介 9.2.1 目标机结构 9.2.2 浮点处理单元 9.2.3 操作数寻址方式 9.2.4 ptr操作符 9.2.5 一个完整的汇编程序 9.3 构造代码生成器 9.3.1 自动代码生成器基础 9.3.2 指令模板 9.3.3 寄存器描述 9.3.4 寄存器分配 9.3.5 代码生成器的基本结构 9.4 深入学习 9.5 实践与思考 9.6 大师风采——Peter Naur 第10章 GCC内核与现代编译技术概述 10.1 编译技术的现状及发展 10.2 GCC内核分析 10.2.1 GCC的基本结构 10.2.2 GENERIC 10.2.3 GIMPLE 10.2.4 SSA 10.2.5 RTL概述 10.2 RTX 10.3 动态编译技术简介 10.3.1 动态编译技术基础 10.3.2 运行时特定化 10.3.3 动态二进制翻译 10.4 并行编译技术简介 10.4.1 并行编译技术基础 10.4.2 并行计算机及其编译系统 10.5 深入学习 10.6 大师风采——Alan Perlis 参考文献
序言
与其他自然科学相比,计算机科学的发展历史并不久远,是较新的学科体系,尚有许多未知的领域有待探索。因此,本专业学生或工程技术人员仅仅满足于学习或应用几门程序设计语言是远远不够的。一些看似抽象的课程才是提高专业人员“内功”修为的秘技,例如数据结构、操作系统、编译原理、计算机系统结构、计算机网络等。不过,经典课程的学习并不是一蹴而就的,如何学习与理解课程的精髓是值得关注的。本书将从编译器设计的角度,为读者揭示编译原理的精髓。 学习编译技术的意义 有人认为,编译技术似乎已经相当成熟了,继续深入研究是没有任何意义的。实际上,任何科学技术都是发展变化的。表面上看,编译器设计的高层问题似乎已经形成了完美的体系,但当我们深入其内核就会发现事实并非如此。现代编译器设计面临的挑战是来自目标计算机系统结构、新颖程序设计语言及本身的计算资源等多方面的。其中,任何一方面的因素都足以颠覆某些传统理论与算法。例如,在现代编译器设计中,计算资源的增加允许设计者采用更耗费时间、空间的算法,而不必过分关注其代价。对于优化算法设计者而言,这是令人兴奋的。为了追求目标代码的更优,即使设计一些时空复杂度稍高的算法也是可以接受的。 当然,从更高的层次上讲,学习编译器设计的目的还不仅仅局限于其本身的理论与技术。作为一个系统软件的设计学科,其解决问题的思路与方法更是值得读者细细品味的。这可能是一个漫长而艰辛的历程,不过,这才是经典学科的魅力所在。以品味经典为目的来学习与研究操作系统、数据库技术、计算机网络、编译技术等学科是笔者多年来的努力方向。 从20世纪50年代中期以来,编译器设计就一直是计算机科学界的一个重要研究领域。Fortran语言之父John Backus认为,除非编译器生成的代码与手工编写的机器代码的性能非常接近,否则程序员就不会放弃汇编语言程序设计的思想与方法,这就是编译技术研究的源动力。从学术研究的角度讲,众所周知,图灵奖被誉为“计算机界的诺贝尔奖”,自1966年设立至今,54位获奖者中就有16位是由于程序设计语言及编译技术的研究成果而获此殊荣的。编译技术在计算机科学领域的地位由此可见一斑。
文摘
插图: 迄今为止,程序设计语言仍是人类与计算机交流的主要途径,它的应用领域也仅限于操纵与控制计算机。从第一台计算机诞生之日起,人类就始终在探索一种有效的方式与计算机进行对话交流,使之能为人类服务。虽然时隔数十年,计算机能识别与处理的语言仍然是二进制形式的机器语言描述的源程序。当然,不可否认二进制机器语言的优点非常多,但机器语言的易用性差也是不可回避的。即使是计算机专家想直接使用机器语言与计算机进行交流也是非常困难的。在20世纪50年代,计算机科学家们就已经意识到必须解决这一棘手的问题,否则计算机将无法得到普及。经过多年努力,汇编语言、C、Pascal等程序设计语言终于横空出世。根据语言的形式与特点,习惯上,将机器语言与汇编语言(一种比较接近机器语言的程序设计语言)称为低级语言,将其余的C、Pascal之类的语言称为高级语言。读者必须注意,低级语言与高级语言之分并不是说明语言本身的优劣,仅仅是说明语言的形式与机器语言的相似程度。所谓低级语言指的是与机器语言比较类似的语言,而高级语言指的是与机器语言差别较大而与自然语言比较类似的语言。由于这些非机器语言的诞生,也就出现了将非机器语言等价翻译成机器语言的需求。显然,将非机器语言翻译成机器语言的工作不能由手工完成,否则,非机器语言的产生就没有任何意义了。因此,人们试图借助于一个程序工具自动完成翻译工作。根据语言不同,翻译工具的复杂程度也不尽相同。比如,汇编语言比较接近机器语言,所以其翻译工具较易实现。而高级语言与机器语言差别较大,所以其翻译工具的实现也较为复杂。习惯上,将前者称为汇编器,而将后者称为编译器。当然,有些书上对于汇编器与编译器并没有严格区分,都将其称为编译器,反正这只是一个名词而已,读者不必深究。编译器的源语言是一种较为高级的程序设计语言,而目标语言可以是汇编语言、机器语言或者另一种高级语言。笔者必须澄清~点,人们普遍认为编译器的目标语言就是低级语言,这个观点的确没有错,但并不完整。
ISBN
出版社机械工业出版社
作者裘巍
尺寸16