首页>参考读物>计算机科学与技术>软件与程序设计

自己动手构造编译系统:编译、汇编与链接
作者 : 范志东 张琼声 著
丛书名 : 自己动手系列
出版日期 : 2016-08-01
ISBN : 978-7-111-54355-8
定价 : 69.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 302
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

全书一共分为五个部分,以编译系统的工作流程为主线,描述每个功能模块的实现机制,包含大量实现代码。第一部分:简介。从程序设计开始,追溯代码背后的细节,引出编译系统的概念。按照编译系统的工作流程,介绍本书编译系统的设计和结构。第二部分:编译程序。按照编译器的工作流程,分别描述词法分析、语法分析、语义处理、符号表、代码生成和中间代码优化的内容,并结合代码详细阐述每个功能模块的实现机制和原理。第三部分:二进制描述,该部分是深入计算机底层的必须知识。通过对x86指令格式和可执行文件格式的介绍,可以让读者明白高级语言代码的最终形态。第四部分:汇编程序,汇编器与编译器的实现有相似性,但是该部分内容除了描述汇编器的基本结构外,还着重介绍了如何提取汇编语言内描述的符号信息,并生成可重定位目标文件。第五部分:链接程序,作为编译系统的最后一个功能部件,链接器的工作关系着高级语言代码的正确执行。这部分会按照链接器的基本流程——地址空间分配、符号解析、符号重定位详细阐述链接器的实现细节。

图书特色

爱因斯坦曾说过:“好奇心是科学工作者产生无穷的毅力和耐心的源泉。”
对于实现一个编译系统来说,打通编译、汇编和链接的全部流程确非易事。然而,当我满怀新奇地将问题抽丝剥茧,最终触及本质的那一刻,才体会到所有的坚持和努力都是值得的。那些抱着和我当初一样好奇心的人,想必也是为了解开心中长埋的疑惑而翻开此书的吧。从对程序语言在计算机上如何运行的不解,到看到自己设计的程序语言执行出正确结果的兴奋,也许只有好奇心才能驱使我们在这条看似枯燥的探索道路上一步一个脚印地走下去。最后套用一句名言:“Stay curious, Stay patient.”希望看到本书的人,能找到心中一直想要的答案。
——范志东

本书介绍编译器设计与实现中的理论和技术,对构造编译器的基本知识与关键技术进行了全新的讲解,受众主要是计算机相关专业的本科生和研究生,以及需要相关知识的程序员,也可以作为教师的参考书。这是近年来在该领域比较全面的一本专业书籍。
—— 葛永文
科锐安网络公司全球副总裁兼大中国区总裁

本书最大的亮点是它具有很强的应用性和可读性。作者不是从复杂深奥的计算机编译理论入手,而是在各个章节中使用有代表性的程序模块作为范例,将它们放入编译系统中运行以描述它们的编译过程,然后对代码和结果给出详细的诠释。 这就像对编译过程进行细致解剖一样。我相信本书会大大降低编译系统理解的门槛,提高读者对编译系统的兴趣。
—— 梁红卫
南京大学少年班本科
中科院自动化所硕士
佐治亚理工学院PHD
定居美国,现就职于Maxim 集成芯片公司

本书知识量很大,作者叙述清晰。基于作者完整实现编译系统的第一手经验和体会,本书集合了所有的主要步骤,对编译原理课堂项目的选题、编程具有非常好的借鉴作用。完整的可运行示例代码使得专注于编译系统的一个特定模块的课堂项目实践更加真实。本书将有力地促进编译原理的实践教学。
—— Jian Cheng (程坚)
CEO, Analytic Measures Inc., Palo Alto, California, USA

正如作者在前言中所言,这本书既能帮助读者在学习编译原理时通过阅读分析这些代码从而加深理解,也能让有兴趣的读者在此基础上进一步进行实践。即便对普通的计算机编程人员而言,通过本书也能了解到不同方面的东西。就我个人而言,虽然熟知优化过程中的那些概念,但第一次看到了那些方法的具体实现仍让我很高兴。尤其是寄存器分配一节,让我更加理解了程序的局部性原则。总之,这是一本值得拥有的好书。
—— 王晓云
前Nokia高级软件架构师

