http://www.lingcc.com/2012/05/16/12048/

a list of compiler books — 汗牛充栋的编译器参考资料

前不久,有位《编译点滴》网友询问编译器方向的参考资料。其实之前讨论过一些编译器相关的在线资料–《有写编译器的冲动?这些资料很重要》。这篇博文就来总结总结编译技术相关的各类图书资料,供各位参考。这个书列是结合本人所了解的内容整理出来的,限于能力有限,肯定还有很多疏漏,请大家指正。

所列图书,有中文版本的,我会尽力给出中文版本名称。

Table of Contents

1 编译器整体设计与实践

 

1.1 龙书 – 《Compilers Principles,Techniques, & Tool》

本书主页:http://dragonbook.stanford.edu/

这本书因为封面展示了程序员努力与各种计算机难题化身而成的恶魔龙的图片而闻名。 这是编译器领域最著名的一本教材,地位相当于《算法导论》与算法课的关系。 书中对编译相关理论、编译器实现技术等等都有介绍。虽然书很厚,但惜墨如金,言简意赅。 对于一些掌握的很朦胧的基本概念,翻看此书,仔细琢磨一会,便会茅塞顿开。

目前最新的是第二版。第一版重点在前端设计与实现上,有一小部分涉及代码生成、优化,以及运行时管理技术。 第二版新增了大量篇幅介绍编译器中的各种优化技术。将一些基本优化理论概括的很到位。 但因为刚刚加入,练习、实践方面还没有增加。

本书的作者是国际上编译界的几位鼻祖级人物:

这本书国内影印、翻译版本都有,书名《编译原理、技术与工具》。 相比不少人已经有了,这里就不多说了。

推荐度:××××× (五星,最高级)

1.2 虎书 – 《Modern Compiler Implementation in C》

本书主页:http://www.cs.princeton.edu/~appel/modern/c/

作者是来自 Princeton University的:

此书因封面为一只老虎而的名。除了C语言实现,作者还编写了编译器Java语言实现、ML语言实现两本。 这本书的特色是注重实践,许多章节在讲解理论的同时,会有个“program”一节,用来指导读者实现相关内容。 此外还有配套的一些分析和练习。

我曾利用此书练习编译器实现,中间有些关于嵌套函数的支持内容,因为实现过于复杂,曾经一度很纠结该不该做。 如果作者能结合现在语言的发展状况,重新组织一下图书,出个新版,就完美了。 (貌似作者在忙着出另一本书,《Alan Turing’s Systems of Logic: The Princeton Thesis》,听起来很有意思的书)

这本书国内影印和翻译版本也都有。书名《现代编译原理-C语言描述》

推荐度:×××× (四星,总体很好,部分内容稍旧)

1.3 《Engineering a Compiler》

本书主页: http://www.cs.rice.edu/~keith/Errata.html 。 使用本书教授的编译课程:http://www.clear.rice.edu/comp412/

这本书的两位作者都来自 Rice University。

值得赞一下的是:今年(2012年),这本书出了第二版。 这也是一本讲总体编译器实现的书。也没有仔细读过。 但每当需要翻开这本书的时候,我总是很激动,因为每次翻看都很激动想仔细读读。 但都因为一些琐事,未能如愿。这是一本除龙书外,值得非常用心读的一本书。 这本书12年的再版,更加强调一个现代编译器的设计与实现。 与龙书有很多前端的实践不同。这本书几乎涉及了编译器各个阶段,包括程序分析和优化阶段的实现。 另外,从目录结构来看,对编译技术的讲解也很透彻。(因为本人没有详细阅读此书,所以只能表面看看)。

这本书国内有第一版的翻译版本,名称《编译器工程》。有兴趣的朋友可以看看。

推荐度:××××× (五星,最高级)

1.4 《编译原理实验教程》

这是我认为很值得推荐的一本国内编译器实现教材。 书不厚,但内容很完整。作者是中国科学技术大学的张昱和陈意云老师。 本书主页:http://staff.ustc.edu.cn/~yuzhang/compiler/

陈老师是国内编译方面的前辈之一。多年从事中国科技大学的编译原理课程教学工作。 这本书就是在中国科大计算机学院多年编译实验课程的基础上总结而来的。 我曾和其中一位参与本书中库代码、文本编写的研究生同住半年。 他很自豪的说,这本书是本好书。

