打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《编译原理》这门课的作用
1   你学到了一种解决问题的方法,而且是强有力的方法。也许你一辈子都无缘写一个C语言的编译器,但如果你一直做程序,一直在寻求高效而通用的解决问题之道,总有一天你的自己设计小尺度的语言。语法分析,语义分析,和代码优化的知识(当然不光是知识啦,还有技巧,思想)能让你终生受益。   
   
  2
。你得以学习大量优美的算法,并得以欣赏理论和实践在编译器开发中如何美妙地结合在一起。  
   
  3
。你可以了解怎样规划,设计,和实现一个大型的系统   (编译器的代码量可不小)。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

痛苦,最近在看《编译原理》,龙书,有点犯傻了。
 
一天的进度,顶多三十页,再多就看不下去,要不然就是那种,感觉自己是在浏览书里字是怎么写的,压根没想这些字表达的意思是什么。
    
  
想请教学过编译,并且学的不错的大虾么,怎么坚持下去,并看完编译的。

 
感觉学了编译还不错,因为前面自己到处啃东西,书里说的话都能明白。而且看了编译更是明白数学建模的妙处,数据结构的用处,离散数学的经典。原来学这些课程的时候,以为学了没用,现在想想,不是没用,是自己不会用。

 

评论:

~~~~~~~~

我建议还是从实践出发进行学习,首先要有需求。
编译原理我认为有两方面的作用:
1.
有助于你理解程序的原理,有助于本身程序功力的提升
2.
经常会用一些工具需要制作,会用到编译原理。比如做一个数据描述语言等等。

可以从使用工具出发,初步理解其中的原理,推荐学习flex+bison

~~~~~~~~~

感觉需要的时候再学~
或者当小说先看一遍也可

~~~~~~~~~

1. 龙书再好,也算是比较理论了,理论就意味着难以和真实的情况衔接。。。 。。。
毕竟现在有很多很好的工具了,用这些工具可以很快的构造出LexerParser,不再需要你手工写了。。。
我以前和一个大牛聊过。【注:真大牛】,
他写编译器就是用ANTLR的,所以我现在也在学,而且这些工具生产的代码,并不比你手写的差。
我问他,那还有手写的吗?他说有,但是更多是为了产生更好的编译错误提示等等。

对于C/C++程序员,就是看LexYacc,要在Windows上面玩,可以baidu flexbison。【flexfast lex,不是flash开发RIA那个Flex
对于Java程序员,可以研究ANTLR。。。ANTLR现在是强中强了,JVM上面有一半的脚本语言,都是用ANTLR作为Lex处理工具的。


2.
这门课严重的枯燥,且基本不实用。。。想学下去很难,除非给自己一个目标。
至少是一个简单的目标,
至少要手写一个词法分析程序。。。简单的如PythonCJava。。。复杂的像Ruby的词法。
更简单的是SQL,都可以试着手写一下Lex去解析它们。。。

我不会正则表达式,每用到都是现查的。。。但是你做过一次这个词法分析后,就发现正则挺没劲了。

3. Parser
是第二步。
有了Lexer,下面就是Parser了。。。
这个时候,你也可以手写,也可以使用工具了。。。
建议你看看ANTLR生成的代码,非常容易懂,通篇都是大白话,在Eclipse的帮助下,你可以很快了解一个LexerParser都干了什么。。。当你了解这一点的时候,你手写Parser的日子就不远了。
只是这个时候,你有兴趣写一个真正的小脚本吗?

4.
优化都是后话,我基本没看呢。。。其实学习龙书的整个过程,好多介绍的内容,在你实际写一个小解释器的过程中,都是很不适用的,因为讲的太不接近实践了。
有一本书,叫做《游戏脚本编程》?好像是,也可以看看。。。浅显很多。。。
我学这些东西的时候,是好几本书一起看的,这个地方看不懂了,就换本看。很多地方也是一知半解的。

先说这么多。。。再聊。。。
~~~~~~~~~~~

合理规划一下,你以后用不太上的东西,别太勉强。
~~~~~~~~~~~~~

我们项目组目前就在做一个编译器,之前我也看了一段时间的紫龙书(龙书 第三版),个人觉得可以针对性的看,例如我们现在只做词法分析,所以我就看了第二,三两章,你用到什么就看什么这样就不会觉得看的枯燥了

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
  编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

编译原理是计算机科学与技术中一个非常成熟的分支,非常完美地将原理与技术结合了起来,对于理解计算机的本质非常有帮助 
编译原理的很多设计思想可以在你设计的程序中运用 
比如你想写个程序对于某个文本作词法分析和语法分析的处理,那么编译原理的知识完全可以帮助你来完成它 
又或者你也可能写个能自动生成菜单或者界面的程序,你需要自定义一个非常简单的脚本语言并解析它,编译原理也可以帮助你做到这一点 
总之,编译原理应用的领域十分广泛,不要以为学编译原理就仅仅是用来做编译器的 
另外,编译原理包含了很多巧妙的设计构思,作为一名CS的学生,当然是很有必要来学习它的

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

学编译可不一定是让你去写编译器

编译原理很多时候会直接影响你对计算机的认识

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

个人认为学习编译原理及其他基础课程,其中一项意义,
就是要追随先贤们的思想轨迹,学习他们的思考方法,
了解他们是如何推导和发现问题和解决方法,
当自己碰到问题时,进行创新性的思考。

具体到编译原理,的确大部分人不需要开发编译器,
但是了解程序的编译过程,对于自己写代码调试bug很有好处,
通过换位思考,想象一下编译器如何处理我们写的代码,
从而改进自己的代码,对于代码和语法的理解也能加深。

在解决其他复杂的问题时,也可以借鉴编译原理的思想,
不一定是编译程序具体的实现模式,而是解决编译问题时的思考方法。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

当你专心学基础的时候你又会被社会坑了,社会招聘要求会这会那,出去就要求做过多少东西,写多多少行代码,多vc,java多熟悉,一个人大学四年有这么时间么?到头来都是死代码,渐渐成了IT民工,浮躁的原因来源于社会

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的。   从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及.   编译原理究竟难在哪里?笔者的体会,主要在这几点:   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)获得编译器自动生成工具(compilercompiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的)  2.ANTLR之类的工具是开源(opensource),可研究其源码,以便必要时自己手编分析程序.  3.回过头来看编译原理教材.这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破.  4.结合教材所附源码,进一步加深对教材的理解   这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为,输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和javac的差异有关),可对照着看.     笔者学习VC++,深切体会到好教材的重要.笔者开始吃了劣质光盘版教材”21天学VC++”的祸害,看了一个月还如入云雾之中,后来看了《VC++技术内幕》,方才豁然开朗.但是编译原理的教材却似乎质量相差不是特别大,关键还在于合适的方法.以上方法笔者也是误打误撞总结出来的,希望有所参考价值.

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

原文来源:http://topic.csdn.net/u/20100104/14/64712eab-e5c1-419b-99dc-4d90f001fb89.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
学好编译原理的重要
少走弯路:学习编译原理的相关建议 [程序人生]
一个编译器的实现1
初识 ANTLR
《编译原理简明教程》PPT 第13章
精品慕课资源推荐 编译原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服