编译原理,值得学吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 成的内容
chenyg32
V2EX    程序员

编译原理,值得学吗

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

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

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

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

    LZ你的职业规划是如何? 一辈子搞IT,写程序?
    那别管了, 只要是课,只要是知识,只要是感兴趣的, 管他编译原理,人工智能,都学。
    你觉得学了这些知识对你的职业道路有坏处吗?

    但如果你的规则最终是要干其他行业,那就省省力气吧。
    有这个时间,还不如写写web后端, android/ois开发。


    总之一句话:人的精力是有限的,努力不能换来成功。
    你要有明确的人生规划,并且确定最佳的实现途径。
    hhkbp2
        23
    hhkbp2  
       2014-02-26 10:41:43 +08:00   1
    有时间精力两门都学
    没时间精力只能选一门的话,选那门你觉得没什么用处的
    shakoon
        24
    shakoon  
       2014-02-26 11:01:13 +08:00   1
    编译原理可以认真学,比较接近的形式语言和自动机这个课就不用花太多功夫了
    zzNucker
        25/span>
    zzNucker  
       2014-02-26 11:03:43 +08:00   1
    不过话说回来我觉得龙书还是不错的,我们学校用的是《编译原理及实践》,也还好,不过有的地方还是弄本龙书参考参考比较好。
    ianva
        26
    ianva  
       2014-02-26 11:38:51 +08:00   1
    大学学编译原理缺少实践啊,不好玩就很难学,现在想学是因为确实学好了可以玩很多东西,比如创建自己的规则,比如 markdown,实现一些能很很容易解决问题的 dsl,比如 jade,stylus,还可以做自己的语言,如果说前端是为了改善用户操作网站体验的技术,那么编译原理肯定是为了改善程序员写代码的体验的技术而存在的,如果编译原理玩的好的话绝对是很有乐趣的事。

    如果学编译原理最好还是自己搞点乐子比较好,找一些可应用的东西,可以产出,比如 antlr,flex+bison 等等容易出成果的工具玩玩,然后学编译原理就很有动力了
    ianva
        27
    ianva  
       2014-02-26 11:40:21 +08:00   1
    学一个东西不是为了学而学啊,应该是因为自己觉得它确实有趣,让自己的一些想法得以实践才是目的
    jianghu52
        28
    jianghu52  
       2014-02-26 12:01:11 +08:00   1
    惭愧的很,这两门课我上大学的时候根本没接触过,不敢说哪边更有助于楼主,不过作为一个半路出家,到现在已经有6年编程经验的人,可以说写感受给楼主参考。

    首先,先要说明一下什么叫做内功。在我看来,内功这个东西就是你没办法用某一个时间点,单独的一个工作来量化的东西。他是那种随着你的经历的提高,思考的深入,而慢慢的发酵的东西。所以这样的东西在你学习的初期永远不可能立马见效,甚至在你工作的前一两年都不一定用的上他。但是当你向着更高层次发展,不再局限于单纯的完成某个coder任务的时候,你就会需要他的。

    如果把一个程序的实现当做一个完整的故事来说的话,编程实际上只占用了不到10%的情节。我们敲入的字符如何变成最原始的0与1,这部分就是编译原理要教给我们的东西。

    我们有不同的编程语言,不同的语法,但是对于CPU来说,他只有0与1.学习了这种不变与变之间的规则转化,最大的好处在于当我们开始在乎性能,需要考虑结构的时候,编译原理能提供给我们很大的参照。打个比方,编译原理就属于程序世界的底层规则,大家都知道掌握了这种规则的法师一般都是比较牛逼的。

    至于人工智能,老实说我到现在也没明白这课到底讲的是什么,就不发表评论了。
    ianva
        29
    ianva  
       2014-02-26 12:05:53 +08:00   1
    把编译原理当做内功是种很功利的想法,其实学会编译原理是有很多乐子的,如果知道学会它能不能给自己带来啥乐趣才是很关键的,至少个人觉得能创造规则的造物主感觉绝对是非常有趣的
    SErHo
        30
    SErHo  
       2014-02-26 12:15:31 +08:00   1
    创造一门编程语言和一个操作系统,是很多程序员的梦想。
    luyiyuan129
        31
    luyiyuan129  
       2014-02-26 12:34:57 +08:00   1
    选修编译原理,旁听人工智能
    stupid
        32
    stupid  
       2014-02-26 12:36:46 +08:00   1
    这门课很难学,很晦涩,考试很痛苦,that's all。
    nettie
        33
    nettie  
       2014-02-26 12:54:07 +08:00   1
    非常值得学习,请认真学好。
    brickgao
        34
    brickgao  
       2014-02-26 13:00:44 +08:00   1
    人工智能也要用到编译原理呐 建议还是先选编译原理

    编译原理算是基础课程之一,虽然学了之后并不会直接用到,但是对程序的理解还是有很大的帮助的。
    miaoever
        35
    miaoever  
       2014-02-26 13:24:29 +08:00   1
    现在的《编译原理》课程所讲授的内容已经很工程化了,其中所包含的技术在现实工程中大量的使用,比如写 parser 来解析 http 请求,比如实现一个诸如 CoffeeScript 这样的 DSL,这些都是工程实践中可能会遇到的。很难想象一个合格的程序员会不懂得编译原理知识(至少是前端知识)。

    所以,最好不要抱着是在学多么高深的理论这种心态,学编译原理就跟你学编程、学算法是一样的,都是你必须掌握的基本工程技能。

    当然,编译后端、语义的设计等等就是更有意思也是更博大精深的领域了,深入进去,你会发现一个更广阔的世界。
    shoumu
        36
    shoumu  
       2014-02-26 14:05:19 +08:00   1
    个人觉得关键还是实践吧,我们《编译原理》课程设计是要实现一个C0编译器,当你独立把这个东西搞出来,你会发现不仅你学到了编译的知识,编程能力,算法设计能力等等都会有一个很大的提升,挑战性很大。龙书的话建议还是慢慢啃吧,会很痛苦,多实践。
    人工智能的话也同样,我个人觉得两门课对于理论要求都是比较高的,如果你能够在掌握好理论内容的基础上做好实践,选择哪一门课对你的锻炼都是非常好的。
    christianwong
        37
    christianwong  
       2014-02-26 14:43:10 +08:00   1
    如果你以后打算从事计算机这一行强烈建议你学编译原理,如果根本不喜欢计算机不打算做这个,那就学人工智能吧,学一学考个试能过就行了,毕竟编译原理比较难。
    julyclyde
        38
    julyclyde  
       2014-02-26 14:44:04 +08:00   1
    如果考试放水,保证你能过关的话,只需要学正则文法
    chisj
        39
    chisj  
       2014-02-26 15:58:48 +08:00   1
    很有意思的课程,强烈建议学。
    akira
        40
    akira  
       2014-02-26 17:33:03 +08:00   1
    编译原理,如果可以的话,其实我建议所有做编程的人都学。
    lyuehh
        41
    lyuehh  
       2014-02-26 18:08:50 +08:00   1
    我当年编译原理考了100, 现在啥都没印象了....
    eirk2004
        42
    eirk2004  
       2014-02-26 19:58:28 +08:00   1
    楼主哪个学校,哪个老师授课? 普通学校就算了,编译原理是比较难啃的,一般学校也就指着教材理论讲讲,考试划点题完事

    最好找学长问问清楚,咋样?怎么考试的? 再去做决定……
    yishanhe
        43
    yishanhe  
       2014-02-27 00:37:11 +08:00   1
    如果是程序员,可以看看optimization和code generation 。。
    当年学compiler的时候悲剧了,有时间还是想再学学
    c742435
        44
    c742435  
       2014-02-27 07:10:36 +08:00
    如果两个必选其一,又想获得知识,编译
    选编译要做好自己写简单的编译器的准备,不必真的编译成可执行代码,编译成自己的中间代码然后解释执行就行了。
    如果做不到,这两个课哪个好过分高选哪个吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5505 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:39 PVG 09:39 LAX 17:39 JFK 20:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86