这本书主要基于Java实现一个面向对象的类Java语言的编译器。 光盘中还有相应的类库和程序设计开发包。 手痒的朋友可以买来立即动手试试。

推荐度:×××× (四星,实践细节较多,理论少)

1.5 《Crafting a compiler》

本书主页:http://www.cs.wustl.edu/~cytron/cacweb/

这也是一本偏向于介绍编译器前端实践的教材。 这本书和《编译原理实验教程》类似,也有相关的源代码提供,都是Java的。感兴趣的朋友可以从主页上下。 这本书我草草翻过。书中的内容没有仔细看,不过感觉习题比较有意思。

这本书国内有原版影印版,书名《编译器构造》。

推荐度:×××× (四星,没有自己的特点,这本书覆盖到的别的书也有讲。内容不旧但也不新)

1.6 《编译器设计之路》

这也是难得一件的国内编译器实践类书籍。作者用C++实现了一个Pascal编译器。可能因为目标语言是Pascal,所以“叫好不叫做”。不过因为编译器设计所关注的点其实就那几个方面,所以还是很有参考意义的。

自己翻过这本书,但是没有印象了,豆瓣上有些评论可以供各位参考。不管怎样,国内的朋友能写出这种书,都值得好好推荐。

推荐度: X X X X (四星,实现Pascal语言的编译器有些脱离大众)

2 语言理论、编译器前端设计与实现

因为程序设计语言一直在向前发展,所以关于程序语言和编译器前端设计的书,也在不断发展着,而且曾出不穷。

2.1 《Introduction to Automata Theory, Languages, and Computation》

本书主页: http://infolab.stanford.edu/~ullman/ialc.html

这本书介绍了计算机的理论基础–自动机理论。 以及以此为基础的乔姆斯基文法概念,计算复杂性问题。 这些都是计算机科学的理论基石。 乔姆斯基文法更是程序语言设计的基础。 虽然看标题,这本书的理论应该挺老了。不过这本书当前的最新版本–第3版是2006年发行的。 对于基础理论性的书籍,这已经算是比较新的了。

说实话,虽然一直计划要看,但到现在这本书还没有翻开过。所以不好随便评论。 感兴趣的朋友可以看看豆瓣上的评论

这本书国内有影印版和翻译版,书名《自动机理论、语言和计算导论》。

推荐度:××××× (对语言设计理论,计算机科学、可计算性问题感兴趣的读者,千万不能错过)

2.2 《Programming Language Pragmatics》

本书主页在此:http://www.cs.rochester.edu/~scott/pragmatics/

这本书可以用集编程语言设计之大成来形容,目前最新版本为第三版,作者是University of Rochester的Michael L. Scott教授。 此书介绍了被广泛使用的各种编程语言,以及这些编程语言中一些语言特性的编译器实现细节。 另外,还讨论了很多在程序设计语言演进的过程中曾经昙花一现的一些技术及其优劣。 因为涉及到十几种编程语言的很多细节,书中有些内容(比如脚本语言一章)给人一种简单罗列、缺少分析的感觉。 但可以明显感觉得到,对于那些重要的语言特性,比如控制抽象、类型系统、面向对象、函数式语言等等,作者都分析的很到位。 而且这些分析都是基于一个个程序片段,而非简单的理论分析。

每一章后面的习题,也很值得推荐,比如不少习题会引导你去看语言对应的编译器/解释器中具体的实现原理,以及一些特性的比较之类。 上过编译原理课程,并了解至少两门语言的读者,强烈推荐阅读之。

目前最新版本是第三版。国内有第二版的翻译和影印版,书名《程序设计语言–实践之路》。

推荐度:××××× (5星,最高级)

2.3 《Practical Foundations for Programming Languages》

首先,感谢Carnegie Mellon University的Robert Harper,我们能免费的拿到这本书的电子版

此书主要介绍程序设计语言的基础,几乎涵盖了程序语言的方方面面,小到符号、异常,大到整个类型系统的设计、并行、并发语义的设计与实现。 作者既然把这本书电子版直接放出来,至少说明他很自信这是一本好书,也很希望与更多喜欢该技术的人交流。 我们也有充分的理由相信,这书值得一读。

目前此书只有英文版本。

