新手想写一个编译器,要学习哪方面的知识?

Liky
  • 30

编译原理我知道肯定要学,准备从外国那本龙书入手,其他还需要什么知识吗?

回复
阅读 7.8k
1 个回答
cheukyin
  • 803
✓ 已被采纳

龙书太老了,所有知识点都事无巨细地列出,难以把握重点,其实不太适合作为新手教程,而且parser占据过多篇幅(parser现在有大量的工具可以直接上手用),现代编译器的重心都转移到后端了

编译原理浩瀚如海,随意挑一个细分领域都够一个Phd毕业。
对于新手,一开始不应该学习过多理论,不应该过早地陷入某项技术、某个定理的细枝末节中,
而是应该实现一个简单但完整的编译器,尽早尽快地把从编译器的整个流程过一遍,从而在整体上形成一个感性的认识,对于每一阶段的目标有一个清晰的了解。此后,若还有兴趣继续深入,则可挑选感兴趣的领域,另觅专著论文钻研

实现一个麻雀虽小五脏俱全的编译器方面,我推荐三个手把手教学的教程:

  • Essentials of Compilation
    这本书教你从零实现一个lisp语言的64位编译器,使用语言是Racketlisp的一种方言)。这本书语言简练,清晰易懂,让人读之酣然。大部分的传统教材通常是先确定下一个较大的目标,然后用整本书的篇幅去实现,不读完全书就无法一窥全貌,这很容易把读者耐心消磨殆尽,让读者产生强烈的沮丧感。与大部分传统的编译原理教材不同,此书采用渐进的教学手段,只看完前两章,读者就可以写出一个源码到64位机器码的编译器,读完第三章,就可以加入寄存器分配功能,从而使编译器初具后端优化的特性,此后每章均添加一个或多个特性,通读全书并完成代码编写后,即可对类型系统控制流作用域优化垃圾回收的实现有初步的认识和了解

  • LLVM Tutorial
    与上一本从零写编译器不同,这份教材教你如何利用llvm框架实现一个简单语言Kaleidoscope的编译器,实现语言可以用C++Ocaml(各自对应一份教材)

  • COOL
    这是virginia的公开课程,课程项目是实现一个面向对象语言COOL,项目分为两个阶段,第一个阶段是 实现解释器,第二阶段是 实现编译器

其实我觉得对于新手,一开始就写编译器不一定是很好的选择,因为编译器的重点在于后端,而后端知识对于普通程序员而言用处不大(我猜题主应该也只是想通过写编译器更好地理解编程语言而已)

从我的学习经历而言,我比较推荐先学习解释器的实现,这样可以把学习重点放在类型作用域等知识上,所谓解释器就是直接在语法树上运行,而不编译为目标语言,推荐一本很好的书:Essentials of Programming Languages,该书同为实践向教材,浅入深地讲解了各种解释器的实现,内容覆盖了环境的表示、continuation类型检查类型推导OO语言的基本实现

对了,上面的教程都没怎么提及parser,因为parser现在都很成熟了,有antlryaccbison等工具,就算不懂这些工具,直接手写递归下降也可以,没难度。如果题主对parser感兴趣,可以看看这两本书:Parsing Techniques - A Practical Guide编程语言实现模式,第一本较理论,第二本更实用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