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

编译原理(compiler construction),旨在介绍编译程序构造的一般原理和基本方法,内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 它大致包括两个方面,俗称前端和后端。前端的正式名称其实是 language recognition,工程上也称为 parsing。这实际上是整个计算机理论的一个楔入点。比如说,比较基础的 computation theory,也就是研究四种基本计算模型的理论,就是以 language recognition 为起始工具的。而且这个理论讨论了很多有意思的东西:

计算机可以用什么方法有效地「记忆」多久的历史?
注意这里的记忆是状态式的,有遗忘的记忆。和数据结构不同,数据结构是无限期的记忆。

计算模型的「能力(strength)」的定量比较:LL(n), LR(n), LALR 等等。

在 parsing 中利用数据结构和避免 explicit 数据结构的 trade-off。

可以说,学习 parsing 之于学些计算理论就像学习 OS kernel 之于数据结构和算法。虽然理论并不严密,但是更接近 real world。非常有趣。

后端的 code generation,理论并不成熟,所以一两本初始的教材也就是勉强让你能写一个功能完整的 compiler 而已。说实话,即使你不看教材,在学会 parsing 之后摸黑写一个 target to C 的 compiler 也并不难。

编译原理学过之后的益处包括:

1、可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的;

2、可以更加客观的比较不同语言的差异;
3、更不容易被某个特定语言的宣扬者忽悠;

4、学习新的语言是效率也会更高;

5、其实从语言a转换到语言b是一个通用的需求,学好编译原理处理此类需求时会更加游刃有余。

除此之外,编译原理是一门真正与代码做斗争的课程,对于一个有至于追求技术的人是不容错过的课程,而且编译原理可以说是一个计算机科学的缩影。你学习它更多的是去追寻程序设计语言的本质,如它在寄存器分配中将会使用到贪心算法,死代码消除中将会使用到图论算法,数据流分析中使用到的Fixed-Point Algorithm,词法分析与语法分析中使用到有限状态机与递归下降这样的重要思想等等,也许你以后不会成为一个编译器开发工作者,但是编译原理的学习中所获,所思的东西足以让你终生获益。

关于编译原理的学习,我们要掌握以下几点:
词法分析方面,掌握正则表达式,了解dfa/nfa;

Parsing 方面,能读懂BNF,知道AST,会写简单的递归下降parser,会用antlr之类的parser generator;

优化方面,知道现代编译器的优化能力有多强,知道如何配合编译器写出高效易读的代码,避免试图outsmart编译器;
会实现简单的虚拟机(stack-based,不带GC),并把四则运算表达式翻译为虚拟机指令。

编译原理并非随随便便就能入门的,一定要正视这个问题。编译原理的学习和实践通常基于对计算机编译过程、计算机基本工作原理、甚至一定的数学知识有一定积累,这些知识分别分布并应用在了编译原理的不同阶段。基于此,我们有以下方法:a. 学习 C 语言, 不要求熟悉, 但至少要弄明白指针的思想;

b. 学习数据结构, 尤其是对字符串/树/图的相关基本处理手段要非常熟悉;

c. 学习离散数学, 对树和图的相关理论要比较心中有数;

d. 学习汇编语言, 不要求熟悉这门语言, 但至少要弄明白汇编指令、数据在CPU和存储器之间的交互机制;
e. 着手学习编译原理, 推荐先找一本国内高校普遍使用的教材(比如胡元义的一本编译原理教程, 很一般, 但很适合先入门), 入门后(搞明白编译原理到底是要干嘛, 解决什么样的需求)马上扔掉转龙书、虎书、鲸书。
最后,编译原理并不仅仅只是一门理论课程,实践也是其重要的部分,只有理论和实践结合在一起,才能真正学好它。

时间: 2024-10-19 00:08:05

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

0909 对编译原理见解

经过上网查找后,我对编译原理理解得到了更深刻的理解. 通过该课程了解,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程.构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的.通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解. 编译原理学什么?编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法

重读《现代编译原理》几句小感

 最近重温了一下<现代编译原理>这本书,感觉与大学学习的时候,完全不是一个味道:深刻的懂得理论联系实际的感受,瞬间有一种"初极狭,才通人.复行数十步,豁然开朗"的惬意感! 编译器将汇编或高级计算机语言源程序(Source program)作为输入(注:目前本人接触到的大多是C/C++编译器/汇编语言编译器),翻译成目标语言(Target language)机器代码的等价程序.源代码一般为高级语言 (High-level language), 如Pascal.C.C++等

编译原理简单介绍

编译原理学习导论 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了.在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第

编译原理基础概念介绍

关于编译原理 语法树 句柄 简单短语 短语 的区分,通过两个例子来理解概念以及方法: 例子1——语法树 S -> a|b|(T)  T -> TdS|S Vt={a,b,d,(,)}.Vn={S,T},S是开始符 句型(Sd(T)db)是S的一个推导,其中___是句柄;____是最左素短语:____是该句型的直接短语,_____是短语.     素短语的概念:它是一个递归的定义,至少含有一个终结符,并且除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语的短语.而一个算

编译原理的看法

编译原理就是什么? 编译原理是将高级语言翻译成计算机语言(即计算机所能识别的二进制代码)所遵循的规律,让电脑可以懂得高级语言所表达的东西,内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 学习编译原理有什么好处?当学习完编译原理后我们队高级语言与机械语言之间的转化方法及如何具体如何转化会有一个更深的理解,这可以使得我们在编写程序.修正程序.优化程序结构时的思路更加清晰,有助于我们在查看代码的时候容易生出新颖或者说是更加优秀的吸纳功法.在学会编

对编译原理的初步了解

编译原理就是什么? 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 学习编译原理的好处是什么? 可以更加客观的比较不同语言的差异,更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的

了解编译原理-笔记小结

这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译的过程. 等以后领悟更多了再作补充吧. 希望各路人士能多加指点,谢谢. 词法分析 作用:将输入转换为一个一个的token,而其用一串整数来表示. 协作:只有当解析器需要的时候才会请求词法分析器,继续扫描输入流,在这个过程中将不断生成符号表. 实现:在通常的编程语言中,相对于不确定的有限自动机(NFA

0909走进编译原理

1.编译原理学什么? 编译原理这一学科,主要学习的是编译器方面的原理与技术,我们能从中学会各种算法与代码的原理,明白计算机是如何“听懂人话”,我们的代码是如何经过编译器转换成机器语言,这样不仅能实现自己去编写简单的小编译器,也能通过此学科去接触已有各编译器的思想,认识到编程方面更多要注意的问题以及解决的方向,站在本质的角度看代码,从而更能成就计算机专业人员的计算机逻辑思维. 2.为什么要学编译原理? 说到编译原理,人们喜欢把这门学科比作人体解剖和造轮子,是计算机中和代码作斗争的一门学科.据本人理

0909对编译原理的初了解

1.编译原理学什么? "编译原理":研究设计和构造编译程序原理和方法以及主要实现技术.其中蕴含着计算机科学中解决问题的思路.形式化问题和解决问题的方法.通过本课程的学习,使学生掌握编译理论和方法方面的基本知识,同时也获得设计.实现.分析和移植编译程序方面的初步能力. 编译原理(第3版)共10章,内容包括语言及文法的基本知识.词法分析.语法分析.语义分析及中间代码生成.符号表组织.运行时的存储组织与分配.代码优化及目标代码生成等.此外编译原理是一门实践性较强的课程,要联系实际,多看实验参