推荐度:×××× (4星,理论性较强,有些枯燥。但绝对是本权威著作)

2.4 《 Design Concepts in Programming Language 》

本书主页: https://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=11656 。 MIT出版社出版,作者是:

  • Franklyn A. Turbak
  • David K. Gifford

这也是一本介绍程序语言设计的书,但和《Programming Language Pragmatics》集大成不同,它强调对一些语言设计中公共技术的研究和论述。 目前的最新版本已经是第10版了。 这本书我只草草的翻过,最深刻的印象是厚!相当于两本龙书那么厚。 印象第二深刻的是,把语言设计的一些方面分成了三个部分,动态语义(命名、状态、控制)、静态语义(类型、多态、模块)和实践需求(垃圾收集)。 具体的内容没有细看,感兴趣的朋友可以到该书的主页内看看。

这本书有中文影印版,书名《程序设计语言概念》。

推荐度:××××(4星,太厚了,可以先找个薄点的看看)

2.5 《 Principles of Program Analysis》

本书主页: http://www2.imm.dtu.dk/~riis/PPA/ppa.html

这是经 Cheng推荐而添加的。顾名思义,这本书主要讲程序分析的相关基础理论和概念,重点集中在静态分析技术,包括分析程序可靠性、动态行为。书中介绍的程序分析技术,涵盖:数据流分析、基于约束的分析、抽象解释、类型系统四个方面。

目前此书最新版本是第二版,没有国内版本。

推荐度:XXXXX (五星,最高级,内容结合最新理论、基础概念、概括全面)

2.6 《Language Implementation Patterns – Create Your Own Domain-Specific and General Programming Languages》

这本书可以简单的看作ANTLR工具的使用手册。即介绍如何利用ANTLR工具,创建自己的Domain Specific language编译器。 ANTLR与Flex/Bison的功能差不多,只不过一个是基于Java的,一个基于C/C++。

这本书有中文版,书名《编程语言实现模式》。

推荐度:×××× (4星,专业性稍微有点强,想自己实现编译器的朋友可以试试)

2.7 《flex & Bison》

看到这本书的名称,想必不少朋友都知道是用来干什么的了。 这是一本介绍如何使用编译器生成工具flex和bison实现一个前端的书。 此书更加偏重实际动手能力和工具。 目前这本书最新版本是第二版。而且已经有中文版本。

书中的内容主要涉及如何使用flex和bison,以及如何解决语法冲突、二意性问题,还有一章单独介绍了编译器前端的错误报告和恢复。

这本书国内也有翻译版和影印版。

推荐度:×××× (4星,越看越像个工具使用说明)

3 程序分析、编译优化及代码生成技术、编译器中端和后端设计与实现

 

3.1 《Optimizing Compilers for Modern Architectures: A Dependence-based Approach 》

这本书是编译界泰斗级老前辈–Ken Kennedy 的著作。 主要从编译器、代码分析角度介绍如何进行依赖分析以适应现代的超标量、并行体系结构。 很可惜,这本书01年出版之后没有再版过。 如果Kennedy还在世,看着多核、众核这么蓬勃的发展,一定会出新版讨论讨论粗粒度的线程级并行和依赖分析问题, 把他以及他的弟子们对编译的理解统统贡献给世人。

不管怎样,这本书在面向VLIW、超标量体系结构的编译优化,为并行而进行的依赖分析方面,绝对是一本难得的好书。 这本书有中文翻译版《现代体系结构的优化编译器》,由计算所编译组敬爱的张兆庆老师领导翻译,但翻译版貌似在各大网上书店都已经没货了。

推荐度:××××× (5颗星,最高级,即使随便翻翻大师们的作品,也能收获不少)

3.2 鲸书 – 《Advanced Compiler Design and Implementation》

这本书可以用程序分析、编译器实现、性能优化技术的百科全书来形容。 基本网罗了面向当今主流微处理器结构的所有程序分析、编译优化技术。 而且都对这些技术做了概括、总结,附有丰富的参考文献。

不过也因为这个百科全书需要非常宽的知识面、非常深的编译功底、非常大的阅读量。 而且一个人的力量也很有限。所以有不少批评的声音,说书中的算法有不少bug。 不管怎么说,没有第二个人能写出这种书,这就值得我们尊敬。

国内有此书的影印版和翻译版,书名《高级编译器设计与实现》。

推荐度:××××× (5星,最高级)

3.3 《Building an Optimizing Compiler》

也是一本较老的书,98年出版的。 作者在编译器的实践方面经验丰富,主要关注如何选择编译技术,技术的工程实现以及如何对技术进行改进。 实际设计和实现编译器时,作者秉承经典技术优先于最新技术的原则。所以书中的介绍也充满了对经典编译优化技术的透彻理解。

推荐度:××× (3星,内容较旧,所讲内容其他书也都有覆盖,不过基于扎实的工程经验是本书可圈可点的地方)

3.4 《Data Flow Analysis– Theory and Practice》

本书主页:http://www.cse.iitb.ac.in/~uday/dfaBook-web/

顾名思义,这本书主要介绍编译器内部的一个基本程序分析技术–数据流分析。 该书的作者是三名印度人。其中Uday Khedker领导实现了GCC 4.0版本中的数据流分析优化的整体框架。

这本书将数据流分析理论讲解的非常到位,从latice到iterative algorithm,再以多个实际数据流编译优化为例,介绍了前向、后向、双向的数据流分析算法。 包括复杂度分析、可计算性问题。最后,又结合GCC中的实现介绍,数据流分析的结构体设计、函数设计等等。 看了这本书,只能用过瘾来形容。 目前这本书还没有中文版本。

推荐度:×××× (4星,虽然写的很好,但专业性太强,不推荐没有编译基础的朋友阅读)

4 运行时技术、虚拟机和解释器设计与实现

其实许多讲Java虚拟机的书,都可以算在这个类别里面。因为个人能力有限,那些书就不列在这里了。 这里只列一本专门讲编译器和解释器实现的书

4.1 《Writing Compilers and Interpreters: A Software Engineering Approach》

目前已经是第三版了。这本书倾向于利用现有工具完成一个编译器,其中用到了Java、UML、XML、Java容器、实现一个IDE等等。 都是比较有意思的小项目。

这本书我没有翻过,只是从书的目录和介绍中推测的。

推荐度:××××× (5星,最高级,写了很多其他书没有写的东西,且能做成一个很有成就感的东西。)

5 其他书籍

因为能力和水平有限,上面列的书都是我平时所能接触到的。 其实很有许多其他书,因为没有看过,所以无法评价。下面给出一些其他人列出的书单,供朋友们参考:

http://www.360doc.com/content/12/1221/09/10740921_255429959.shtml

关于编译器的图书资料汇总,可以参考《a list of compiler books —                                汗牛充栋的编译器参考资料》。

工作如果是和编译器相关的或者编译器爱好者们,谁没有点冲动想自己写个编译器出来。

我也做了一些调研,分享如下:

–介绍如何使用JAVA语言完成一个面向LLVM后端的编译器,以mjava作为目标语言,这是JAVA语言的一个子集。包括词法分析,语法分析,错误控制,符号表管理,类型检查等部分

–采用一种逐步增加功能的方式构造编译器,作者的文章写的很深入前出(我只看了abstract和introduction部分)

–作者从1988-1995年用了7年的时间完成了这份介绍。没有使用flex和yacc这些东西,纯手工制作。使用pascal语言写出的编译器。是一位学物理的博士,很是钦佩!

MIT OCW 6.035 Computer Language                               EngineeringMIT关于计算机工程的开放课程,使用JAVA语言创建一个完整的Decaf语言编译器。我也曾看过一点,但这门课的实验要求有MIT的环境,还有一些库什么的。外面的人拿不到,所以没办法,只能作参考了。

–编译器课程,使用C++实现一个Cool(Classroom Object-Oriented                               Language)语言编译器.也是因为没有缓环境和库,只能作罢。

–                                很有特色的一门课,也是使用C++实现COOL语言的编译器,但将LLVM融入进来,前端输出中间表示到LLVM,在作一些后端的实验。另外UIUC还有一门高级的编译器课程,是使用JAVA语言来编写。重要的是这个CS426                                能够下到所有课程的资料,包括源码。 感兴趣的朋友可以试试。

–                                这个系列的文章主张使用现有的工具体验如何实现编译器。注重快速高效的实现,主要关注前端。有兴趣了解和学习LLVM                                中间表示和工作机制的朋友不要错过。

还有如下的参考资料(? Link to a PDF, $ Link to a printed                               book):

两个新闻组,可以上去请教问题:

想起某人在饭桌上曾经的感慨,I have a                               dream….. 一直以来,都觉得编译器高深莫测。做个编译器出来,或许很难,但做了可能就不能。                               可能是勇气不足。再等等吧,总有一天我要把它实现!。。。。。。。

compiler的更多相关文章

  1. Java compiler level does not match解决方法

    从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description  Resource Path Location Type Java compiler level d ...

  2. idea报错:error java compilation failed internal java compiler error

    idea下面报如下问题 error java compilation failed internal java compiler error 解决办法:Setting->Compiler-> ...

  3. 使用Google Closure Compiler高级压缩Javascript代码注意的几个地方

    介绍 GCC(Google Closure Compiler)是由谷歌发布的Js代码压缩编译工具.它可以做到分析Js的代码,移除不需要的代码(dead code),并且去重写它,最后再进行压缩. 三种 ...

  4. SSE指令集学习:Compiler Intrinsic

    大多数的函数是在库中,Intrinsic Function却内嵌在编译器中(built in to the compiler). 1. Intrinsic Function Intrinsic Fun ...

  5. c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9

    今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...

  6. Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法

    今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ...

  7. Compiler Error Message: CS0016: Could not write to output file 回绝访问

    Compiler Error Message: CS0016: Could not write to output file 'c:\Windows...dll' 拒绝访问 C:\Windows\Te ...

  8. idea Error:java: Compilation failed: internal java compiler error

    idea 遇到Error:java: Compilation failed: internal java compiler error 是提示说你当前使用的编译器jdk版本不对. 按住Ctrl+Alt ...

  9. 关于The C compiler "arm-none-eabi-gcc" is not able to compile a simple test program. 的错误自省...

    在 GCC ARM Embedded https://launchpad.net/gcc-arm-embedded/ 上面下载了个arm-none-eabi-gcc 用cmake 编译时 #指定C交叉 ...

  10. java compiler level does not match the version of the installed java project facet 解决方案

    项目出现 java compiler level does not match the version of the installed java project facet 错误,一般是项目移植出现 ...

随机推荐

  1. 面向对象之prototype,__proto__

    var person = function(name) { this.name = name }; person.prototype.getName = function() { return thi ...

  2. 禁用gridview默认点击效果

    cf_gridview.setSelector(new ColorDrawable(Color.TRANSPARENT)); 然后自己给做一个按下的效果xml文件

  3. poj2955 区间dp

    //Accepted 200 KB 63 ms //区间dp //dp[i][j] 从i位到j位能得到的最大匹配数 //dp[i][j]=max(dp[i+1][j-1] (s[i-1]==s[j-1 ...

  4. sidePagination: "server"和responseHandler: responseHandler

    bootstrapTable()中有两个属性 一个是sidePagination,表示服务器分页,responseHandler:responseHandler 表示回应操作的rows和total 两 ...

  5. hdu 2080

    ps:水题...求夹角...先求出COS,然后用acos 代码: #include "stdio.h" #include "math.h" int main() ...

  6. python随笔

    1. 使用iter实现接收用户多行输入 stopword = '' str = '' print('请将要添加的内容输入下方,输入空白行按回车退出程序:') for line in iter(inpu ...

  7. pyMagic:用python控制的Geek入门神器

    大学四年快要结束了,这几年也学习了一点新的姿势.最近一直在跟国外的micropython项目,这个项目是由剑桥大学的理论物理学家(theoretical physicist)Damien George ...

  8. 官方文档学习之《start developing iOS apps(swift)》

    1.  let 关键字是用来定义常量的,任何类型的常量都可以进行定义:例如:定义字符串 let constantValue1 = "this is a string",也可以定义数 ...

  9. 深入分析:Android中app之间的交互(二,使用ComponentName)

    在前一篇相关主题的博文中我们了解了如何使用Action来启动当前应用之外的Activity处理我们的业务逻辑,在本篇笔记中我在简单介绍一下使用ComponentName来与当前应用之外的应用进行交互. ...

  10. BZOJ 1600 建造栅栏

    O(N)分成1,2与3,4两部分搞一搞. #include<iostream> #include<cstdio> #include<cstring> #includ ...