对于计算机专业的学生来说。肯定听说过或者上过一门课,叫做——编译原理。被称为计算机专业的天书。反正无论是学习这门课的时候,还是如今,我都是没搞懂当中的技术和知识。
但就期末考试而言,提前做了几道题目,得到了90+的分数,也算是可喜可贺。各位ITer假设想检验自己的智商的话,大能够去学习编译原理,你会收获非常多的。
如今我把大学时整理的编译原理最主要的概念分享出来。
第一章-绪论
1. 翻译,是指在计算机中放置一个能由计算机直接执行的翻译程序,它以某一种程序设计语言(源语言)所编写的程序(源程序)作为翻译或加工的对象,当计算机翻译程序时,就将它翻译为与之等价的还有一种语言(目标语言)的程序(目标程序)。
2. 编译程序与执行系统合称为编译系统。
3. 源程序的编译(或汇编)和目标程序的执行不一定在同一种计算机上完毕。
当源程序由还有一种计算机进行编译(或汇编)时。我们将此种编译(或汇编)称为交叉编译(或汇编)。
4. 解释程序也以源程序作为它的输入,它与编译程序的主要差别是在解释程序的执行过程中不产生目标程序,而是解释执行源程序本身。
5. 编译程序的主要功能是把用高级语言编写的源程序翻译为等价的目标程序。
6. 编译程序的8个组成部分:
(1) 词法分析程序(也称扫描器)
(2) 语法分析程序
(3) 语义分析程序
(4) 中间代码分析程序
(5) 代码优化程序
(6) 目标代码生成程序
(7) 错误检查和处理程序
(8) 信息表格的管理程序
7. 编译程序的逻辑结构:(八个组成部分间的控制流程和信息流程)
源程序->(1)词法分析程序->(2)语法分析程序->(3)语义分析程序->(4)中间代码生成->(5)代码优化程序->(6)目标代码生成->目标代码
和以上1 2 3 4 5 6 相关联的还有(7)错误检查和处理程序和(8)信息表管理程序。
8. 用形如(Class,Value)的序偶(二元式)作为一个单词的内部表示。
Class表示单词的类别,Value是单词的值。
9. 语法分析程序以词法分析程序所输出的用内部编码格式表示的单词序列作为输入,其任务是分析源程序的结构。判别他是否为对应程序设计语言中的一个合法程序。
10. 前后文无关文法 CFG
11. 常见的中间代码形式:逆波兰表示、三元式、四元式、树形结构
12. 目标代码生成程序以语义分析(或优化处理)所产生的中间代码作为输入,其功能是依据前面各阶段对源程序进行分析和加工所得到的有关信息,将中间代码翻译为机器语言或汇编语言形式的目标程序。
13. 编译程序的前端:(1)(2)(3)(4) 分析部分
编译程序所完毕的处理工作仅仅依赖源程序,而与执行目标程序的计算机无关。
14. 编译程序的后端:(5)(6) 综合部分
仅仅依赖于目标语言
15. 抽象语法树 AST
第二章-前后文无关文法和语言
1. 把用一组数学符号和规则来描写叙述语言的方式称为形式描写叙述,而把所用的数学符号和规则称为形式语言。
2. 字母表:由若干元素所组成的有限非空集合。当中每一元素称为符号,又称字母表为符号集。
3. 符号串:用字母表中的符号所组成的不论什么有限序列称为符号串。
4. 把符号串中所含符号的个数称为符号串的长度。不包含不论什么符号的符号串称为空符号串。
5. 符号串的前缀、后缀
设x是一个符号串,把从x的尾部删去若干个(≥0)符号之后所余下的部分称为x的前缀。
设x是一个符号串,把从x的头部删去若干个(≥0)符号之后所余下的部分称为x的后缀。
X=abc ,则ε、a、ab、abc都是x的前缀;
则ε、c、bc、abc都是x的后缀。
若x的前缀(后缀)不是x本身,则将其称为x的真前缀(真后缀)。
6. 符号串的子串
从一个符号串中删去它的一个前缀和一个后缀之后余下的部分称为该符号串的子串。
x的不论什么前缀和后缀都是x的子串,但子串不一定是x的前缀或后缀。
ε既是前缀、又是后缀、也是子串。
7. 一个符号串x与其自身的n-1次连接称为此符号串的n次方幂。
记作
定义
8. 字母表A的正闭包就是由A中字母所构成的一切符号串的集合,而自反传递闭包仅比多包含一个空符号串ε
9. 一个文法G[S]可表示成形如(,,P,S)的四元式,当中,,P,均为非空有限集,分别称为终结符号集。终结符号集和产生式集。S∈,是文法的開始符号。
把出如今产生式左部和右部的一切符号组成的集合称为符号集,记做V。
10. 假设一个文法中至少含有一个递归的非终结符号。则将此文法称为递归文法。
11. 假设一个语言是无限的,则定义此语言的文法必定是递归的。
12. 前后文无关文法等价问题是不可判定的。即不存在一种算法,它能判别随意两个前后文无关文法是否等价。
13. 把左部变量为A的产生式称为A-产生式
14. 句型分析,是指构造一种算法,用以推断所给的符号串是否为某一文法的句型。
15. 句型分析的方法:自顶向下的分析 自底向上的分析
16. 对于一给定的文法来说,从其開始符号到某一句型,或从一个句型到还有一句型的推导序列可能不唯一。
17. 把能由最左推导推出的句型称为左句型。
18. 把能由最右推导推出的句型称为右句型。
19. 最右推导称为规范推导,右句型称为规范句型。
20. 最右推导的逆过程是最左规约。
21. 最左推导的逆过程是最右规约。
22. 最左规约称为规范规约。
23. 对于一个给定的语法树而言,它仅对应于唯一的最左推导和最右推导。
24. 前后文无关文法是否具有二义性是不可判定的。
25. 前后文无关语言的先天二义性也是不可判定的。
26. 一个句型的最左直接短语(即规范分析中。最先被规约的子串)称之为此句型的句柄。
27. 对于无二义性的文法。它的不论什么句型都仅仅有唯一的语法树,因而它的不论什么规范句型都仅仅有唯一的句柄。并且对于某些无二义性的文法,因为当中不含有左部不同而右部同样的产生式,故能确保句柄规约的唯一性。
28. LL分析要求文法无左递归性。
29. 算符优先分析要求文法不含有ε-产生式。
30. LR分析要求文法无二义性。
31. 假设一个产生式的左部或右部含有无用符号,则此产生式称为无用产生式。
32. 形如A->A的产生式,即使A是一个实用的符号。此类产生式也是不必要的。
因而一開始就能够将这种产生式删去。
33. 将不含形如A->A的产生式和不含无用符号及无用产生式的文法称为已化简的文法。
34. ε-产生式。是指右部为一空符号串ε的产生式。
35. 0型文法又称短语结构文法(PSG)。由0型文法所描写叙述或定义的语言称之为0型语言。
36. 1型文法又称前后文有关文法(CSG)。对应的语言称为1型语言或前后文有关语言。
37. 2型文法又称前后文无关文法(CFG)。由2型文法所定义的语言称之为2型语言或前后文无关语言。
38. 把左线型文法和右线性文法统称为3型文法或正规文法。
由3型文法描写叙述的语言称为3型语言或正规语言。
39. 四类文法在描写叙述语法的能力上是从0型文法開始依次减弱的。
40. BNF表示法等价于前后文无关文法。凡是能用BNF定义的语言都是前后文无关语言。
第三章-词法分析及词法分析程序
1. 词法分析和语法分析两个阶段的划分,仅仅是对整个编译程序的逻辑功能而言。而不一定指的是编译程序的执行流程。
2. 词法分析主要任务:
(1) 读源程序。产生单词符号。
(2) 滤掉空格,跳过凝视、换行符。
(3) 追踪换行标志,复制出错源程序。
(4) 宏展开。
3. 利用状态转换图对符号串进行识别的方法是一个自顶向下的分析算法。
4. 一个确定的有限自己主动机(DFA)实际上是对应的状态转换图的一种形式描写叙述,或者说。是状态转移矩阵的还有一种表示。
5. 非确定的有限自己主动机(NFA)
6. 正规文法和有限自己主动机在描写叙述同一语言类的意义下是相互等价的。
7. 假设我们把每类单词均视为一种语言,那么每一类单词都可用一个正规式来描写叙述。而每一类单词中的全体单词也就组成了对应的正规集。
第四章-语法分析和语法分析程序
1. 对于表达式。常採用算符优先分析法;对于语言的其它的部分,则採用递归下降分析法。
2. 语法分析的方法,就产生语法树的方向而言,能够分为自顶向下和自底向上。
3. 採用自顶向下的语法分析。必须首先消除文法的左递归性(包含一切直接左递归和一般的左递归)。
4. LL(1)文法:对应的语法分析将自左至右的顺序扫视输入符号串,并按最左推导的方式来进行。“1”表示分析过程中,每做一次推导,仅仅要向前查看一个输入符号便能决定所选用的产生式,并且这种选择是准确无误的。
5. 递归下降法是指对文法的每一非终结符号,都依据对应产生式各候选式的结构。为其编写一个子程序。用来识别该非终结符号所表示的语法范畴。
6. 预測分析法是一种比递归子程序法更为有效的自顶向下语法分析方法。此种方法的分析器由一张预測分析表、一个控制程序和一个分析栈组成。
7. 能由某一LL(1)文法产生的语言称为LL(1)语言。
8. LL(1)文法的主要结论:
(1) 不论什么LL(1)文法都是无二义性的。
(2) 左递归文法必定不是LL(1)文法。
(3) 存在一种算法。它能推断随意的文法是否为LL(1)文法。
(4) 存在一种算法。它能判定随意两个LL(1)文法是否产生同样的语言。
(5) 不存在这种算法,它能判定随意的前后文无关语言是否为LL(1)语言。
(6) 非LL(1)语言(即不能由不论什么LL(1)文法产生的前后文无关语言)是存在的。
9. 自顶向下的语法分析:
(1) LL(1)文法
(2) 递归下降分析法
(3) 预測分析法
10. 自底向上的语法分析:
(1) 简单优先分析法
(2) 算符优先分析法
(3) LR分析法 包含LR(0) SLR(1) LR(1) LALR(1)
11. 移进-规约分析过程採取的动作:
(1) 移进
(2) 规约
(3) 接收
(4) 报错
12. 假设G是一算符文法,则G的不论什么产生式的右部,都不会出现两非终结符相邻的情况。
13. 在算符优先分析中,每次规约的符号串。是当前句型的最左素短语。
14. 算符优先分析结论:
(1) 按算符优先关系所确定的应被规约的子串恰好是当前句型的最左素短语。
(2) 虽然算符优先分析也属于自底向上语法分析的范畴。但却不是严格从左至右的规范分析,每步所得的句型自然也不是一个规范句型。
(3) 因为算符优先分析法中每一句型的最左素短语是唯一的。因此。若不顾及用非终结符来标记的那些节点上的名字,那么每一句子的树架子是唯一的。
15. 不带回溯的自顶向下分析要求文法不存在左递归性,并且每一产生式的各候选式的终结首符集两两不相交。
16. 算符优先分析方法要求文法的各终结符号序偶间至多仅仅有一种优先关系。
17. LR(k)文法的研究证明:
(1) 每一LR(k)文法都是无二义性文法。
(2) 一个由LR(k)文法所产生的语言也可由某一LR(1)文法产生。
18. LR(0) SLR(1) LR(1) LALR(1) 分析器的比較:
(1) LR(0)分析器的分析能力最低。但它是构造其余三种LR分析器的基础。
(2) SLR是“简单LR”分析的缩写。是为了解决构造LR(0)分析器所出现的问题而形成的一种方法。
分析能力比LR(0)分析器稍强。
(3) LR(1)分析器的分析能力是四种LR分析器的最强的。LALR(1)分析器的能力介于SLR(1)和LR(1)之间。分析表的规模比LR(1)分析表要小得多。
19. LR(0)项目集中的相容指不出现这种情况:
(1) 移进项目和规约项目并存
(2) 多个规约项目并存
第五章-语法制导翻译及中间代码生成
1. 从广义上讲。在一个多遍扫描的编译程序中。每扫描源程序一次。都将产生一种与之等价的中间代码,且越往后越接近目标代码。
2. 语法翻译制导模式 Syntax-Directed Translation Schema SDTS 这种模式实际上是对前后文无关文法的扩充。
3. 什么是语法制导翻译?
就是对文法中的每一个产生式都附加一个语义动作或语义子程序。且在语法分析过程中,每当须要使用一个产生式进行推导或归约时,语法分析程序除执行对应的语法分析动作外,还要执行对应的语义动作或调用对应的语义子程序。
每一个语义子程序都指明了对应产生式进行分析时所应採取的语义动作
4. 一个文法符号X的语义信息称之为语义属性或简称为属性。
5. 语法制导翻译仅对每一产生式定义了对应的语义处理,而未对怎样使用产生式做不论什么限制,所以这种模式既可用自顶向下的语法分析,也可用自底向上的分析。
6. 语法制导翻译方法的实质。
就是依据文法中每一个产生式所蕴含的语义。为其配备若干个语句或子程序,对所要完毕的语义处理功能进行描写叙述。这些语句和子程序统称为语义子程序或语义动作。
7. 将语义以“属性”的形式附加到各个文法符号上,再依据产生式所蕴含的语义,给出每一个文法符号的属性的求值规则,从而形成一种附带语义属性的前后文无关文法,即属性文法。
8. 文法符号的属性就是它的语义性质。
9. 终结符号至少有一种属性,即词文。
10. 非终结符号的属性之值从其它符号的属性计算而得,是由其它符号的属性定义的。
11. 假设在一棵语法树中将每一个节点均视为由若干个域组成的记录,则可将当中的一些域用来存放对应文法符号诸属性之值。
并可用属性来为这些域命名。
12. 将每一个节点标注对应属性值的语法树称为加注语法树或染色树。
13. 一个文法符号X在对应节点的综合属性之值,由其子节点的属性和(或)X的其它属性,通过相关属性规则经计算而得。故综合属性的求值在语法树中是自下而上的方式进行的。
14. X的继承属性之值则由X的父节点和(或)其它兄弟节点来定义,故继承属性的求值是按自上而下的方式进行的。
15. 每一个产生式中的任一文法符号的属性计算规则仅仅能是唯一的。
16. 良定义的概念。
17. 一个属性文法是良定义的,当且仅当对于它的每棵语法树T,对应的依赖关系图是一个无回路有向图。
18. 在文法产生式右部适当的位置上插入语义动作而得到的新文法称为翻译文法或增广文法。
在一翻译文法中。若每一个产生式右部中的所有语义动作均出如今所有文法符号的右边。这种翻译文法为波兰翻译文法。
19. 属性翻译文法 Attribute Translation Grammar
20. 终结符号的综合属性所具有的初始值。由编译系统的词法分析程序提供。对于产生式左部符号的继承属性,将继承上一层产生式该符号已有继承属性之值。对产生式右部非终结符号的综合属性之值,则当该非终结符号出如今某个产生式q的左部时,通过q中相关符号的某些属性经计算求得。动作符号的属性取决于该动作函数的參数(自变元)来源:当自变元来自其它符号的属性时,是继承属性;反之,是综合属性。
21. 从遍历属性化语法树的角度看,继承属性的计算是先序遍历的,而综合属性的计算是后序遍历的。对一个文法符号而言。总是先计算其继承属性,再计算综合属性。
22. S-属性文法一定是L-属性文法。并且要求每一个非终结符号仅仅具有综合属性。
23. 当变量出如今赋值号左側时,代表的是为其分配的单元地址;而出如今赋值号右側时。代表的是该单元内存放的详细内容。
24. 数组内情向量表包含:
(1) 数组类型
(2) 维数
(3) 各维的上下界
(4) 各维的界差
(5) 每维的长度
(6) 数组的首地址
25. 两种传递实參信息的代码结构:
(1) 在控制转入被调过程之前,将各实參信息送入对应形參单元。(先结合、后调用)
(2) 把实參信息依次排列在转子指令之前,在执行转子指令而进入过程后,被调过程将依据本次调用的返回地址,找到存放实參信息的单元位置,并把各实參信息送入对应形參的形式单元。其后再安排执行过程体的中间代码。(先调用、后结合)
第六章-符号表
1. 符号表的作用?
在编译程序过程中,收集、记录和使用源程序中语法符号的类型和特征等相关信息。
这些信息以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表等等。统称为符号表。
符号表的每一登记项,将填入名字标识符以及与该名字相关联的信息。这些信息全面反映各个符号的属性和编译过程中的特征。符号表组织的好坏直接影响编译系统的执行效率。
2. 变量名包含的内容:(符号的属性有哪些?)
(1) 种属(简单变量、数组、记录结构)
(2) 类型(整型、实型、字符串等等)
(3) 所分配的数据区地址(相对地址)
(4) 假设是数组。填写内情向量,并指出内情向量首地址
(5) 假设是记录结构,把登记项与各分量按某种方式连接起来
(6) 假设是形參,记录其类型
(7) 对于fortran语言,设置COMMON链地址栏及EQUIVALENCE链地址栏。以便将相关的COMMON元或EQUIVALENCE元链接在一起
(8) 定义性出现或引用性出现标志
(9) 对该变量是否进行过赋值的标志
3. 在组织一个编译程序的符号表时,应考虑例如以下问题:
(1) 怎样确定符号表信息栏所应存放的内容?
在能充分反映名字详细属性的前提下,应使每一登记项信息栏的长度尽可能短,以节省表区所需的存储空间。
(2) 怎样确定信息栏的格式。即怎样组织信息栏的各个子栏?
这依赖于对符号表登记项检索或填入信息的方式。以及目标机器的字长和指令系统。
一般应採用简单而有效的方式来检索或填入信息。
(3) 因为标识符种属的不同,描写叙述属性的信息也就不同。怎样处理信息栏长度的不同?
使不同种属名字的登记项信息在格式上尽可能一致。
一种做法是为多数名字登记项确定一个基本长度,对于须要较多空间的标识符,以两个或很多其它个相连的基本长度项作为一个登记项。
还有一种方式是用间接表的方式阻止符号表。
第七章-执行时的存储组织与分配
1. 执行时的内存划分:
(1) 目标程序区,用来存放所生成的目标程序。
(2) 静态数据区。用来存放编译程序本身能够确定所占用存储空间大小的数据。
(3) 执行栈区,在执行时才干分配存储空间的数据就分配在执行栈。
(4) 供用户动态申请存储空间的堆区。
2. 执行时的分配策略:
(1) 静态分配。
(2) 栈式分配。或称栈式动态分配。
(3) 堆式分配,或称堆式动态分配。
3. 活动记录包含几部分?
(1) 返回的值
(2) 实在參数
(3) 任选的控制链
(4) 任选的存取链
(5) 保存的机器状态
(6) 局部数据
(7) 暂时变量
第八章-代码优化
1. 循环不变量外提的条件是什么?
对于循环中的不变运算 (s) A:=B OP C
条件1:(1)s所在的基本块是循环L的各出口节点的必经节点。
(2)s是循环L的唯一定值点。
(3)对于A在循环L中的所有引用点,仅仅有A在(s)的定值才干到达。
条件2:在满足条件1(2)及1(3)的前提下,当控制从循环L的出口节点离开循环时。变量A不再活跃。
循环L中凡是满足条件1或条件2的不变运算就可以为外提的不变运算。