范志东 就职于腾讯数据平台部,负责腾讯大数据平台的产品化,涉及自动化部署、应用调度、交互分析、集群监控、性能调优等,对开源工具Ambari、Hadoop、Spark等有深入的了解。在校期间屡次获得国家奖学金和励志奖学金。独立开发了基于Intel x86指令集的自定义类C语言的编译系统,包括编译器、汇编器与链接器的实现,对计算机程序的加载和运行原理有深刻的认识。深入分析过Linux内核关于CPU功耗方面的代码。爱好广泛,对编程语言、操作系统、编译系统、计算机安全、分布式系统有着浓厚的兴趣。闲暇时会在技术博客上分享自己的学习心得,期望通过互联网把获得知识的快乐心情传递出去。参与了“十一五”校级立项正式出版教材《计算机操作系统原理》以及全国自学考试教材《计算机应用技术》编写的相关工作。
张琼声 湖北省松滋县人,中国石油大学(华东)计算机与通信工程学院副教授,硕士生导师。主讲课程:《操作系统》《操作系统课程实习》和《嵌入式操作系统》。主持的《计算机操作系统》课程被评为校级精品课,先后获得中国石油大学优秀教学研究成果一、二、三等奖各一项;曾获评中国石油大学优秀教师、山东省优秀学士论文指导教师;主持或参与科研、教研项目十四项。专业及研究兴趣为系统软件开发技术,包括:操作系统、编译系统、计算机系统安全性。发表科研、教学论文二十余篇。参与翻译《深入理解Linux内核》第3版,编著“十一五”校级立项正式出版教材《计算机操作系统原理》、主编全国自学考试教材《计算机应用技术》。

图书前言

本书适合谁读
本书是一本描述编译系统实现的书籍。这里使用“编译系统”一词,主要是为了与市面上描述编译器实现的书籍进行区分。本书描述的编译系统不仅包含编译器的实现,还包括汇编器、链接器的实现,以及机器指令与可执行文件格式的知识。因此,本书使用“编译系统”一词作为编译器、汇编器和链接器的统称。
本书的目的是希望读者能通过阅读本书清晰地认识编译系统的工作流程,并能自己尝试构造一个完整的编译系统。为了使读者更容易理解和学习编译系统的构造方法,本书将描述的重点放在编译系统的关键流程上,并对工业化编译系统的实现做了适当的简化。如果读者对编译系统实现的内幕感兴趣,或者想自己动手实现一个编译系统的话,本书将非常适合你阅读。
阅读本书,你会发现书中的内容与传统的编译原理教材以及描述编译器实现的书籍有所不同。本书除了描述一个编译器的具体实现外,还描述了一般书籍较少涉及的汇编器和链接器的具体实现。而且本书并非“纸上谈兵”,在讲述每个功能模块时,书中都会结合具体实现代码来阐述模块功能的实现。通过本书读者将会学习如何使用有限自动机构造词法分析器,如何将文法分析算法应用到语法分析过程,如何使用数据流分析进行中间代码的优化,如何生成合法的汇编代码,如何产生二进制指令信息,如何在链接器内进行符号解析和重定位,如何生成目标文件和可执行文件等。
本书的宗旨是为意欲了解或亲自实现编译系统的读者提供指导和帮助。尤其是计算机专业的读者,通过自己动手写出一个编译系统,能加强读者对计算机系统从软件层次到硬件层次的理解。同时,深入挖掘技术幕后的秘密也是对专业兴趣的一种良好培养。GCC本身是一套非常完善的工业化编译系统(虽然我们习惯上称它为编译器),然而单凭个人之力无法做到像GCC这样完善,而且很多时候是没有必要做出一个工程化的编译器的。本书试图帮助读者深入理解编译的过程,并能按照书中的指导实现一个能正常工作的编译器。在自己亲自动手实现一个编译系统的过程中,读者获得的不仅仅是软件开发的经历。在开发编译系统的过程中,读者还会学习很多与底层相关的知识,而这些知识在一般的专业教材中很少涉及。
如果读者想了解计算机程序底层工作的奥秘,本书能够解答你内心的疑惑。如果读者想自定义一种高级语言,并希望使该语言的程序在计算机上正常运行,本书能帮助你较快地达到目的。如果读者想从实现一个编译器的过程中,加强对编译系统工作流程的理解,并尝试深入研究GCC源码,本书也能为你提供很多有价值的参考。
基础知识储备
本书尽可能地不要求读者有太多的基础知识准备,但是编译理论属于计算机学科比较深层次的知识领域,难免对读者的知识储备有所要求。本书的编译系统是基于Linux x86平台实现的,因此要求读者对Linux环境的C/C++编程有所了解。另外,理解汇编器的实现内容需要读者对x86的汇编指令编程比较熟悉。本书不会描述过多编译原理教材中涉及的内容,所以要求读者具备编译原理的基础知识。不过读者不必过于担心,本书会按照循序渐进的方式描述编译系统的实现,在具体的章节中会将编译系统实现的每个细节以及所需的知识阐述清楚。
本书内容组织
本书共7章,各章的主要内容分别如下。
第1章代码背后
从程序设计开始,追溯代码背后的细节,引出编译系统的概念。
第2章编译系统设计
按照编译系统的工作流程,介绍本书编译系统的设计结构。
第3章编译器构造
描述如何使用有限自动机识别自定义高级语言的词法记号,如何使用文法分析算法识别程序的语法模块,如何对高级语言上下文相关信息进行语义合法性检查,如何使用语法制导翻译进行代码生成,以及编译器工作时符号信息的管理等。
第4章编译优化
介绍中间代码的设计和生成,如何利用数据流分析实现中间代码优化,如何对变量进行寄存器分配,目标代码生成阶段如何使用窥孔优化器对目标代码进行优化。
第5章二进制表示
描述Intel x86指令的基本格式,并将AT&T汇编与Intel汇编进行对比。描述ELF文件的基本格式,介绍ELF文件的组织和操作方法。
第6章汇编器构造
描述汇编器词法分析和语法分析的实现,介绍汇编器如何提取目标文件的主要表信息,并描述x86二进制指令的输出方法。
第7章链接器构造
介绍如何为可重定位目标文件的段进行地址空间分配,描述链接器符号解析的流程,以及符号地址的计算方法,并介绍重定位在链接器中的实现。
随书源码
本书实现的编译系统代码已经托管到github,源码可以使用GCC 5.2.0编译通过。代码的github地址是https://github.com/fanzhidongyzby/cit。代码分支x86实现了基于Intel x86体系结构的编译器、汇编器和链接器,编译系统生成的目标文件和可执行文件都是Linux下标准的ELF文件格式。代码分支arm实现了基于ARM体系结构的编译器,目前支持生成ARM 7的汇编代码。

