编译原理大家是怎么学习的?

2021-09-17 13:06:27 +08:00
 paranoiddemon

非科班,最近在看 Enginnering a compiler 。看第二章 scanner 部分讲正则和自动机还勉强能理解。 第三章 parser 讲 CFG 引出了一堆符号和概念,感觉完全看不明白。

不知道大家是怎么学的,有没有更基础的视频课程推荐或者其他更入门的书推荐的?

10746 次点击
所在节点    程序员
69 条回复
Mistwave
2021-09-17 14:48:46 +08:00
https://craftinginterpreters.com/
这本不错,最近看了一多半了,推荐一下,web 版免费看。
没那么理论,learn by doing
作者是大佬,以前写过游戏设计模式那本经典
ch2
2021-09-17 14:55:02 +08:00
@paranoiddemon #18 这个用的是递归下降,优点是代码量可以很小,缺点是语义耦合在了代码动作里。比如我要做计算器,只做加减乘除当然很简单,但是当我想要分阶段完成支持括号、阶乘、指数、对数......的时候,用标准的 LL 或者 LR 分析法,只需要改文法的产生式,然后再一条一条搞定语义子程序就好了。递归下降则是人力把各种 case 的处理的语义翻译成代码,除非你是对语义非常熟悉的老编译器要不然是很难 debug 的
Martin9
2021-09-17 14:59:53 +08:00
@misaka19000 #16 《 30 天自制操作系统》, 作者川合秀实
DianQK
2021-09-17 15:00:42 +08:00
支持一下楼上,可以考虑 自己动手实现 Lua + https://craftinginterpreters.com/ 一起看,有一些重叠内容,但也有不少补充内容。
自己动手实现 Lua 这本因为一些原因我只看到 17 章,后面会回来再看
正在看 craftinginterpreters,目前看到了 24 章

这两本非常值得一看,语法分析那里基本都用了递归下降的方法,这个相对其他算法似乎会容易一些(而且似乎现代的语言都优先使用递归下降,这个不知道,书里这么说的)。

截图的这个符号,楼主一定得突破,这是理解的关键,图片中的 Paren 和 Bracket 看起来会互相转换有点烧脑,但这里并非互相转换,**只是解析的语法内部可以再套这个结构而已**。就像这样 ([1+2]) 或者 [(1+2)] 都是合法的语法。

craftinginterpreters 里面会有 decl (声明变量) -> stmt (普通语句) -> block (代码块) 的转换。

block 里面也可以套 decl 嘛,所以会有类似图片那样的烧脑的结构,是个(递归)解析的规则。

> 另外之前看过虎书,说实话跪了。。不过现在再看可能会好一些。

我的部分书单供参考: https://trello.com/b/IkJcQ7cp/2021-study
misaka19000
2021-09-17 15:03:45 +08:00
@Martin9 是的,确实是这本,感谢提醒
learningman
2021-09-17 15:05:02 +08:00
我现在就在边哭边看龙书。。。
misaka19000
2021-09-17 15:06:55 +08:00
@Martin9 抱歉,弄插了。。。这个是自制操作系统的,楼主要的是自制编译器的😂

我又找了下,应该是这本《自制编译器》:
https://book.douban.com/subject/26806041/
ctrlaltdeletel
2021-09-17 15:12:36 +08:00
最近看了本 [自己动手实现 Lua]( https://book.douban.com/subject/30348061/) 还挺好看的。内容涉及 lua 解释器的前端和后端虚拟机。书里面代码从头实现出来,实践性很强。
PythonYXY
2021-09-17 15:29:11 +08:00
对于符号和概念理解有困难的话可以参考下《离散数学》以及《形式语言与自动机》
aasdkl
2021-09-17 15:35:59 +08:00
我编译原理是大学的时候选修的

虽然没有好好听课,都是后面做大作业的时候自己看龙书(中文的)……但是在讲例子的时候都有认真在听

所以我觉得在学习自动机分析器这些内容的时候,有个视频一步步带着,就像 debug 一样还是比较好理解的
Rwing
2021-09-17 15:53:44 +08:00
能把编译原理讲好的网课太少了
zke1e
2021-09-17 16:46:45 +08:00
Enginnering a compiler 写得已经很好了,这种经典书籍都是要读很多遍才能慢慢理解的
ipwx
2021-09-17 17:08:33 +08:00
现在的编程语言很少用递归下降的方法了。

更多的是类似于 PyParsing 那种自顶向下回溯搜索的方式。。
ipwx
2021-09-17 17:09:11 +08:00
现在的编程语言很少用递归下降的方法了。
=>
现在的编程语言很少用 LL LR 这类的方法了。
pisc
2021-09-17 17:52:40 +08:00
看不懂。。。就跳过呗。。。Parser 和后面的中后端没啥关系,拿到 AST 就行了
pisc
2021-09-17 18:00:51 +08:00
说实话,学习编译原理,私以为可以很简单,比如可以看看 SICP,先从小的东西写一遍,就对 PL 很多东西有点初步的认识了,之后再挑具体的兴趣点深入就行了,传统编译原理的书都比较工程、具体、复杂化,对新手非常不友好,导致很多新手学编译原理连 Parser 都走不过(看看楼上的评论),实际上,用 Scheme 这种半结构化语言,Parser 是不需要花什么精力的,也能更快迈入到中后端有意思的东西。
Orlion
2021-09-17 18:45:29 +08:00
网易云课堂有个视频: https://study.163.com/course/introduction/1002830012.htm ,可以跟着敲一遍代码应该就懂了,再回头看各种编译原理的理论就好懂了。by the way,前端学完了感觉就那么回事,无非就是一些算法,真正的星辰大海还是后端😄。
Hconk
2021-09-17 18:46:02 +08:00
看过自己动手实现 Lua 感觉还行,书上是用 go 实现的,可以自己用别的 C++或者别的语言实现一遍。
secondwtq
2021-09-17 19:25:16 +08:00
实际上大多数常用的语言实现前端用的都是手写递归下降。原因无非就是方便 hack,灵活。
不过也有例外,比如 OCaml 和 Haskell 貌似都是用的自家的 generator 。
自己玩可以用 parser combinator 。所以你把这块绕过去也无所谓,后面有的你看。

编译方面最牛逼的书私以为是 Optimizing Compilers for Modern Architectures,这书能让你了解最牛逼的那些编译器(传统意义上)都在做些什么。
xbtu
2021-09-17 19:36:57 +08:00
作为看过编译器源码的我说下自己的经验:
1:看两遍龙书,看懂大致的内容。
2:找一个简单的,功能齐全的编译器源码研究-比如上面提到过的 lua 源码(lua5.15 就好,再高了,基础不牢,太费劲)
经过这两布下来,你就基本上搞清楚了一个编译器的大致内容。shankusu.me 这个网站有 lua 编译器源码相关的内容,可以上来看看。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/802520

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX