编译器设计之路.docx
《编译器设计之路.docx》由会员分享,可在线阅读,更多相关《编译器设计之路.docx(551页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录出版说明前言第 1 章 概述11.1 编译技术概述11.1.1 程序设计语言基础11.1.2 程序设计语言的翻译机制41.1.3 编译器的基本结构51.2 Pascal 语言基础81.2.1 Pascal 语言简介81.2.2 Pascal 程序基本组成91.2.3 Pascal 的声明部分101.2.4 Pascal 的类型121.2.5 Pascal 的运算符151.2.6 Pascal 的语句171.3 开发环境与 Delphi 基础181.3.1 开发环境与文件列表181.3.2 Delphi 基础191.4 深入学习241.5 实践与思考251.6 大师风采Niklaus Wir
2、th25第 2 章 词法分析262.1 词法分析概述262.1.1 词法分析的任务262.1.2 单词的分类282.2 词法分析器的设计282.2.1 识别单词282.2.2 转换图292.2.3 构造词法分析器312.3 词法分析器的实现352.3.1 词法定义352.3.2 构造转换图与转换表362.3.3 相关数据结构382.3.4 源代码实现402.4 深入学习442.5 实践与思考452.6 大师风采Dennis M. Ritchie45第 3 章 语法分析473.1 程序设计语言的语法描述473.1.1 上下文无关文法473.1.2 推导523.1.3 语法树543.1.4 归约简
3、介573.2 语法分析概述583.2.1 语法分析的任务583.2.2 自上而下的语法分析法593.2.3 构造语法分析器643.3 语法分析器的实现713.3.1 文法定义713.3.2 语法分析表763.3.3 源代码实现863.4 深入学习903.5 实践与思考913.6 大师风采Edsger WybeDijkstra92第 4 章 符号表系统934.1 语义分析概述934.1.1 程序设计语言的语义934.1.2 语义分析与 IR 生成的任务944.1.3 语法制导翻译954.2 符号表设计984.2.1 符号表概述984.2.2 符号表的逻辑结构994.2.3 符号表的实例分析109
4、4.3 声明部分的实现1114.3.1 相关数据结构1114.3.2 主程序首部声明1134.3.3 包含文件声明部分1144.3.4 标号声明部分118编译器设计之路4.3.5 常量声明部分1194.3.6 类型声明部分1204.3.7 变量声明部分1494.3.8 过程、函数声明部分1524.4 深入学习1544.5 实践与思考1554.6 大师风采John Backus155第 5 章 中间表示1565.1 IR 概述1565.1.1 IR 的作用1565.1.2 IR 设计及其级别1575.1.3 设计 IR 的重要意义1595.2 IR 生成1605.2.1 三地址代码概述1605.
5、2.2 Neo Pascal三地址代码的实现1645.2.3 翻译机制概述1685.3 语句翻译概述1705.3.1 语句翻译基础1705.3.2 翻译辅助函数及其实现1735.4 if 语句1765.4.1 if 语句的翻译1765.4.2 源代码实现1775.5 while/repeat 语句1815.5.1 while 语句的翻译1815.5.2 源代码实现1815.5.3 repeat 语句的翻译1845.6 for 语句1845.6.1 for 语句的翻译1845.6.2 源代码实现1865.7 case 语句1925.7.1 case 语句的翻译1925.7.2 源代码实现1935
6、.8 其他语句1995.8.1 break、continue 语句的翻译1995.8.2 goto 语句的翻译2015.8.3 asm 语句的翻译2045.9 深入学习2085.10 实践与思考2085.11 大师风采Kenneth E.Iverson209第 6 章 表达式语义2106.1 表达式概述2106.2 类型系统基础2116.2.1 类型基础2116.2.2 类型系统2126.2.3 类型转换2176.3 类型系统的实现2186.3.1 类型系统的设计2186.3.2 IR 的操作数2216.3.3 类型相容的实现2226.3.4 类型推断的实现2236.4 表达式翻译2266.4
7、.1 表达式翻译基础2266.4.2 深入表达式翻译2296.4.3 表达式翻译的实现2306.5 操作数翻译2476.5.1 操作数的地址与形态2476.5.2 操作数翻译基础2486.5.3 简单变量操作数的翻译2526.5.4 记录字段操作数的翻译2626.5.5 数组翻译基础2656.5.6 数组元素操作数的翻译2706.5.7 指针运算的翻译2806.6 深入学习2866.7 实践与思考2866.8 大师风采Alan Kay287第 7 章 优化技术2887.1 优化概述2887.1.1 什么是优化2887.1.2 优化级别2897.2 控制流分析2907.2.1 流图与基本块290
8、7.2.2 流图的数据结构2927.2.3 流图的构造2937.2.4 优化的分类2977.3 数据流分析2987.3.1 数据流的相关概念298VIII7.3.2 数据流分析的策略2987.3.3 活跃变量分析2997.3.4 ud 链与 du 链3017.3.5 更多数据流问题3027.4 数据流分析的实现3037.4.1 定值点与引用点分析的基础3037.4.2 定值点、引用点分析的相关数据结构3057.4.3 定值点、引用点分析的实现3077.4.4 活跃变量分析的实现3127.4.5 ud 链、du 链分析的实现3147.5 常量传播与常量折叠3217.5.1 常量传播基础3217.
9、5.2 常量传播的实现3247.6 复写传播3287.6.1 复写传播的基础3287.6.2 复写传播的实现3307.7 代数简化3337.7.1 代数简化基础3337.7.2 代数简化的实现3347.8 跳转优化3397.8.1 跳转优化基础3397.8.2 条件跳转优化的实现3417.8.3 连续跳转优化的实现3437.9 冗余代码删除3457.9.1 冗余代码删除基础3457.9.2 死代码删除的实现3467.9.3 不可到达代码删除的实现3487.10 深入学习3507.11 实践与思考3507.12 大师风采Richard Stallman351第 8 章 运行时刻的存储管理3528
10、.1 存储管理概述3528.1.1 存储区域3528.1.2 存储布局3548.1.3 存储分配基础3568.2 栈式存储分配3578.2.1 栈式存储分配基础3578.2.2 i386 栈式存储分配3608.2.3 深入理解栈式存储分配3658.3 存储分配的实现3688.4 存储优化3728.4.1 存储优化基础3728.4.2 存储优化的实现3748.5 深入学习3818.6 实践与思考3828.7 大师风采BjarneStroustrup382第 9 章 目标代码生成3839.1 目标代码生成概述3839.1.1 目标代码生成基础3839.1.2 指令选择3849.1.3 寄存器分配3
11、859.2 目标机简介3869.2.1 目标机结构3869.2.2 浮点处理单元3879.2.3 操作数寻址方式3919.2.4 ptr 操作符3929.2.5 一个完整的汇编程序3939.3 构造代码生成器3939.3.1 自动代码生成器基础3939.3.2 指令模板3949.3.3 寄存器描述3979.3.4 寄存器分配3989.3.5 代码生成器的基本结构4029.4 深入学习4139.5 实践与思考4139.6 大师风采Peter Naur413第 10 章 GCC 内核与现代编译技术概述41410.1 编译技术的现状及发展41410.2 GCC 内核分析41510.2.1 GCC 的
12、基本结构41510.2.2 GENERIC41610.2.3 GIMPLE41610.2.4 SSA42610.2.5 RTL 概述428IX编译器设计之路10.2.6 RTX43010.3 动态编译技术简介43610.3.1 动态编译技术基础43610.3.2 运行时特定化43710.3.3 动态二进制翻译43910.4 并行编译技术简介44110.4.1 并行编译技术基础44110.4.2 并行计算机及其编译系统44310.5 深入学习44610.6 大师风采Alan Perlis447参考文献448X第 1 章 概述Reliable and transparent programs ar
13、e usually not in the interest of the designer.Niklaus Wirth1.1 编译技术概述1.1.1 程序设计语言基础Intel 公司的 David Kuck 院士曾经将编译器誉为“计算机科学与技术的皇后”,它是应用与系统之间的一座桥梁。在国内,由于计算机基础科学相对薄弱,人们通常更多投身于应用领域的研究,编译技术并不太受到人们的关注。因此,基于这方面的研究成果也相对较少。除了早期一些大型机的 Fortran、Algol 编译器之外,并没有真正的产品级编译器。不过,这并不意味着研究编译技术是毫无价值可言的。事实上,作为计算机科学的组成部分之一,编
14、译技术有着极其崇高的地位,其辉煌的历史可能是其他许多学科无法比拟的。众所周知,图灵奖被誉为“计算机界的诺贝尔奖”,自 1966 年设立至今,54 位获奖者中就有 16 位是由于程序设计语言或编译技术的研究成果而获此殊荣的,见表 1-1。虽然有些大师的身影已经渐渐远去,但是他们的研究成果却为人津津乐道。表 1-1 因程序设计语言或编译技术而获图灵奖的科学家年份获 奖 者获 奖 原 因1966Alan J. Perlis先进编程技术和编译架构方面的贡献1971John McCarthyLisp 语言、程序语义、程序理论、人工智能方面的贡献1972E. W. Dijkstra对开发 Algol 做出
15、了原理性贡献1977John Backus在高级语言方面所做出的具有广泛和深远意义的贡献,特别是在 Fortran 语言方面1979Kenneth E. Iverson在编程语言的理论和实践方面(特别是 APL)所进行的开创性的工作1980C. A. R. Hoare在编程语言的定义和设计方面的贡献,如 case 语句、公理语义学等1983Ken Thompson, Dennis M. Ritchie在通用操作系统理论研究,特别是UNIX 操作系统的实现上的贡献。开发实现了C 语言1984Niklaus Wirth开发了 Euler、Algol-W、Modula 和 Pascal 一系列崭新的
16、计算语言1991Robin Milner在可计算函数逻辑(LCF)、ML 和并行理论(CCS)这三个方面突出的贡献2001Ole-Johan Dahl、Kristen Nygaard面向对象编程始发于他们基础性的构想,这些构想集中体现在他们所设计的编程语言Simula I 和 Simula 67 中2003Alan Kay在面向对象语言方面的原创性思想,领导了 Smalltalk 的开发团队,以及对 PC 的基础性贡献2005Peter Naur在设计 Algol 60 程序设计语言上的贡献。Algol 60 语言定义清晰,是许多现代程序设计语言的原型2006Frances Allen对于优化
17、编译器技术的理论和实践做出的开创性贡献,这些技术为现代优化编译器和自动并行执行打下了基础2008Barbara Liskov在计算机程序语言设计方面的开创性工作。开发了面向对象编程语言 CLU注:见ACM 图灵奖:计算机发展史的缩影(1966-2006)(第三版),吴鹤龄,崔林,高等教育出版社。概述从 20 世纪 50 年代到 80 年代末,一些程序设计语言的兴起,为编译技术的发展提供了新的契机。Ada、Fortran、Algol、Pascal、C、C+等高级语言编译器如雨后春笋一般诞生。作为编译领域的经典之作,“龙书”也是撰写于这一时期的,它的出现将原先模糊的理论体系与实现技巧完全梳理清晰了
18、。正在人们隐约感到编译技术(尤其是前端技术)已相对成熟之际,一个崭新的时代正悄然来临。自 20 世纪 90 年代至今,计算机硬件体系的飞速发展,把编译技术的研究推向了新的高峰。编译器是将一种程序设计语言编写的源程序等价地转换为另一种程序设计语言编写的源程序的系统软件。习惯上,将前者称为源语言,而将后者称为目标语言。读者应该对语言并不陌生,汉语、英语、C、Java 等都是语言。那么,它们的联系与区别是什么呢?大千世界的语言一般可以分为两类,即自然语言和人工语言。自然语言就是日常生活中使用的语言,如汉语、英语。自然语言通常是在交流过程中逐渐完善的,并不是刻意定义的。人工语言则是为了特定目的、用途,
19、而人为创造出来的语言。例如,在计算机程序设计中使用的语言、工程技术中的符号、图形语言等。实际上,读者可以将人工语言理解成为解决某一特殊问题而定义的一种语言,例如 C、Java 等就是为了解决计算机程序设计而定义的人工语言。不过,自然语言与人工语言之间并非如人们所想象的那样存在着严格的界限。虽然自然语言没有太多的人为主观因素,但是它确实也是由人类创造的。因此,读者只需了解这两个概念即可,不必过多深究。早在 20 世纪 50 年代,计算机科学家就开始对语言处理进行了深入的研究,其中包含最重要的两个领域:一是自然语言理解与处理,二是程序设计语言及其编译技术。前者主要研究计算机如何才能正确识别与处理自
20、然语言及其语义。而后者主要研究如何设计一种人工语言,使之有效地完成人与计算机之间的无障碍交流,计算机之所以能普及到千家万户与程序设计语言的发展是分不开的。不过,两者的研究至今仍然尚待完善,例如,至今人类还无法使用计算机自动完成英语句子到汉语句子准确无误的翻译。这主要是由于无法让计算机准确理解输入英语句子的语义,同时,也无法让计算机将预定语义使用汉语表达输出。这就需要在自然语言理解与处理领域的继续探索。自然语言理解与处理不是本书的研究对象,笔者不多作讨论。下面,来谈谈程序设计语言及其编译技术的话题。这方面的研究主要包括:程序设计语言设计与定义、高级语言编译器设计、编译优化技术、并行编译技术、嵌入
21、式编译技术、动态编译技术等。读者阅读完本书之后,可以根据个人兴趣选择其中某些领域作深入学习与研究。程序设计语言是一种人工语言,而人工语言的一个重要特点就是人们可以对语言作一些严格的规定,从而不必过多关注语言表达形式的不确定性。例如,在 C 语言中,表达式 a= =10 只能用于描述“变量 a 是否等于 10”这一种语义。然而,在自然语言中,一个句子存在两种以上语义的情况并不罕见。例如,“我看见他太激动了。”这个句子表达的含义到底是什么?可以理解为: 我看见他后,我太激动了。也可理解为: 我看见他时,他非常激动。这里“看见”的宾语选择使句子存在二义性。然而,同样的问题在程序设计语言中却很罕见。例
22、如,在 C 语言中,对于 a+b 这样的表达式,读者可能会疑惑运算结果到底应该25是 (a+) +b 还是 a+ (+b)。但根据 C 语言的约定,运算结果一定是(a+)+b。由此可见,在设计一门程序语言及其编译器时,避免二义性是设计者考虑的首要因素。至于为什么一定是这样的结果呢?当学习完第 2 章,读者一定会了解 C 语言这一约定的现实意义与必要性。当然,这并不意味着程序设计语言中是绝对不存在二义性的。以 C 语言为例,(+a)+(+a)的取值就将因编译器而异。迄今为止,程序设计语言仍是人类与计算机交流的主要途径,它的应用领域也仅限于操纵与控制计算机。从第一台计算机诞生之日起,人类就始终在探
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译器 设计
限制150内