5
编译原理大家是怎么学习的?
source link: https://www.v2ex.com/t/802520
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
非科班,最近在看 Enginnering a compiler 。看第二章 scanner 部分讲正则和自动机还勉强能理解。 第三章 parser 讲 CFG 引出了一堆符号和概念,感觉完全看不明白。
不知道大家是怎么学的,有没有更基础的视频课程推荐或者其他更入门的书推荐的?
25 条回复 • 2021-09-17 15:03:45 +08:00
ipwx 1 小时 47 分钟前
楼主觉得不明白,是因为楼主假设这里的定义是别人用过的,肯定有更详细的定义。但其实。。。
这里就是完整定义了啦!
====
读过论文的都知道,论文里面对于新符号的定义也就这么点篇幅。
这里就是完整定义了啦!
====
读过论文的都知道,论文里面对于新符号的定义也就这么点篇幅。
ch2 1 小时 0 分钟前
根据我的学习经验,编译原理你学学 LL(1)就行了,LR 的资料非常少
github 上能按教科书级别把 LR 语法分析器代码实现的稍微像点样的项目一只手就数的过来
学别的至少你都有很好的参考,编译原理到实际用的时候通常都是离底层词法跟语法分析器很远的库直接调就行了
是我去解决能用到编译原理的问题,我肯定直接正则表达式+yacc 就一把梭了,LALR(1)的算法跟原理细节学了你也没多少机会复盘,不像别的课程可以常学常新
github 上能按教科书级别把 LR 语法分析器代码实现的稍微像点样的项目一只手就数的过来
学别的至少你都有很好的参考,编译原理到实际用的时候通常都是离底层词法跟语法分析器很远的库直接调就行了
是我去解决能用到编译原理的问题,我肯定直接正则表达式+yacc 就一把梭了,LALR(1)的算法跟原理细节学了你也没多少机会复盘,不像别的课程可以常学常新
ch2 54 分钟前
顺带提一句,排行榜里排得上号的编程语言的编译
为了追求灵活性跟性能,基本上都是用非常特化的方法处理的,一门语言一个 case
你在教科书上学的通用编程语言语法分析器的设计,在实际中只是非常基础并非不能不用的那种
不像你学网络那就绕不开 socket 、epoll 这些,基本上可以说学了就是屠龙
为了追求灵活性跟性能,基本上都是用非常特化的方法处理的,一门语言一个 case
你在教科书上学的通用编程语言语法分析器的设计,在实际中只是非常基础并非不能不用的那种
不像你学网络那就绕不开 socket 、epoll 这些,基本上可以说学了就是屠龙
paranoiddemon 49 分钟前
@ch2 好的,非常感谢你提供的信息,工作中目前确实甚少用上编译器相关的知识,主要还是因为个人兴趣。加上本来本科也没上过相关课程,还是希望知识体系稍微完整一些。
Mistwave 16 分钟前 via iPhone
https://craftinginterpreters.com/
这本不错,最近看了一多半了,推荐一下,web 版免费看。
没那么理论,learn by doing
作者是大佬,以前写过游戏设计模式那本经典
这本不错,最近看了一多半了,推荐一下,web 版免费看。
没那么理论,learn by doing
作者是大佬,以前写过游戏设计模式那本经典
ch2 9 分钟前
@paranoiddemon #18 这个用的是递归下降,优点是代码量可以很小,缺点是语义耦合在了代码动作里。比如我要做计算器,只做加减乘除当然很简单,但是当我想要分阶段完成支持括号、阶乘、指数、对数......的时候,用标准的 LL 或者 LR 分析法,只需要改文法的产生式,然后再一条一条搞定语义子程序就好了。递归下降则是人力把各种 case 的处理的语义翻译成代码,除非你是对语义非常熟悉的老编译器要不然是很难 debug 的
DianQK 4 分钟前
支持一下楼上,可以考虑 自己动手实现 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
自己动手实现 Lua 这本因为一些原因我只看到 17 章,后面会回来再看
正在看 craftinginterpreters,目前看到了 24 章
这两本非常值得一看,语法分析那里基本都用了递归下降的方法,这个相对其他算法似乎会容易一些(而且似乎现代的语言都优先使用递归下降,这个不知道,书里这么说的)。
截图的这个符号,楼主一定得突破,这是理解的关键,图片中的 Paren 和 Bracket 看起来会互相转换有点烧脑,但这里并非互相转换,**只是解析的语法内部可以再套这个结构而已**。就像这样 ([1+2]) 或者 [(1+2)] 都是合法的语法。
craftinginterpreters 里面会有 decl (声明变量) -> stmt (普通语句) -> block (代码块) 的转换。
block 里面也可以套 decl 嘛,所以会有类似图片那样的烧脑的结构,是个(递归)解析的规则。
> 另外之前看过虎书,说实话跪了。。不过现在再看可能会好一些。
我的部分书单供参考: https://trello.com/b/IkJcQ7cp/2021-study
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK