新手想写一个编译器,要学习哪方面的知识?
编译原理我知道肯定要学,准备从外国那本龙书入手,其他还需要什么知识吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
编译原理我知道肯定要学,准备从外国那本龙书入手,其他还需要什么知识吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
龙书太老了,所有知识点都事无巨细地列出,难以把握重点,其实不太适合作为新手教程,而且
parser
占据过多篇幅(parser
现在有大量的工具可以直接上手用),现代编译器的重心都转移到后端了编译原理浩瀚如海,随意挑一个细分领域都够一个Phd毕业。
对于新手,一开始不应该学习过多理论,不应该过早地陷入某项技术、某个定理的细枝末节中,
而是应该实现一个简单但完整的编译器,尽早尽快地把从编译器的整个流程过一遍,从而在整体上形成一个感性的认识,对于每一阶段的目标有一个清晰的了解。此后,若还有兴趣继续深入,则可挑选感兴趣的领域,另觅专著论文钻研
实现一个麻雀虽小五脏俱全的编译器方面,我推荐三个手把手教学的教程:
Essentials of Compilation
这本书教你从零实现一个
lisp
语言的64位
编译器,使用语言是Racket
(lisp
的一种方言)。这本书语言简练,清晰易懂,让人读之酣然。大部分的传统教材通常是先确定下一个较大的目标,然后用整本书的篇幅去实现,不读完全书就无法一窥全貌,这很容易把读者耐心消磨殆尽,让读者产生强烈的沮丧感。与大部分传统的编译原理教材不同,此书采用渐进的教学手段,只看完前两章,读者就可以写出一个源码到64位
机器码的编译器,读完第三章,就可以加入寄存器分配
功能,从而使编译器初具后端优化
的特性,此后每章均添加一个或多个特性,通读全书并完成代码编写后,即可对类型系统
、控制流
、作用域
、优化
、垃圾回收
的实现有初步的认识和了解LLVM Tutorial
与上一本从零写编译器不同,这份教材教你如何利用
llvm
框架实现一个简单语言Kaleidoscope
的编译器,实现语言可以用C++
或Ocaml
(各自对应一份教材)COOL
这是
virginia
的公开课程,课程项目是实现一个面向对象
语言COOL
,项目分为两个阶段,第一个阶段是 实现解释器,第二阶段是 实现编译器其实我觉得对于新手,一开始就写编译器不一定是很好的选择,因为编译器的重点在于后端,而后端知识对于普通程序员而言用处不大(我猜题主应该也只是想通过写编译器更好地理解编程语言而已)
从我的学习经历而言,我比较推荐先学习
解释器
的实现,这样可以把学习重点放在类型
、作用域
等知识上,所谓解释器
就是直接在语法树
上运行,而不编译为目标语言,推荐一本很好的书:Essentials of Programming Languages,该书同为实践向教材,浅入深地讲解了各种解释器
的实现,内容覆盖了环境的表示、continuation
、类型检查
、类型推导
、OO语言
的基本实现对了,上面的教程都没怎么提及
parser
,因为parser
现在都很成熟了,有antlr
、yacc
、bison
等工具,就算不懂这些工具,直接手写递归下降
也可以,没难度。如果题主对parser
感兴趣,可以看看这两本书:Parsing Techniques - A Practical Guide 和 编程语言实现模式,第一本较理论,第二本更实用