编译原理的学习体会和建议

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的.从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及.

 

编译原理究竟难在哪里?笔者的体会,主要在这几点:

1.       错误认识: 很多人以为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高.而且可能觉得写编译器就必须完全手工来写.

2.       自动机理论: NFA,DFA之类,比较抽象,要费些脑子,特别如果学离散数学时没有学自动机理论的话,更是需要多花点时间.

3.       集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力.

4.       LR文法: 主要是又引入了自动机

 

不管哪本编译教材,即使是绝对经典龙书也不例外,都要涉及到这几个难点.由于这些内容本身不好懂,作者有再大的本事,也很难把书写得象小说那么流畅好懂.

 

明确了难点,接着想对策.大致有这么几种:

1.       端正认识: 编译原理在静态文本处理上有广泛的应用,举个简单的例子,HTML文件转化为纯文本,利用编译原理来实现非常简单.理解了编译原理的实用性,大概可以提高学习兴趣.

2.       反复看书: 这个办法看起来最笨,却是基本的方法.忘了是哪位名人说过,书只要多看,总能看得懂的.

3.       结合源码来看: 这是经典教材Compiler Design in C的作者Allen Hollub建议的方法.这本教材的特色就是包含了大段yacc,lex的代码.这也是个好方法,而且,只有看懂了代码,才能说在根本上理解了理论.当然,要完全看懂yacc的代码,工作量是很大的,而且同样要先理解理论.

4.       删繁就简,避重就轻.网上流传较广的一篇《编译原理学习导论》(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了递归下降和LL文法及相应的源码,而对LR文法,只说理解理论就可以了”.虽然这种方法回避了对于难点的学习,但是用这种方法学习,可以在较短时间内编写出一个能够运行的词法分析器和语法分析器,可以大大提高学习积极性.

 

笔者的思路大体上类似第4种方法,但也稍有不同.由于一个偶然的原因, 笔者需要编写一个词法分析器和语法分析器,用于程序源代码的静态分析.开始无从下手,硬着头皮看了点编译原理,觉得困难很大.后来偶然找到一个类似的开源程序,是利用一个叫做PCCTS的编译器自动生成工具开发的,大受启发.开源就是好!笔者找来了一个叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++c#代码),又下载了一个c语言的语法文件(因为笔者需要处理c代码文件),然后自己编了少量动作(action)语句,界面代码,分析处理代码等,就这样,在对编译原理所知甚少(以前学过的因为理解不深都忘了,只记得正则表达式)的情况下,仅用一个星期就写出了程序.

 

这次实践使笔者对编译原理兴趣大增,重新又学了一遍编译原理,并归纳出笔者认为比较实用有效的编译原理学习步骤:

1.       先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握). 这样做的好处是:

1)      可以体会到编译原理的实用性,提高学习兴趣

2)      入门容易,消除编译原理学习的畏难情绪.

3)      获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解.

4)      获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的)

2.       ANTLR之类的工具是开源(open source),可研究其源码,以便必要时自己手编分析程序.

3.       回过头来看编译原理教材. 这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破.

4.       结合教材所附源码,进一步加深对教材的理解.

 

这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为, 输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和javac的差异有关),可对照着看.

 

笔者学习VC++,深切体会到好教材的重要.笔者开始吃了劣质光盘版教材”21天学VC++”的祸害,看了一个月还如入云雾之中,后来看了《VC++技术内幕》,方才豁然开朗.但是编译原理的教材却似乎质量相差不是特别大,关键还在于合适的方法.以上方法笔者也是误打误撞总结出来的,希望有所参考价值.

编译原理一般认为是较难的一门课。从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的  立即下载

相关推荐

如何学习编译原理

学习编译原理可以通过以下几个步骤来完成: 了解编译原理的基础知识: 了解编译器的基本概念, 包括源代码, 目标代码, 编译器, 链接器, 编译过程等。 学习编译原理的基本理论: 了解编译器的基本架构, 包括词法分析, 语法分析, 语义分析, 中间代码生成, 优化, 目标代码生成等。 学习编译器的实现方法: 学习如何使用各种编译器生成工具, 包括词法分析器生成工具, 语法分析器生成工具, 中间...

weixin_35752122的博客 363

可以这样入门编译原理

学过编译原理的人都知道,编译原理这门课确实难学。我所看的关于编译原理的书籍有大家所熟悉的紫龙书以及《编译原理实践》,作者都为美国人。因为自己不是计算机专业的,所以没有上过这门课,而自学起来,由于没有一个好的导师能引导你入门,那种刚开始看的生涩繁杂真的确实非同一般。但是,我忍住,坚持住了,并对其中的内容有了自己的学习体会。然而不管怎样,我始终相信,如果有一个好的导师引导你的入门,那么你学习这门课的

自由麦田 2853

零基础小白如何自学编译原理

编译原理的学习是一个持续不断的过程,不仅需要深入理解理论知识,还需要通过实践来不断积累经验。通过上述深入学习,您可以全面掌握编译器的设计与实现,从基础的词法分析到高级的优化技术、并行化、分布式编译等,逐步走向更高级的编译器开发。希望通过学习实践,您能在编译器领域取得长足的进展。

