关于编译原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于编译原理相关的知识,希望对你有一定的参考价值。

一.编译原理是什么?

编译原理计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。
  这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的 必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪 50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟 编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间 诞生不少名著的相关数论。

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

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

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

三.不学有什么损失?

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

四. 如何学习编译原理?

1、看到很多法律文本、法院文书虽然是自然语言文本,但是存在一定的结构性,所以想要写程序去分析、整理这种结构。
2、根据自己总结的文本中发现的规则hand craft分析程序。
3、发现这样写出来的东西又臭又长,而且里面有一些模式经常出现,就是一个state machine,在某种state下对应适用某个规则,而某些输入又能使state发生切换。隐约觉得应该有什么理论已经为这些模式而存在了。
4、同时我又觉得这些semi-structured的文本虽然不像计算机程序一样有严整明确的规则,但是也不同于完全散文式的自然语言文本,能不能把它当做一个语法规则不太严格的程序源代码来看待?那么,用编译原理中的东东来修理它?
5、在The Art of Unix Programming的一章中读到了介绍lexer和parser的一段,有一些领悟,捡起龙书看了一阵儿,把最重要的前四五章看了。
6、在自己喜欢的Python语言中找到了一个lex&yacc式的工具PLY,玩熟了,用它来实现了一个自动解析符合《立法法》第54条格式法律文本的小程序。尽管简单,但是挺有用,可以把许多纯文本的法条转化为一个树状结构,这样可以很精致的展示这些法条文本。

 

以上是关于关于编译原理的主要内容,如果未能解决你的问题,请参考以下文章

关于编译原理

关于编译原理

编译原理题目关于判断LL(1)文法的

关于编译原理的一些看法

关于编译原理的一点看法

关于编译原理的一下小见解