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

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

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是不同的(当然和java与c的差异有关),可对照着看.

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

《编译原理》学习体会相关推荐

  1. 低年级语文教学:立足语文学习关注核心素养

    低年级语文教学:立足语文学习关注核心素养 如何在语文学习起步阶段的教学中,有意识地培养低年级学生的核心素养呢? 一.以语用积累为基础,重视提升表达能力 词串学习.请看二年级课文<纸船和风筝> ...

  2. 以核心素养为导向的计算机教学方式,《核心素养导向的课堂教学》导读

    一本能让一线教师明晰核心素养怎样实现教学转化的书 一一<核心素养导向的课堂教学>导读 图片发自简书App 我用二天时间,系统阅读.批注.摘录了余文森先生新作一一<核心素养导向的课堂教 ...

  3. 何杰月c语言课程,北京西城区教育科研月:学科核心素养的教学探索

    人民网北京12月5日电 昨日,北京市教育学会学术年会暨北京市西城区教育科研月课堂展示专场在北京师大二附中举行.本次活动以"继承中发展--基于学科核心素养的教学探索"为主题进行探讨. ...

  4. 深度学习之核心要素:输入输出、目标函数、前向传播、后向传播、学习率、梯度下降

    深度学习之核心要素:输入输出.目标函数.前向传播.后向传播.学习率.梯度下降 目录 深度学习的学习过程 输入输出及隐层: 目标函数:

  5. 助力AI腾飞,深度学习走向何方?

    http://www.xinhuanet.com/info/2019-02/01/c_137791687.htm 当前,人工智能发展借助深度学习技术突破得到了全面关注和助力推动,各国政府高度重视.资本 ...

  6. 汤晓鸥谈深度学习三大核心要素:算法设计、高性能的计算能力以及大数据

    汤晓鸥谈深度学习三大核心要素:算法设计.高性能的计算能力以及大数据 2017-05-21 15:02:28    深度学习    0 0 0 昨日(5月20日),香港中文大学汤晓鸥教授莅临 2017C ...

  7. 【自学者】学习小结(关于深度学习、视觉和学习体会)

    以下仅仅是考研上岸到开学一个月期间的自学体会,仅作为参考,仅代表当时观点,不代表现在观点,有空的话我会出一期现在的一些小建议博客,仅作为小建议,本人不是很厉害,只是想分享当时的经验,大佬请自动绕过,最 ...

  8. 深度学习去燥学习编码_请学习编码

    深度学习去燥学习编码 This morning I woke up to dozens of messages from students who had read an article titled ...

  9. 电脑硬件知识学习_关于网络学习心得体会集锦七篇

    关于网络学习心得体会集锦七篇 当在某些事情上我们有很深的体会时,好好地写一份心得体会,通过写心得体会,可使我们今后少走弯路.那么心得体会怎么写才能感染读者呢?以下是小编为大家收集的网络学习心得体会7篇 ...

  10. 定向计算机老师,核心素养背景下的信息技术教师定位走向

    马力 摘 要:随着时代的发展,信息技术的理论与技术也成了学生要掌握的一门知识和技能,是学生综合素质的一个重要内容,也是学生核素养中不可缺少的素质.所以,我国的信息技术教育教学越来越重要,人们对于信息技 ...

最新文章

  1. 显卡暴涨,这我万万没想到啊
  2. Vue Router webpack
  3. 德鲁克的黄金管理20条—------中高层管理必修课
  4. 黄仁勋回应放弃收购Arm:公司战略并没有太大改变
  5. 公众号点击图片变成另一张_微信公众号点击出现图片是怎么实现的?
  6. Ubuntu18.04上安装RTX 2080Ti显卡驱动
  7. 网页错误排查 如何?
  8. CSS:CSS+JS制作可折叠内容块
  9. icmp协议_ICMP协议全解析
  10. MacOS Mojave 更换开机登录界面壁纸
  11. CTSC2016滚粗记 前篇
  12. 模糊处理(下)--高斯模糊,双边模糊以及实现一个简单的磨皮美颜效果(opencv学习记录--4)
  13. switch更新找不到服务器,任天堂Switch最新系统更新 修复数字商店bug
  14. 手机端web/app界面设计尺寸规范
  15. ios 如何在cell中去掉_iOS-UITableViewCell三种常用编辑模式:删除,插入,移动
  16. 金融机构服务小微企业机制创新探究
  17. 7-31 【0413】考拉兹猜想
  18. 武汉牛批的互联网公司基本都在这了~
  19. unity沙子堆积_unity游戏逼真沙子和白雪粒子特效渲染创建插件Basic Sand amp; Snow 1.0 - 素材巷...
  20. 数据库连接池及Druid使用步骤

热门文章

  1. mkimage工具将zImage转换为uImage
  2. 数学建模竞赛(国赛和美赛)经验分享
  3. 【java】115-Java经典
  4. element plus中的el-link如何去掉下划线
  5. 软件测试工程师笔试题以及答案汇总
  6. ae打开模板显示不出来_为什么套用的AE模板打开之后没有错误提示却还是有問題?...
  7. C++的与/或/异或的详解
  8. 如何在Activex中使用字体(2)
  9. apa引用要在文中吗_SCI论文:常见的两种参考文献引用方式
  10. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究...