同事买了一本,我借过来翻了几天看完了。
这本书的内容正如书名和我的标题,就是作者自己设计与实现语言。本书包含的两门语言都是玩具式的。跟实现一门实用的编程语言(类似于C或者Perl那种)之间还是有不小的差距。而且两门语言的实现都是解释执行的,只不过第一门是一个赤果果的解释器,第二门加了一个虚拟机。但是请注意所有的一切:从语言到虚拟机都是玩具式的。实现的代码说实话质量一般。所以只适合完全没有基础的初学者。我突然想到一本类似的书 - 虚拟机的设计与实现http://book.douban.com/subject/1231974/ 虚拟机这本更差,作者以作者的认识很浅显地实现了一堆宏大的主题,然后告诉你:"喏,这就是虚拟机还有汇编器和连接器的呦,你看这些东西是很简单的嘛。"
下面的所有讨论实用的编程语言就是指C语言,而且不讨论语言的优劣只是讨论实现相关的一些情况。
对于编译器的编写,个人认为为这种自己设计的无类型而且还是解释执行的语言写实现是最简单的。静态编译的语言要复杂一些,比如编写一个C的编译器会涉及到汇编代码的生成,需要纠结类型的检查和类型转换,需要在语法分析阶段就要考虑根据变量的linkage和storage的差别来决定存储在什么地方需要使用什么样子的伪指令,尤其是C语言这种declaration语法复杂到坑爹地步的语言,parse的编写着实是头等大事(可能你会提到可以使用flex/bison,确实parse的编写会简单一些,但是你不觉得写一个很有挑战的parse也是一件很有趣的事情吗? :)。实际的语言一般会有一个语言设计者编写的language specification(但是我知道Matz的Ruby是没有的,来自二次元世界的东西果然是很特别的),这样你写编译器需要读懂specification(做编译器的前端)然后就是需要对目标机器非常熟悉(后端的代码选择和指令调度),还有同样需要熟悉的就是assembler的伪指令和目标机器的ABI(除非自己实现标准库),linker和OS熟悉最好。我写了怎么多你看到了吗?实现一门实用的语言真的需要知道很多东西,因为你要跟一堆现有的东西来接口。
对于这种偏编译器实践的书籍我看过一些,这些书几乎都是为了教学而编写的,真正接近工业级别的只有A Retargetable C Compiler - http://book.douban.com/subject/1610344/ 这本书描述的编译器是lcc,实现代码非常优秀,个人认为是唯一能媲美UNIX V6系代码的,简洁清晰,当你跟我一样天天的工作就是面对一坨14W行代码的而且代码风格极其鬼畜的C编译器做优化的时候,当你再看看lcc你会感慨世界上居然会有这么清新的东西。但是缺点是lcc没有全局优化,对于工业用途的编译器来说是不可接受的,但是当你能完全读懂lcc我相信根据一些专门讲解优化的书籍或者paper编写优化算法绝对是可以的。
另外个人认为最好的用于教学的两本书:一本是Compiler Construction - http://book.douban.com/subject/3152162/ 全书的描述逻辑异常清晰,简明扼要。个人认为是偏于教学这种书里最优秀的。很可惜国内没有引进。另外一本是Compiler design in C - http://book.douban.com/subject/1453167/ 这本书真是太TM厚了,而且这本书居然是实现了一堆的工具程序,说实话不推荐。
最后,这种偏实践的书籍如果只选择一本果断是A Retargetable C Compiler,如果再加一本是Compiler Construction,如果你实在没有基础那么看看本书-自制编程语言也是一个不错的选择。
have fun with compiler implementation, enjoy..