上架指导

计算机\编译

封底文字

本书介绍编译器设计与实现中的理论和技术,对构造编译器的基本知识与关键技术进行了全新的讲解,受众主要是计算机相关专业的本科生和研究生,以及需要相关知识的程序员,也可以作为教师的参考书。这是近年来在该领域比较全面的一本专业书籍。
—— 葛永文
科锐安网络公司全球副总裁兼大中国区总裁



这本书最大的亮点是它具有很强的应用性和可读性。作者不是从复杂深奥的计算机编译理论入手,而是在各个章节中使用有代表性的程序模块作为范例,将它们放入编译系统中运行以描述它们的编译过程,然后对代码和结果给出详细的诠释。 这就像对编译过程进行细致解剖。我相信本书会大大降低编译系统理解的门槛,提高读者对编译系统的兴趣。
—— 梁红卫
南京大学少年班本科
中科院自动化所硕士
佐治亚理工学院PHD
定居美国,现就职于Maxim 集成芯片公司


本书知识量很大,作者叙述清晰。基于作者完整编译系统实现的第一手工作经验体会,本书集合了所有的主要步骤于一体,对编译原理课堂项目的选题、编程具有非常好的借鉴作用。完整的可运行示例代码使得专注于编译系统的一个特定模块的课堂项目实践更加真实。本书将有力地促进编译原理的实践教学。
—— Jian Cheng(程坚)
CEO, Analytic Measures Inc., Palo Alto, California, USA


正如作者在前言中所言,“这本书既能帮助读者在学习编译原理时通过阅读分析这些代码从而加深理解,也能让有兴趣的读者在这个基础上进一步进行实践。即便对普通的计算机编程人员而言,通过本书也能了解到不同方面的东西”。就我个人而言,虽然熟知优化过程中的那些概念,但第一次看到了那些方法的具体实现仍让我很高兴。尤其是寄存器分配一节,让我更加理解了程序的局部性原则。总之,这是一本值得拥有的好书。
—— 王晓云
前Nokia高级软件架构师

作者简介

范志东 张琼声 著:暂无简介

图书目录


前言
第1章 代码背后 1
1.1 从编程聊起 1
1.2 历史渊源 2
1.3 GCC的工作流程 3
1.3.1 预编译 4
1.3.2 编译 5
1.3.3 汇编 6
1.3.4 链接 7
1.4 设计自己的编译系统 8
1.5 本章小结 9
第2章 编译系统设计 11
2.1 编译程序的设计 11
2.1.1 词法分析 12
2.1.2 语法分析 13
2.1.3 符号表管理 14
2.1.4 语义分析 15
2.1.5 代码生成 16
2.1.6 编译优化 16
2.2 x86指令格式 18
2.3 ELF文件格式 19
2.4 汇编程序的设计 21
2.4.1 汇编词法、语法分析 22
2.4.2 表信息生成 23
2.4.3 指令生成 24
2.5 链接程序的设计 25
2.5.1 地址空间分配 25
2.5.2 符号解析 26
2.5.3 重定位 27
2.6 本章小结 27
第3章 编译器构造 29
3.1 词法分析 29
3.1.1 扫描器 30
3.1.2 词法记号 32
3.1.3 有限自动机 36
3.1.4 解析器 40
3.1.5 错误处理 53
3.2 语法分析 55
3.2.1 文法定义 55
3.2.2 递归下降子程序 65
3.2.3 错误处理 70
3.3 符号表管理 74
3.3.1 符号表数据结构 75
3.3.2 作用域管理 78
3.3.3 变量管理 82
3.3.4 函数管理 88
3.4 语义分析 93
3.4.1 声明与定义语义检查 93
3.4.2 表达式语义检查 95
3.4.3 语句语义检查 97
3.4.4 错误处理 98
3.5 代码生成 101
3.5.1 中间代码设计 102
3.5.2 程序运行时存储 105
3.5.3 函数定义与return语句翻译 108
3.5.4 表达式翻译 110
3.5.5 复合语句与break、continue
语句翻译 120
3.5.6 目标代码生成 132
3.5.7 数据段生成 141
3.6 本章小结 145
第4章 编译优化 147
4.1 数据流分析 149
4.1.1 流图 149
4.1.2 数据流分析框架 152
4.2 中间代码优化 155
4.2.1 常量传播 155
4.2.2 复写传播 167
4.2.3 死代码消除 172
4.3 寄存器分配 177
4.3.1 图着色算法 177
4.3.2 变量栈帧偏移计算 182
4.4 窥孔优化 187
4.5 本章小结 190
第5章 二进制表示 191
5.1 x86指令 191
5.1.1 指令前缀 192
5.1.2 操作码 194
5.1.3 ModR/M字段 196
5.1.4 SIB字段 198
5.1.5 偏移 201
5.1.6 立即数 201
5.1.7 AT&T汇编格式 202
5.2 ELF文件 204
5.2.1 文件头 205
5.2.2 段表 207
5.2.3 程序头表 209
5.2.4 符号表 213
5.2.5 重定位表 214
5.2.6 串表 215
5.3 本章小结 217
第6章 汇编器构造 219
6.1 词法分析 220
6.1.1 词法记号 220
6.1.2 有限自动机 222
6.2 语法分析 223
6.2.1 汇编语言程序 223
6.2.2 数据定义 225
6.2.3 指令 226
6.3 符号表管理 227
6.3.1 数据结构 228
6.3.2 符号管理 230
6.4 表信息生成 234
6.4.1 段表信息 235
6.4.2 符号表信息 238
6.4.3 重定位表信息 239
6.5 指令生成 246
6.5.1 双操作数指令 247
6.5.2 单操作数指令 251
6.5.3 零操作数指令 254
6.6 目标文件生成 255
6.7 本章小结 261
第7章 链接器构造 263
7.1 信息收集 264
7.1.1 目标文件信息 264
7.1.2 段数据信息 266
7.1.3 符号引用信息 268
7.2 地址空间分配 269
7.3 符号解析 272
7.3.1 符号引用验证 274
7.3.2 符号地址解析 276
7.4 重定位 277
7.5 程序入口点与运行时库 281
7.6 可执行文件生成 283
7.7 本章小结 290
参考文献  291

教学资源推荐
作者: 苏运霖
作者: [美] 克里斯多夫 W. 弗雷泽(Christopher W. Fraser)戴维 R. 汉森(David R. Hanson) 著
作者: [美]布莱恩· W.克尼汉(Brian W. Kernighan),丹尼斯· M.里奇(Dennis M.Ritchie) 著
参考读物推荐