小宝哥Code的专栏 1558

编译原理学习体会建议 --转载

编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的.从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析语法分析.由此看来,这门课确实有难度.网上有的帖子,把

tonystill的专栏 1402

编译原理学习体会

 编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的.从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析语法分析.由此看来,这门课确实有难度.网上有的帖子,把编

xxx专栏 2934

编译原理学习总结

这学期费老师带着我们学习了编译原理,这门课挺重要的,感觉就像是有种连接着整个计算机专业课的感觉。但是也挺难的,对于大神说还好,对我就太难了,理解不了,也不会应用,学的比较糟糕。内容感觉很抽象,不好理解。但经过一个学期的死缠烂打还是有了点自己的体会总结的。总的来说。编译原理就是一个翻译、编译的过程。这学期学习的内容可以分为这么几个模块:语言文法、词法分析、语法分析、语义分析中间代码产生。刚开始...

qq_37278309的博客 660

编译原理课程总结

      这学期,我们学了编译原理这门课,总的来说收获还是很大的。编译原理讲的什么呢?在我看来,简单地讲就是:语言的转换,即:把一些源程序,编译成我们需要的目标程序的过程。      通过这学期的学习,我发现了这门课的理论性很强,从文法语言的概念到各种文法的分析,几乎都是队具体问题的抽象,由于对于各种概念性知识的理解浅薄,对各种抽象的知识很是难以理解,这让我们学习起来很是困难。尤其是LR文法哪...

q1973213867的博客 465

学习编译原理

 买了本人邮的龙书,看了大半年了,断断续续看了半年,才读到第三章,惭愧啊……现在还是停留在熟悉一些英文的编译原理术语的田地:token 被翻作,记号或者标记,C语言中,一般像标志符啦,关键字啦,操作符啦,括号啦,运算符这些。syntax 被翻作,语法,表示计算机语言的长相或者格式。semantic 被翻作,语义,表示计算机程序的实质含义。prammar 也被翻作语法,与上面syntax有略微区别,

无名,天地之始,有名,万物之母。 701

再谈编译原理学习1

重新学习编译原理的一些体会

hzzasdf的专栏 962

计算机学习的回顾体会2

1.算法的学习体会 我感觉算法分析与设计编译原理是我学过的最难的两门课(计算理论当然也很难,不过我觉得没用,没有学)。一方面当然是因为水平不高,另一方面也因为这两门课的内容比较抽象。 我觉得凡是树有关的算法,不管多复杂,都不太难理解;而数组有关的算法,则理解起来要困难一点,或许是因为更抽象。 好在现在有网络,对一个算法不理解,到网上找博客,往往能找到一个分析得比较容易懂的。比如KMP,...

weixin_30466039的博客 92

软件工程课程建议

学习进度表: 点滴成就 学习时间 新编写代码行数 博客量(篇) 学到知识点 第一周 8 0 0 了解软件工程 第二周 10 0 1 博文一篇 第三周 15 0 2 选择项目、调查问卷 第四周 20 80 0 结对编程 第五周 25 330 1 java的学习、软件工程 ...

weixin_30345055的博客 322

贴吧里看到的IT学习体会

送楼主一篇文章:   当你能自如的运用数据结构算法、TCP/IP原理、编译原理、操作系统原理、数据库以及Win32 API 调用、构造自己的C++库(网络库、数学库、测试库、图形库)以及各种引擎,出去毕业应该能在短短半年时间里薪水至少有7000以上甚至上万吧(其实毕业生出去95%以上可能没达到这个水平)。    其实也不用说太多,你问你自己几个问题,如果你都能做到或者学习半到

从菜鸟开始, 像神的领域靠拢 884

每天日志(2011-4-14)

       很好,今天果断的听懂了编译原理,老师主要讲的是LL(1)分析法,包括左递归的消除,消除回溯、提左因子,悲剧,公式打不出来,只好作罢了,不过这里的难点我觉得在FristFOLLOW集里面,我是看了一个例子才了解的,书上写的太难了。      概率论老师就讲了随机变量的独立性,感觉理解不太难,但是二重积分级做不来,等于不会做,还好我带了本高数书去看,总算能理解它是怎么化的了,不过大

xuliang_0308的专栏 774

0909我的看法

第一节上课的时候老师对我们说,编译原理就是教我们做编译器编译原理这门课程较难,知识比较抽象,但由于这门课程是各种以后学习科目的先行科,很重要,所以我们需要用心且花时间去掌握。真正要掌握这门课也许很难。但只要上课认真听讲,课后认真落实老师布置的作业,虚心求教他人,一定能学好此科目。还有就是对于编译器的理解,以前从没有接触过这类东西,对此也不怎么了解,但要做一个编译器,现在只知道我们需要把我们用的高...

weixin_34221276的博客 63
下一篇: ASP.NET MVC 1.0学习笔记
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值