图书在版编目
(CIP)
数据
(日)
青木峰郎著;
严圣逸,
绝云译
自制编译器
/
. --
北京
:
人民邮电出版社
, 2016.6
(图灵程序设计丛书)
ISBN
978-7-115-42218-7
Ⅰ. ①自… Ⅱ. ①青… ②严… ③绝… Ⅲ
.
①
C
语言
-编译器-程序设计 Ⅳ. ①
TP312
中½版本图书馆
CIP
数据核字
(2016)
083048
号
第
内 容 提 要
本书将带领读者从头开始制½一门语言的编译器。
笔者特意为本书设计了
C♭
语言, 可以说是
C♭
C
语言的子集,
实现了包括指针运算等在内的
C
语言的主要部分。
本书所实现的编译器就是
C♭
语言
的编译器,是实实在在的编译器,
而非有诸多限制的玩具。
另外,
除编译器之外,
本书对以编译器为
中心的编程语言的运行环境,
即编译器、
汇编器、
链接器、
硬件、
运行时环境等½有所提及,
介绍了
程序运行的所有环节。
从单纯对编译器感兴趣的读者到以实用为目的的读者,
½适合阅读本书。
◆ 著
[日]
青木峰郎
译 严圣逸 绝云
责任编辑 乐 馨
执行编辑 杜晓静
责任印制 ½志环
◆ 人民邮电出版社出版发行
北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
½址 http://www.ptpress.com.cn
北京 印刷
800×1000 1/16
◆
开本:
印张:
29.5
字数: 千字
605
印数:
- 3 000
册
1
2016
年
6
月第
1
版
2016
年
6
月北京第
1
次印刷
著½权合同登记号 图字:
01-2014-5502
号
定价:
99.00
元
读者服务热线:
(010)51095186
½
600 印装质量热线:
(010)81055316
反盗版热线:
(010)81055315
广告经营许可证:
京东工商广字第
8052
号
译者序
算上这本《自制编译器》
,图灵的“自制”系列应该已经有
6
本了。从
CPU
到操½系统,从
编译器到编程语言,再到搜索引擎等具½的应用,俨然已经可以自制一套完整的计算机½系了。
“自制”系列图书½是从日本引进并翻译出版的,本人也有幸读过其中几本。可½有很多读
者和曾经的我一样对“自制”抱有疑惑:
“在时间就是金钱、时间就是生½的
IT
行业,为什么会
存在这样的自制风½?为什么要自制呢?
CPU
可以用
Intel、AMD,操½系统已经有了 Windows、
Linux,搜索引擎已经有了 Google、Yahoo,编程语言及其对应的编译器、解释器更是已经百花½
放、百家争鸣……”直到翻译完本书,我才逐渐½会到自制是最½的结合实践学习的方式之一。
拿来的始终是别人的,要吃透某项技术、打破技术垄断,最½的方法就是自制。并且从某种程度
上来说,自制也是一种创新,可½下一个
Google
或
Linux
就孕育在某次自制之中。
自制编译器的目的是了解½前实用的编程语言、编译器和
OS
的相关知识,绝对不½闭门
造½。因此½者½用的
C♭
语言是
C
语言的子集,实现了包括指针运算在内的
C
语言的主要部
分,通过自制一个
C♭
语言的编译器,½够让我们了解
C
语言程序编译、运行背后的细节;
OS
选用
Linux,½够让我们知晓 Linux
上的链接、加½½和程序库;汇编部分采用最常见的
x86
系统
架构。½者自制的编译器
cbc
½够运行在
x86
架构的任½发行版本的
Linux
上,编译
C♭
代码并
生成可执行的
ELF
文件。
½者青木先生在致谢中提到了
Linux
和
GNU
工具等开源½件的开发者。这也是本书的另
一大特色:充分利用开源½件和工具。从
GCC
到
GNU Assembler
再到
JavaCC
以及
Linux,并
非每一行代码½是自己写的才算自制,根据自己的设计合理有效地利用开源½件,既可以让我
们更快地看到自制的成果,又½向优秀的开源½件学习。如果要深入学习、研究,那么开源½
件的源代码以及活跃的社区等½是非常有帮助的。而如果把自制的½件也½为开源½件上传到
Github
上供大家½用,并根据其他开发者提出的
Pull Request
不断改进½件,那就更½了。
最后我要由衷地感谢本书的另一½译者绝云老师以及图灵的编辑。还要特别感谢我的外公,
一½毕生耕耘于教育出版行业的老编辑。自己½有幸参加翻译,和从小对出版工½的耳闻目染
是密不可分的。
严圣逸
2016
年
4
月于上海
前 言
本书有两大特征:第一,实际动手实现了真正的编译器;第二,涉及了以往编译器相关书籍
所不曾涉及的内容。
先说第一点。
本书通篇讲述了“C♭”这种语言的编译器的制½。C♭ 基本上是
C
语言的子集,并实现了包
括指针运算等在内的
C
语言的主要部分。因此可以说,本书实现的是实实在在的编译器,而并
非有诸多限制的玩具。
更具½地说,本书实现的
C♭
编译器是以运行在
x86
系列
CPU
上的
Linux
为平台的。之所
以选择
x86
系列的
CPU,是因为这是最普及的 CPU,相应的硬件非常容易找到。选择 Linux
是
因为从标准库到程序运行环境的代码½是公开的,只要½有心,完全可以自己分析程序的结构。
可½有些½者不喜欢把话题局限于特定的语言或者
OS,而笔者却恰恰更倾向于在一开始就
对环境进行限定。因为比起一般化的说明,从具½的环境出发,再向一般化扩展的做法要简单、
直观得多。笔者赞成最终把话题往一般化的方向扩展,½并不赞成一开始就一定要做到一般化。
再说第二点。
本书并不局限于书名中的“编译器”
,对以编译器为中心的编程语言的运行环境,即编译
器、汇编器、链接器、硬件、运行时环境½有所涉及。
编译器生成的程序的运行不仅和编译器相关,和汇编器、链接器等½件以及硬件½密切相
关。因此,如果想了解编译器以及程序的运行结果,对上述几部分内容的了解½然是必不可少
的。不过这里的“½然”现在看起来也逐渐变得没那么绝对了。
只讲编译器或者只讲汇编语言的书已经多得烂大街了,只讲链接器的书也有一些,½是贯
穿上述所有内容的书至今还没有。写编译器的书,一涉及具½的汇编语言,就会注上“请参考
其他书籍”
;写汇编语言的书,对于
OS
的运行环境问题却只字不提;写链接器的书,如果读者
不了解编译器等相关知识,也就只½被束之高阁了。
难道就不可½完整地记述编程语言的运行环境吗?笔者认为是可½的。只要专注于具½的
语言、具½的
OS
以及具½的硬件,就可以对程序运行的所有环节进行说明了。基于这样的想
法,笔者进行了稍显鲁½的尝试,并最终写成了本书。
以上就是本书的基本原则。下面是本书的读者对象。
评论