编译原理,值得学吗

2014-02-26 00:28:14 +08:00
 chenyg32
v2ex的各路大神怎么看?
今天问了编译原理的老师,学了编译原理究竟有什么实用,老师说主要是用在新软件的开发上,至于那些C++,Java的编译器根本不需要我们来改进。所以我想问,学了编译原理对一个偏向开发型的计算机科学与技术的学生的职业生涯的帮助大吗?虽然说技多不压身,但同时开的课还有人工智能,我只能2选1,能否给个建议?
10955 次点击
所在节点    程序员
44 条回复
jakwings
2014-02-26 00:35:42 +08:00
有时间的话值得学。可以提高对程序本质和代码运行效率的理解,深入对大型软件架构的思量,以后还可以自行改进其它人写的各种编译工具(大型或小型)。其实一个编译原理的方向已经包含了 N 多的知识,各种数据结构的运用。人工智能也需要考虑和语言分析有关的编译原理,否则人工智能也只能停留在理论的领域。当然人工智能的理论是编译原理课程不会说的。
以上纯属个人对大牛的羡慕引发的评论。
jakwings
2014-02-26 00:38:53 +08:00
@jakwings 「人工智能也需要考虑和语言分析有关的编译原理,否则人工智能也只能停留在理论的领域。」改为「人工智能涉及的数据分析若没有合适的编译方法,难以提高效率。」
slixurd
2014-02-26 00:39:46 +08:00
我觉得很有用...就拿正则文法来说,这可是"正则表达式"的基础,让你理解为什么正则可以这样写,为什么正则可以用来匹配一切句子,当然你可以说会用就行,但是更深入理解不是更好?
当然除了正则文法还有很多其他类型的文法,在这些不同的文法之上有着不同的分析方法

人工智能虽然是门好课,但是讲得太泛,大概你们开讲也只会讲讲贝叶斯推断,主观贝叶斯,极大极小值法,简单的搜索问题,还有一些离散数学学过的命题逻辑....真的不如去学编译原理...哦,对,我们人工智能还讲了ID3决策书和一点高级搜索..
zzNucker
2014-02-26 00:45:34 +08:00
恩。。。 还可以自己弄个检查语法之类的小工具。
chenyg32
2014-02-26 00:54:21 +08:00
@jakwings
@slixurd
@zzNucker
理论上学有所成自然是好的,但是……
1.教材是龙书,听说,这本书是神书,虽然经典,但是学习起来难度很大
2.大三了,大学老师能把课教的多好心里已然有底……
3.我还是觉得学习编译原理的性价比不是很高……是不是不如好好复习下数据结构与算法,数据库之类的然后好好准备实习去,而且从众多的招聘信息上看,这种底层的东西很不吃香呀~(当然它能提高我们程序员的素养,可是就是不吃香,对?)
Golevka
2014-02-26 00:58:38 +08:00
我是因为觉得好玩所以在学 = =
firstway
2014-02-26 01:02:40 +08:00
答:有用。
多年前,偶在一个组里,里面大堆涉及处理数据的规则,绝大部分是商业规则,“商业”意味着不停的修改。
ok,情况出现了,为了修改点一点小规则(“商业无小事”),动辄要牵动一大堆东西,作为开发人员很是不爽(也承认系统架构也有问题,但是系统都是逐步演化的),但是“商业无小事”,没有办法。后来我就想把这块独立出来,怎么做呢?我想到就是设计几个简单语法规则,自动生成代码或者runtime直接执行,如果成熟了,甚至不需要开发人参与就可以做了,开发人员不就解放了吗。后来,,,,就没有后来了。因为本科编译器(因为考研)完全在混。

现在重修这门课程了,觉得确实可以这么搞,而且也有能力make it happen。

另外,如1楼所说很对。
现在知道了把比如C语言变成汇编的过程,以及简单编译优化原理等,再看一些代码,确实视角有些不同。不过道行还不够,还在修行。
quake0day
2014-02-26 01:10:55 +08:00
编译原理感觉比人工智能要更好些。人工智能这个题目太大了,感觉课上应该讲不了什么深入的东西。
jakwings
2014-02-26 01:19:43 +08:00
@chenyg32 嘛,有时间就学吧,没时间就拿来玩吧。假如龙书内容太多一下子接受不下,可以看看下面两个资料:
http://compilers.iecc.com/crenshaw/ (免费,只是示例用的语言旧了点,不过可以用其它语言模仿)
http://createyourproglang.com(收费,仅提供部分免费章节,我没看过)
otakustay
2014-02-26 01:31:41 +08:00
总之我现在比较后悔的大学里没认真学好的课之一就是编译原理
dorentus
2014-02-26 02:17:02 +08:00
既然老师有信心选龙书为教材,那就更应该学了。
ivenvd
2014-02-26 02:28:59 +08:00
如果你把编程当成工作的话就学人工智能,然后以后忽悠面试官一愣一愣的。
如果你把编程当成志向的话就学编译原理,个人认为是提升内功最大的一门课。
mikawudi
2014-02-26 02:57:30 +08:00
学校破没开编译原理,自己抱着书肯下了一个编译前端的路过....个人认为编译原理绝对很值得学,学习编译原理的过程中了解乔姆斯基文法体系,才懂得正则表达式引擎是怎么实现的,学会状态机编程,然后语法分析的时候,边学语法分析边把递归完全掌握(当然也能用下推自动机那一套来实现),后面还有语义分析,AST构建等等.....个人觉得对最有用的几门课(编译原理,组成原理,数据库原理,数据结构,算法导论).....当然,我觉学编译原理最重要的是要自己动手写代码....否则那种东西纯听听看看要理解完全是扯淡....反正我是边学边弄了个类似asp那样的服务端标签语言的解释器...以上纯个人经验~
msg7086
2014-02-26 06:05:32 +08:00
@otakustay 虽然我是觉得那课讲得太浅了……
simapple
2014-02-26 08:51:50 +08:00
比较有必要,做任何一行,能熟知内部的原理还是很有帮助的,任何高级语言的瓶颈都要通过对内部的拓展来解决
zhfsxtx
2014-02-26 09:02:27 +08:00
选什么并不重要,重要的是你觉得自己选对了。
shizhz
2014-02-26 09:06:37 +08:00
个人愚见先学习编译原理,老师都选择龙书作为教材了就给自己做个计划趁还在学校内把这本书嚼一遍,能消化多少先消化多少。
以前上学时“编译原理”和“人工智能”两门课学校都开过,但是现在回想起对人工智能讲了什么完全没印象了,当然编译原理也没学好,当时只记得太难学了,考试前在图书馆拼命啃了一周才弄懂一些基本的东西,狼狈的把考试过了。当然我那时候比较笨,也不会利用网络资源,对这些知识为什么要学处于完全迷茫的状态,所以落这么个结果也很正常。但是我现在认为如果真心想要做一个好程序员的话,这些基础的知识是必须具备的,也是提升你对程序理解的必经之路,因为总有一天你不会满足于“it works", 而想知道"how it works"。
以上都是个人建议,我这么想是因为我最近又重新抱着”离散数学“看,马上看完了也打算去啃一遍”龙书“。工作几年后还在看这些书在别人看来是很奇葩的事,会面临很多人问同一个问题就是“你看这玩意儿有用么”,我相信这个问题也是LZ疑惑的核心,说实话我觉得这是个无解的问题,并且带有很强的功利性和目地性,想太多了容易变得很浮躁,与其花心思去找这个问题的答案还不如客观去分析下该部分知识处在计算机领域的什么位置,然后根据自己的就业倾向、当前状况、好奇心程度等去选择要不要学。
vietor
2014-02-26 09:06:48 +08:00
05左右有人说过:学不好《编译原理》就写不好程序。而事实是从事软件开发的越来越多的。
Mutoo
2014-02-26 09:12:31 +08:00
开发型的,知道编译原理当然比不知道的好。例如在游戏开发领域,经常自己编写一些简单的脚本语言用在console调试游戏或者各种部件开发(GUI,关卡),虽然现在lua和jsb(javascript bind)很流行,但是自己写的脚本语言可控性更强一些。
wolflee
2014-02-26 09:37:36 +08:00
@chenyg32
1. 如果只看指定的教材,说明你还在被动学习
2. 如果只靠老师教,同上
3. 等你过着过着就明白了,性价比是狗屎,买东西如是,学知识更甚之;底层的东西你弄好了,不吃香?眼界可以不用只局限在国内的工作
当然AI学好了也是极好的,感觉你自己已经有主意了,学自己感兴趣的是要紧事,非要限定领域也挺没劲的。

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

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

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

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

© 2021 V2EX