学完编译原理你有什么收获?

2016-01-09 17:19:09 +08:00
 Zeahoo

这个学期选了编译原理这门课,但是我只有学会了几种语法分析的方法,比如 LR(0), LR(1), SLR(1) 等……想问大家学了这门课都了解了一些什么?这些语法分析的方法对我们实际写代码或者理解代码有什么用处?

15469 次点击
所在节点    程序员
74 条回复
MiguelValentine
2016-01-10 02:46:55 +08:00
@RitzoneX 那不是编译原理能做到的。你说的是汇编。
编译原理的本体是让你学会写语言解释器或者理解它。
总而言之,如果你用汇编举其他高级语言,除了优化部分其他毫无用处。

国内的教学有坑。学紫龙书的基础应该是有汇编基础才可以。
noli
2016-01-10 02:54:03 +08:00
@jsyangwenjie 尽管 LR Parser Generator 已经不是什么高深的技术,手写递归下降目前依然是多数商业编译器的主要实现方式,因为这样的错误提示比较容易做得友好,投人力就可以搞好了——然而前提是,做这些的人必须要理解 LL ,不然根本无法工作。
budlion
2016-01-10 09:11:52 +08:00
工作中就曾利用 antrl 写过一个代码翻译器,把几百个 java 接口转换成 js ,和也曾实现过一套 DSL 语法来实现邮件查询。有兴趣可以尝试读一下 The Definitive ANTLR 4 Reference , 或者 Language Implementation Patterns, 应该会有个不错的启发。
madshaw
2016-01-10 09:57:17 +08:00
感觉用来解决模式相关的问题非常爽
jsyangwenjie
2016-01-10 10:29:38 +08:00
@noli 告诉我做商用编译器开发的有多少人?再告诉我这么些人中有多少人做的是前端部分?
Haku
2016-01-10 12:14:22 +08:00
至今不会用变量,练就了一套手撕内存的好技巧
pyufftj
2016-01-10 12:52:22 +08:00
@congeec 这个人我一直关注他,是王垠不是银。他语文水平是 IT 界里我见过最高的
WalkingEraser
2016-01-10 12:58:23 +08:00
C++是世界上最牛逼的语言(゜o゜;
LazarusX
2016-01-10 14:17:52 +08:00
目前正在通过上 Coursera 上 Stanford 开的 Compilers 课程和阅读《 Engineering a Compiler 》这本书自学编译原理。楼主问的是「学完编译原理你有什么收获」,那我说说学习编译原理之前我希望得到的收获。我自学编译原理,主要是纯粹对编译的过程比较好奇,知其然也想知所以然,本科时候没有修过编译原理,趁最近有点时间,就捡起来看看。我对编译原理这门课最大的期待主要是前端的部分,因为我觉得之后的工作中可能会在一些场景用到这部分的知识,比如解析复杂文本,设计并解析一种 DSL 等等。现在差不多把 parser 的部分学完了,在做编程作业的过程中,发现自己已经开始会对一门语言的语法设计进行揣摩和思考,这恐怕是意外的收获。

目前感觉前端部分还是比较理解的,后端的技术含量或许更高。虽然我现在对后端部分了解不多,但我觉得如果能学习到一些后端涉及到的算法也挺好的。

---

顺便吐个槽: Stanford 以及其他一些学校开设的编译课程的 parser 的 lab 就是学会使用 bison 或者 CUP ( lexer 的 lab 同理就是学会使用 lex ),我在想为什么不让学生直接手写一个 parser ,用递归下降写一个简单语言的 parser 应该不难,而用 bison 的话,有些过于简单了,而且自己写的东西要被编译一次才能成为编译器源代码的一部分,感觉怪怪的……
LazarusX
2016-01-10 14:26:59 +08:00
@LazarusX 再补充一点学习编译原理的原因。

之前一个项目涉及到了静态分析,过程中遇到一些瓶颈,同学就推荐我学习编译原理,其中的知识或许会对静态分析有帮助。
jsyangwenjie
2016-01-10 14:32:44 +08:00
@LazarusX 静态分析的话对前端根本没要求了,好好研究下 LLVM
xiaoshenke
2016-01-10 15:22:53 +08:00
装逼用,还有就是学新语言的时候会不自觉思考这用编译器怎么实现
chenai
2016-01-10 17:41:55 +08:00
我们是大三上学期开《编译原理》这门课的,学之前为了预习写了一个编译器 https://github.com/chenai/mini-c ,学完以后为了复习,又写了一个编译器, https://github.com/chenai/lily 当然都是 toy 级别的。

因为不是做编译器开发的,可能自己水平还没有体会到编译原理有什么好处吧。
至于 DSL 什么的也想过,不过你觉得中国大多数软件公司有用到的么?
我理解还不够深,但是我觉得如果你闲着没事,多写点程序,多看看书,多学点知识应该没坏处吧?
noli
2016-01-10 18:18:09 +08:00
@jsyangwenjie 偷换概念?我问你一个问题,你认为递归下降分析出错误,然后实现给出错误信息的工作,这部分属于前端还是后端?
jsyangwenjie
2016-01-10 18:59:37 +08:00
@noli https://en.wikipedia.org/wiki/Recursive_descent_parser 你告诉我,你连中间代码都没生成是怎么得到 IR 的信息?
narrowei
2016-01-10 19:05:55 +08:00
。。。为啥我们学校软件工程专业没有编译原理,导致我现在还在纠结要不要买本龙书看看-。-
noli
2016-01-10 20:39:58 +08:00
@jsyangwenjie

1. 不是所有编译过程都需要中间代码,譬如你写一个 web url routing 就没有什么鬼中间代码。但是你依然可以在一遍 pass 的过程中就找出所有注册路由过程中可能发生的错误或者歧义。又譬如 v8 jit 一样也没有什么鬼中间代码,从体验上来说它就是一遍 parsing ,要么出错要么生成 binary 。

2. “手写递归下降或者语法分析有什么意义呢” 我问的问题是关于你的这个观点的,手写递归下降是很多商业编译器的做法,这些编译器不是用任何什么 lexer generator parser generator 整出来的。你跟我扯什么前端后端,现在又扯什么 IR ,让我觉得你好像没有实在地使用过编译器的技术……

事实就是,一个十几人的编译器 team (再大一点的我就真没见过了),确实很少时候需要把精力放在 parsing 的阶段(可能这是你说的所谓前端?),主要精力都是放在生成优化,可能就是你说的 IR 阶段……

手写递归下降有什么意义?除非在 LR 分析技术有什么重大突破吧,不然 LL(*) , 例如 ANTLR 这样的工具所使用的 parsing 技术才是主流,因为这样的 parser 好写,用户友好度高。
jsyangwenjie
2016-01-10 21:23:38 +08:00
@noli 你不了解什么是编译器的 front-end 和 back-end 吗?另外我有说把精力放在 IR 阶段吗?我从头到尾在强调的都是编译技术的前端早就成熟了,在这方面挖不出什么新的研究成果了。现在更多的研究在程序分析上,特别是指针分析这两年比较火热。做编译向来就是做优化,这不仅牵扯到 IR ,还有就是体系结构等各个方面的优化。从没听说过谁还在研究前端部分的。

另外, JIT 是 JIT ,我也没说编译器一定要生成中间代码。

并且, parser 手写的原因是因为效率更高,至少我跟 IBM 的编译组交流的时候他们是这么跟我说的。当然我同意错误提示更加友好。

还有, web url routing 跟编译有什么关系?
noli
2016-01-10 22:17:39 +08:00
@jsyangwenjie

1. “手写递归下降或者语法分析有什么意义呢” 这是你自己说的,我只负责告诉你有什么意义。

2. 在 54 楼我问你,给出错误信息是前端还是后端, 55 楼你反问我关于 IR 的东西。你这是喝多了吧?

3. 处理 "/api/v1/item/<id:string>" 这样的与 URL 相关的 DSL , 并且绑定到对应的处理器,叫做 url routing 。

如果你把 LL parsing LR parsing 这部分当作前端,那我可以告诉你, ANTLR 的作者 Terrence Parr 就是研究前端的,教授,他的研究成果就是通用的 LL(*) Parser Generator 。

LL(*) 的意思是,向前看任意多个 Token ,如果你不明白这是什么意思,那你还是看看龙书再出来教育他人吧。
jsyangwenjie
2016-01-10 22:26:17 +08:00
@noli

我明白了。。。你不是研究 PLT & compiler 相关的,跟你不在讨论一个点上。

为什么我说没人研究前端了,你查一下 2000 至今 POPL PLDI OOPLA 这些会议上有多少是研究 parser 的:)

另外, Parr 的研究成果早在 90 年代就发出来了:)

LL(k)是什么意思不需要您教育。

讨论就此停止:)

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

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

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

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

© 2021 V2EX