编译器的书

阅读更多
有关编译器的书中"Dragon Book" (Compilers: Principles, Techniques, and Tools)是最经典,最有名的一本,但其实是对很多想学习编译器的人非常不适合的一本书.这本书的内容更适合的读者是编译器的研究人员,或者想构造parser generator等底层工具的开发者.我认识的大多数人往往是想了解编译器的工作原理,或者作一个中小型的编译器,Dragon book里的太细致的学术理论解释其实帮助并不大.结果很多把Dragon book当作自己编译器入门书的人,错以为编译器是什么dark art而放弃了.

由于编译器已经理论技术都很成熟了,本身不是很active的研究领域.所以Dragon book的理论内容仍很完备,尤其是第二版加上garbage collection, JIT等内容之后.记得上学的时候,教授本来想挑选更新些的教材(当时没有第二版),最后还是沿用了Dragon book.

Modern Compiler Implementation in Java则是另外一种类型的书,较生动的讲解加之更现代的例子,使书读起来有趣很多.当然如果想更快的上手的话,剑桥的一份课程笔记非常值得推荐:
http://www.cl.cam.ac.uk/teaching/2004/CompConstr/NEJ/report.pdf
里面用了ANTLR作为语法分析的例子,.NET作为代码生成的平台.

还有关于parser generator的主题.yacc family基本上是最知名的,当然本身也是很流行,很有用的工具.LR类别的语法分析器也被众多研究证明是运行速度更高.但我们常用的编译器,如sun的java,visual studio的c++/C#等,却都是手写的recursive decent parser.这主要的原因就是维护性和报错.

看一些yacc(bison)的代码输出可以发现,绝大部分输出的代码是无法阅读的巨大的integer table.同时,好的编译器在报错方面的要求很高,需要在各个地方插入的与报错相关的代码,这样的代码对于yacc类的工具则很不好结合起来.现在ANTLR,javacc这样的recursive decent parser geneator比较流行的原因,也是它们能自动化很多工作,同时比较容易插入手写的代码.

Bjarne Stroustrup在The Design and Evolution of C++也提到了这个问题.他在设计c++的parser时选了yacc,但后来发现其实如果当时用手写一个recursive decent parser会更好.

你可能感兴趣的:(编程,C,C++,C#,Unix)