[转]少走弯路:学习编译原理的相关建议

转载 2007年10月08日 16:38:00
编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的。

<script type="text/javascript"><!-- google_ad_client = "pub-1572879403720716"; google_ad_width = 336; google_ad_height = 280; google_ad_format = "336x280_as"; google_ad_type = "text_image"; google_ad_channel ="2957605308"; google_alternate_ad_url ="http://www.pcdog.com/js/336.htm"; google_color_border = "F5FAFA"; google_color_bg = "F5FAFA"; google_color_link = "1F3A87"; google_color_url = "0000FF"; google_color_text = "000000" google_language = 'zh-CN'; //--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星 期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及.

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

  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++技术内幕》,方才豁然开朗.但是编译原理的教材却似乎质量相差不是特别大,关键还在于合适的方法.以上方法笔者也是误打误撞总结出来的,希望有所参考价值.

相关文章推荐

少走弯路:学习编译原理的相关建议

少走弯路:学习编译原理的相关建议编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易...

少走弯路:学习编译原理的相关建议

正式开始接触编译原理。。。这门大一的时候在我心中如同神话般的课程。。。。另外一门神话,操作系统,已经学过了,感觉还是不甚得劲儿,要继续研究。 我要好好的研究好这两门东东。以这个为主线,串起来我大学的...

小心陷阱,少走弯路!游戏职场中21条的建议

本文转自GameRes,点击访问原文 继上篇对游戏职场应聘、薪资等问题探讨后,众多网友和学生在后台及其他媒体平台留言,询问到底如何才能进入游戏行业而又避免少走弯路。本篇就来说说如何选择好...

少走弯路的10条建议

转载自一个很佩服的大牛博客:孤傲苍狼 如何在涉世之初少走弯路,有一个好的开端,开始一番成功的事业?以下是一些先行者积累的10条有益的涉世忠告。好好地遵循、把握这些忠告和建议吧,比起所学的课堂课程来,它...

用C#编程的一些建议(规范写法,使用技巧,少走弯路)ZZ

保存的word,已找不到当时的原文地址。 1.如果可能尽量使用接口来编程    .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类。然而,在这种情况下如果你用.NET支持...
  • lzh3312
  • lzh3312
  • 2014年01月28日 00:10
  • 401

CososJS学习笔记(1) 环境配置(填坑版,让你少走弯路!)

cocosjs环境配置教程填坑版!

英语这样学最有效------少走弯路的学习方法

本文主要涉及英语的学习方法,以及相关资料的推荐。建议耐心看完。如果这点耐性都没有,那你还指望能做好什么? 1.前言 国人学了多年英语,但效果并不好。造成这种现象的原因很多,但总的来说,是懒...

编译原理概述和学习心得和建议

  • 2008年12月19日 21:29
  • 1.8MB
  • 下载

hadoop学习的第二天---配置Hadoop环境(少走弯路,详细教程)

配置Hadoop是一件非常令人苦恼的事情,因为刚开始学习不知道哪里是什么功能,弄了一遍又一遍还是不行,瞬间可能放弃掉,尤其是不大熟悉Linux的人 下面我还是一步一步给大家讲解,大家跟着步骤来 用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]少走弯路:学习编译原理的相关建议
举报原因:
原因补充:

(最多只允许输入30个字)