龙书

2014-06-03

/dragonbook.jpg

 

   我在来北京实习后,就购买了这本书,那是2012年7月。从博客和我的笔记上就可以看到,我当时在学习SICP,Common LISP, Python等基础的语言知识,所以,肯定在那个时候我是没有能力来学习这本书的。事实上,我在这一年后,也就是毕业后才开始完整阅读学习这本书的。在毕业之前,我阅读学习的是 《编译原理及实践 》K.C Louden 。因为那时候,英文阅读还是不是那么流畅,为了快速的掌握基础知识,我还是偷懒的先阅读中文版本了。
   dragon book 一直被认为是学习编译原理的最经典教材,据说LLVM 创始人 Chirs Lattner大学时候把这本书翻烂了,也有各种大师级的人物都推荐这本书。但实际上,对龙书进行分析的资料就少了,大抵是编译原理的东西还是有些难度的,推荐的多,真正阅读的少。如果说编译原理是程序员的内功基础,那么automata theory 和 language 就是编译器程序员的内功了。本书的作者Aho是超级牛的计算机大师Hopcrof的博士学生,另一位作者Ullman,也是超级牛的,而Hopcroft和 Ullman合著了著名的《自动机理论.语言和计算机导论》。Ullman这位牛人就不用说了,不知道可以自己查查。
   从我学习的经验来看,其实龙书只是入门的书,并不会很难,用来跟小白吹嘘吹嘘倒是可以,万不可在高手面前卖弄。某位前辈也曾说过。它对前端和后端的覆盖是比较全面的,这点就注定了本书的定位。preface也提到,如果在校学习此课程,需要两个季度或者一年的课程安排,通常是本科生阶段学习书籍的前一部分,基本覆盖了编译器的运行全流程,研究生阶段关注optimization,这对于一个普通的程序员,非编译器程序员,这部分的优先级要低的多了。学习者需要根据自己的目标安排好自己的时间。如果只需要弄明白语言的运行原理,只需要前半部分,稍微了解后半部分。分析一个现有的简单语言,如Lua或者Python即可。 我总结的一句话:“First make it possible, then make it better."
   特别提一下,第二章以一个简单的完整的解释器的例子来介绍了整本书要覆盖的范围了,相当于在讲课之前用一个小例子来说明。所以说,如果感觉第二章有难度,看不懂,不妨先放下。等完整的学习了前半部分的内容之后再来研究,那时,你一定感觉简单多了。
   关于学习编译原理所需要的基础,这一点实在应该谈谈。prerequisites 中说“只需要有data structure, discrete mathematics和两门编程课程以上的经验,多门编程语言的经验是有用的”,话虽如此,我认为这是放低了要求的,如果你只是听说他人观点,说学习编译原理挺牛的,在这有这些基础的时候就开始学习,大抵是要受挫折的。我也有同学在毕业之后感觉编译原理各种牛气,开始学习,没有坚持多久就放弃了。 你应该对语言的运行原理感兴趣,想要知道机器是怎么识别语意的,或者想了解为什么写C比较容易出错,写Java比较安全,写Python 为什么比较快。出自内心的求知欲,是最佳的动力。
   需要说明的一点是国内的离散数学的教材是不包括“automata theory,language"的,而国外的的教材大多包括一个章来讲解。而我认为从这样的小的事情上来看,也是能够说明不小的问题。如果你看了龙书才知道其实语言学问题本质上只是数学问题,你一定非常高兴,认为自己掌握了本质,优越感由此而生。如果说你在学习基础的离散数学的时候就知道只一点,就会认为编译原理不过如此,在学习的时候,就会把注意力集中在理解如何使用上。这中间的差别是巨大的,先行者优势在这里也有有明显的。倒不是说国内的教材就差,我觉得只是像经济发展一样:还没有到时候而已。
     

 

如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)