代码改变世界

对编译原理这门课程的看法

2016-09-09 23:33  124杨锦达  阅读(1474)  评论(0编辑  收藏  举报

对我来说,我市首次听到和接触到"编译原理"这个词,但是经过一晚上的探索,已经有了一定的了解。

首先是编译原理就是什么?

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

编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。

第二是学习编译原理有什么好处?

.从现实的方面来说,编译原理学过之后的益处(不考虑最后都没有入门的情况)包括:
1、可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的
2、可以更加客观的比较不同语言的差异
3、更不容易被某个特定语言的宣扬者忽悠
4、学习新的语言是效率也会更高
5、其实从语言a转换到语言b是一个通用的需求,学好编译原理处理此类需求时会更加游刃有余

还有,我认为这门课是一门真正与代码做斗争的课程,对于一个有至于追求技术的人是不容错过的课程,而且编译原理可以说是一个计算机科学的缩影。你学习它更多的是去追寻程序设计语言的本质,如它在寄存器分配中将会使用到贪心算法,死代码消除中将会使用到图论算法,数据流分析中使用到的Fixed-Point Algorithm,词法分析与语法分析中使用到有限状态机与递归下降这样的重要思想等等,也许你以后不会成为一个编译器开发工作者,但是编译原理的学习中所获,所思的东西足以让你终生获益。同时,学完这门课程,对于一个有Geek精神的开发者,他会开始运用自己的所学开发享受上帝的感觉,去尝试创造一门语言,我想这种感觉不是每门课程都能带给你的。我相信,当你真正完成这个过程后,你对你所写的程序、程序语言都会有更深的本质认识,这样的认识也会让你站的高度完全不同

第三是不学有什么损失?

不学编译原理,可能永远给各种写编译器的人当奴隶,以为写程序只能按照他们设计的语言哲学来做。学好了编译原理,不一定非要自己写语言,但是至少能把很多其他程序员觉得很酷的东西看得透彻一点,不会被程序语言的设计表象骗到太多。

最后是如何学习编译原理?

1.错误认识

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

2.自动机理论

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

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

4.LR文法

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

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

1.端正认识

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

反复看书

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

3.结合源码来看

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

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