5

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

 3 years ago
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.
neoserver,ios ssh client

V2EX  ›  程序员

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

  paranoiddemon · 1 小时 58 分钟前 · 960 次点击

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

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

25 条回复    2021-09-17 15:03:45 +08:00

ipwx

ipwx   1 小时 47 分钟前

楼主觉得不明白,是因为楼主假设这里的定义是别人用过的,肯定有更详细的定义。但其实。。。

这里就是完整定义了啦!
====

读过论文的都知道,论文里面对于新符号的定义也就这么点篇幅。

ipwx

ipwx   1 小时 46 分钟前

顺便这里其实定义了这些符号。。。

ipwx

ipwx   1 小时 46 分钟前

不同文献的定义其实各有不同的,没有 universally consistent 的定义。读这种文献的一个重要技能就是快速适应新的符号系统 2333

MeatIndustry

MeatIndustry   1 小时 22 分钟前

B 站搜索斯坦福编译原理。
这个确实抽象的一批,如果能亲自做个根据 CFG 解析的 Parser,则好理解的多。

zjsxwc

zjsxwc   1 小时 16 分钟前

额,以前我是看中文教程, 裘巍《编译器设计之路 》设计 pascal 的书, 当时龙书我也看得头疼。

echo1937

echo1937   1 小时 7 分钟前

楼主是学生还是工作了,学习编译原理是爱好还是工作需要

我学了好几次了,都没坚持下去。

Cola98

Cola98   1 小时 3 分钟前

如果只是为了做东西的话,就可以跳过这些定义,直接上手做就行了

ch2

ch2   1 小时 0 分钟前

根据我的学习经验,编译原理你学学 LL(1)就行了,LR 的资料非常少
github 上能按教科书级别把 LR 语法分析器代码实现的稍微像点样的项目一只手就数的过来
学别的至少你都有很好的参考,编译原理到实际用的时候通常都是离底层词法跟语法分析器很远的库直接调就行了
是我去解决能用到编译原理的问题,我肯定直接正则表达式+yacc 就一把梭了,LALR(1)的算法跟原理细节学了你也没多少机会复盘,不像别的课程可以常学常新

paranoiddemon

paranoiddemon   58 分钟前

@echo1937 工作了。属于是爱好吧,比较好奇高级程序语言是怎么变成机器指令的。确实要学下去难度比较大

paranoiddemon

paranoiddemon   56 分钟前

@ipwx 感谢回复,就是以前没看过看 CS 理论的文献。突然很多符号,有点适应不了

Junzhou

Junzhou   55 分钟前

我毕业了之后就再也没有看过编译原理了。。。

ch2

ch2   54 分钟前

顺带提一句,排行榜里排得上号的编程语言的编译
为了追求灵活性跟性能,基本上都是用非常特化的方法处理的,一门语言一个 case
你在教科书上学的通用编程语言语法分析器的设计,在实际中只是非常基础并非不能不用的那种
不像你学网络那就绕不开 socket 、epoll 这些,基本上可以说学了就是屠龙

paranoiddemon

paranoiddemon   54 分钟前

@ch2 其实我还不太清楚 LR LL 是什么,不过你的建议我先记着

paranoiddemon

paranoiddemon   49 分钟前

@ch2 好的,非常感谢你提供的信息,工作中目前确实甚少用上编译器相关的知识,主要还是因为个人兴趣。加上本来本科也没上过相关课程,还是希望知识体系稍微完整一些。

paranoiddemon

paranoiddemon   41 分钟前

@misaka19000 看了下这个似乎没那么理论化。谢谢!

Exin

Exin   41 分钟前

动手做一个最简单的,就学会了

kuro1

kuro1   26 分钟前

写个 PL/0 编译器

Mistwave

Mistwave   16 分钟前 via iPhone

https://craftinginterpreters.com/
这本不错,最近看了一多半了,推荐一下,web 版免费看。
没那么理论,learn by doing
作者是大佬,以前写过游戏设计模式那本经典

ch2

ch2   9 分钟前

@paranoiddemon #18 这个用的是递归下降,优点是代码量可以很小,缺点是语义耦合在了代码动作里。比如我要做计算器,只做加减乘除当然很简单,但是当我想要分阶段完成支持括号、阶乘、指数、对数......的时候,用标准的 LL 或者 LR 分析法,只需要改文法的产生式,然后再一条一条搞定语义子程序就好了。递归下降则是人力把各种 case 的处理的语义翻译成代码,除非你是对语义非常熟悉的老编译器要不然是很难 debug 的

Martin9

Martin9   5 分钟前

@misaka19000 #16 《 30 天自制操作系统》, 作者川合秀实

DianQK

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

misaka19000

misaka19000   1 分钟前

@Martin9 是的,确实是这本,感谢提醒

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK