值得推荐的入门书

(原帖发在ItEye的HLLVM群组,地址:http://hllvm.group.iteye.com/group/topic/39194)
一点历史
几年前日本流行过一段时间「俺言語」「オレオレ言語」「OreScript」(自制语言)潮。Ruby作为编程语言的成功普及对这个潮流有很大推动作用。本书便是在此背景下诞生的。
作者之前就对C、Java等语言挺熟悉的,写过几本书,也一直有意愿写本实现编程语言的书。后来看到某本不太能行的书(https://book.douban.com/subject/25794665/)之后大概更加觉得应该自己出马了吧 XD
虽然这本书不是我写的,也不是我翻译的,但我对它还是颇有感情。某种意义上说,我对引进这本书也有一点责任感。大概是2007年底或者2008年初,我应该是在看Lightweight Language Spirit 2007(http://ll.jus.or.jp/2007/)的资料时留意到原本作者还在自己的主页(http://kmaebashi.com/programmer/devlang/)和Hatena(http://d.hatena.ne.jp/kmaebashi/)上Web连载自制编程语言系列的文章。当时我就有跟着读,觉得作者能一步步把语言功能都实现出来挺好的。
光读文章不动手练练也没用,所以我也有把这系列配套的代码编译出来把玩。当然,这系列两种语言的实现都只是入门级,边把玩边能找出很多可以改进的地方,可以在上面做各种实验做优化或添加功能,也挺好玩的。
后来作者把整个系列整理成书,我也就赶紧买了一本以表支持。
然后断断续续有试着把这本书推荐给国内的出版社看看有没有机会引进,终于图灵接了下来,我也觉得挺欣慰的。虽然最终结果上来说我会期待能翻译得更好一些⋯呃呵呵。
本书定位
本书明确定位为一本入门书,面向的读者群是没有实现过编程语言、对编译原理不熟悉,但又对此感兴趣、想学习这方面知识的人。
在此定位之上,我相当推荐本书作为入门的第一本书,学习实现编程语言相关的基本知识点。同时自己动手使用配套代码做实验,观察和感受实际程序的运行,并尝试自己动手修改和增强其实现代码。
光读这本书还只是挠了挠痒痒,读了觉得还没吃饱那就对了,上道了
后续还想进一步学习的话,可以再读些经典书籍,例如:在编译原理方面可以读虎书和龙书;特定于语法分析方面可以读Parsing Techniques;在GC方面可以读GC手册,等等。
既然已有那么多经典书,为什么我还要推荐从这本开始,而不是直接去读那些经典书呢?
我一直觉得在入门阶段能够有实际可运行的、小规模简单的实现作为参考,对学习有很大帮助。本书正好提供了充分的范例代码来让读者把玩。
相比之下,
* 虎书还好,言简意赅但一路有范例代码,但它的C版代码写得像Java一样、Java版代码写得像C一样,ML版虽然很赞又可能有很多人看不懂⋯
* 龙书只有第二章对应有编译器前段的范例代码,后面大部分内容都比较抽象,用这本书来入门恐怕会觉得像撞墙一样;
* GC手册直接啥范例代码都没有,只有理论⋯
而从知识面来看,本书也比较出色。本书循序渐进、由浅到深地讲解了丰富的基础知识,不但覆盖了常见的编译原理入门,更难能可贵的覆盖了许多运行时支持系统(runtime system)的知识,特别是对象、虚方法分派、闭包、异常、GC等。对这些知识点好奇的读者至少能通过本书了解到相应的基础概念以及入门级实现是怎样的。
与此相比,其它一些同类入门书(参考这个豆列 https://book.douban.com/doulist/2529382/)通常只覆盖到编译原理入门,外加只支持数字、字符串等原始类型的解释器,而没有覆盖前面提到的运行时支持系统的知识点。
从语言设计看,本书的两个范例语言,crowbar可以看作是简化的JavaScript(没有实现原型继承), 而Diksam可以看作是基本版的Java,在入门范例语言中已经算不那么玩具的了。两者都与热门语言沾边,正好迎合了一些同学想窥探热门语言的实现、但苦于没有足够知识基础的学习需求。
从实际实现看,crowbar与Diksam都确实相当的入门级:结构简单,功能基本正确(配套代码有少量问题),性能嘛⋯就呵呵了。
但还别说,现实中许多大名鼎鼎的编程语言的实现也没好到哪儿去。早期JavaScript引擎中,像JavaScriptCore的早期版及其前身的KJS都使用树遍历解释器,跟crowbar的相似。这些引擎中使用最弱的形态的discriminated union来实现值表现形式(value representation)也跟crowbar的做法相似。而某些早期JVM的内部实现也跟Diksam的许多部分颇为相似。有了本书的基础,再去了解实际生活中可以见到的基于解释器的编程语言实现就会轻松许多。
稍有基础的读者读了可能会觉得不过瘾,因为想进阶阅读的知识在这本书里很难找到:更完善的语法分析器、高性能的解释器、高性能的对象系统和GC、JIT编译器等等,所以可能会对本书有所不满。但这本书本来就不是进阶读物而是入门读物,如果有同学仔细阅读完还觉得不过瘾的话,那您的水平应该已经超过这本书的目标读者群,该去读点重量级一点的书了。
P.S. 作为JVM从业者,我也不隐瞒我推荐这本书有私心:有这么一本书介绍了各种知识点的基本概念和简易实现,我就不用总是费那么多事去讲解;而没比较就没有进步,知道简易实现是怎样的之后会更有动力追求高效的实现,这样我就可以有更多同行了 >_<
P.S.S. 这本书的配套代码实现有些微妙的bug,如果读完整本书都没觉得有bug的话你可能就中招了⋯欢迎找茬~
一点历史
几年前日本流行过一段时间「俺言語」「オレオレ言語」「OreScript」(自制语言)潮。Ruby作为编程语言的成功普及对这个潮流有很大推动作用。本书便是在此背景下诞生的。
作者之前就对C、Java等语言挺熟悉的,写过几本书,也一直有意愿写本实现编程语言的书。后来看到某本不太能行的书(https://book.douban.com/subject/25794665/)之后大概更加觉得应该自己出马了吧 XD
虽然这本书不是我写的,也不是我翻译的,但我对它还是颇有感情。某种意义上说,我对引进这本书也有一点责任感。大概是2007年底或者2008年初,我应该是在看Lightweight Language Spirit 2007(http://ll.jus.or.jp/2007/)的资料时留意到原本作者还在自己的主页(http://kmaebashi.com/programmer/devlang/)和Hatena(http://d.hatena.ne.jp/kmaebashi/)上Web连载自制编程语言系列的文章。当时我就有跟着读,觉得作者能一步步把语言功能都实现出来挺好的。
光读文章不动手练练也没用,所以我也有把这系列配套的代码编译出来把玩。当然,这系列两种语言的实现都只是入门级,边把玩边能找出很多可以改进的地方,可以在上面做各种实验做优化或添加功能,也挺好玩的。
后来作者把整个系列整理成书,我也就赶紧买了一本以表支持。
然后断断续续有试着把这本书推荐给国内的出版社看看有没有机会引进,终于图灵接了下来,我也觉得挺欣慰的。虽然最终结果上来说我会期待能翻译得更好一些⋯呃呵呵。
本书定位
本书明确定位为一本入门书,面向的读者群是没有实现过编程语言、对编译原理不熟悉,但又对此感兴趣、想学习这方面知识的人。
在此定位之上,我相当推荐本书作为入门的第一本书,学习实现编程语言相关的基本知识点。同时自己动手使用配套代码做实验,观察和感受实际程序的运行,并尝试自己动手修改和增强其实现代码。
光读这本书还只是挠了挠痒痒,读了觉得还没吃饱那就对了,上道了
后续还想进一步学习的话,可以再读些经典书籍,例如:在编译原理方面可以读虎书和龙书;特定于语法分析方面可以读Parsing Techniques;在GC方面可以读GC手册,等等。
既然已有那么多经典书,为什么我还要推荐从这本开始,而不是直接去读那些经典书呢?
我一直觉得在入门阶段能够有实际可运行的、小规模简单的实现作为参考,对学习有很大帮助。本书正好提供了充分的范例代码来让读者把玩。
相比之下,
* 虎书还好,言简意赅但一路有范例代码,但它的C版代码写得像Java一样、Java版代码写得像C一样,ML版虽然很赞又可能有很多人看不懂⋯
* 龙书只有第二章对应有编译器前段的范例代码,后面大部分内容都比较抽象,用这本书来入门恐怕会觉得像撞墙一样;
* GC手册直接啥范例代码都没有,只有理论⋯
而从知识面来看,本书也比较出色。本书循序渐进、由浅到深地讲解了丰富的基础知识,不但覆盖了常见的编译原理入门,更难能可贵的覆盖了许多运行时支持系统(runtime system)的知识,特别是对象、虚方法分派、闭包、异常、GC等。对这些知识点好奇的读者至少能通过本书了解到相应的基础概念以及入门级实现是怎样的。
与此相比,其它一些同类入门书(参考这个豆列 https://book.douban.com/doulist/2529382/)通常只覆盖到编译原理入门,外加只支持数字、字符串等原始类型的解释器,而没有覆盖前面提到的运行时支持系统的知识点。
从语言设计看,本书的两个范例语言,crowbar可以看作是简化的JavaScript(没有实现原型继承), 而Diksam可以看作是基本版的Java,在入门范例语言中已经算不那么玩具的了。两者都与热门语言沾边,正好迎合了一些同学想窥探热门语言的实现、但苦于没有足够知识基础的学习需求。
从实际实现看,crowbar与Diksam都确实相当的入门级:结构简单,功能基本正确(配套代码有少量问题),性能嘛⋯就呵呵了。
但还别说,现实中许多大名鼎鼎的编程语言的实现也没好到哪儿去。早期JavaScript引擎中,像JavaScriptCore的早期版及其前身的KJS都使用树遍历解释器,跟crowbar的相似。这些引擎中使用最弱的形态的discriminated union来实现值表现形式(value representation)也跟crowbar的做法相似。而某些早期JVM的内部实现也跟Diksam的许多部分颇为相似。有了本书的基础,再去了解实际生活中可以见到的基于解释器的编程语言实现就会轻松许多。
稍有基础的读者读了可能会觉得不过瘾,因为想进阶阅读的知识在这本书里很难找到:更完善的语法分析器、高性能的解释器、高性能的对象系统和GC、JIT编译器等等,所以可能会对本书有所不满。但这本书本来就不是进阶读物而是入门读物,如果有同学仔细阅读完还觉得不过瘾的话,那您的水平应该已经超过这本书的目标读者群,该去读点重量级一点的书了。
P.S. 作为JVM从业者,我也不隐瞒我推荐这本书有私心:有这么一本书介绍了各种知识点的基本概念和简易实现,我就不用总是费那么多事去讲解;而没比较就没有进步,知道简易实现是怎样的之后会更有动力追求高效的实现,这样我就可以有更多同行了 >_<
P.S.S. 这本书的配套代码实现有些微妙的bug,如果读完整本书都没觉得有bug的话你可能就中招了⋯欢迎找茬~
有关键情节透露