编译原理部分知识点总结
作者:互联网
第一章 引论
翻译程序:能够把一种语言程序(源语言)转换成另一种语言程序(目标语言),而后者和前者在逻辑上是等价的。
编译程序:把某一种高级语言程序等价地转换成另一种低级语言程序的程序。
解释程序:不产生目标程序,翻译源程序的一条条语句后直接执行,边解释边执行源程序本身。
编译程序的工作过程一般可划分为五个阶段:①词法分析②语法分析③语义分析与中间代码生成④优化⑤目标代码生成
编译程序的结构:①词法分析器(扫描器):输入源程序,进行词法分析,输出单词符号
②语法分析器(分析器):对单词符号进行语法分析,识别各类语法单位,最终判断输入串是否构成语法上正确的“程序”③语义分析和中间代码生成器:按照语义规则对语法分析器规约出的语法单位进行语义分析并把它们翻译成一定形式的中间代码④优化器:对中间代码进行优化⑤目标代码生成器:把中间代码翻译成目标程序
除上述五个功能模块外,一个完整的编译程序还应包括“表格管理”和“出错处理”。
表格管理中最重要的符号表,用来登记源程序中出现的每个名字以及名字的各种属性。
出错处理程序:如果源程序有错误,编译程序应该设法发现错误,把有关错误信息报告给用户。源程序中的错误通常分为语法错误和语义错误两大类。
具体实现编译程序时,受不同源语言、设计要求、适用对象和计算机条件的限制,往往将编译程序组织为若干遍。所谓“遍”就是对源程序或源程序的中间结果从头到尾扫描一遍,并作有关的加工处理,生成新的中间结果或目标程序。
一遍扫描可完成一个或多个阶段的工作。
编译系统规模较大,因此可移植性很重要
为了提高可移植性,将编译程序划分为前端和后端
编译前端和编译后端:前端主要由与源语言有关但与目标机无关的部分组成,通产包含词法分析、语法分析、语义分析与中间代码生成,有的也含代码优化;后端包括编译程序中与目标机有关的部分,代码优化和目标代码生成。通常,后端不依赖于源语言而仅仅依赖中间语言。
第二章 高级语言及其语法描述
高级语言的分类:①强制式语言(过程式语言)②应用式语言③基于规则的语言④面向对象的语言
Pascal是一个允许子程序嵌套定义的语言。
常见的初等数据类型:①数值数据②逻辑数据③字符数据④指针类型
文法是描述语言的语法结构的形式规则(语法规则)。
上下文无关文法通俗说就是:所有的产生式左边只有一个非终结符。
一个上下文无关文法包括四个组成部分:一组终结符号,一组非终结符号,一个开始符号,一组产生式。开始符号S至少必须在某个产生式的左部出现一次。
终结符号是一个语言的不可再分的基本符号。开始符号是一个特殊的非终结符号。
一个文法如何来定义语言.从开始符号出发,反复使用产生式,对非终结符进行替换和展开.此过程称为推导.
直接推导:称αAβ直接推出αγβ,即αAβ⟹ αγβ,仅当A → γ是一个产生式.表示直接推导
最左推导:任一步α⟹ β,都是对α中的最左非终结符进行替换。
最右推导:任一步α⟹ β,都是对α中的最右非终结符进行替换。
假定G是一个文法,S 是它的开始符号。若S经0步或多部推导出α ,则称α是一个句型。
仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,记为 L(G)。
用一张图表示一个句型的推导,称为语法树。树的根结点为开始符号,随着推导逐步展开。
一棵语法树是不同推导过程的共性抽象。
二义文法:如果一个文法存在某个句子对应两颗不同的语法树,也就是存在两个不同的最左(右)推导,则说这个文法是二义的。对于程序设计语言,分析时希望分析过程唯一,所以对二义文法应消除二义性.
第三章词法分析
词法分析器的功能:输入源程序、输出单词符号。
单词符号的种类:①关键字②标识符③常数④运算符⑤界符
单词输出形式: <单词种别,单词属性值>
单词种别通常用整数编码表示。
– 标识符:一类一种
– 常数:按类型分种
– 关键字、运算符、界符:一符一种
若一个种别只有一个单词,则种别编码就代表该单词。
若一个种别有多个单词,则对每个单词,还需给出属性值。
– 标识符单列一种;属性值为符号表项的指针
– 常数按类型分种;属性值为常数表项的指针
状态转换图是一张有限方向图。结点代表状态,用圆圈表示。状态之间用箭弧连结,箭弧上的标记代表射出结点状态下可能出现的输入字符或字符类。一张转换图只含有限个状态,其中有一个为初态,初态前加一个双箭头;至少要有一个终态,终态用双圈表示。
状态转换图可用于识别(或接受)一定的字符串。
字母表∑:一个程序设计语言只使用有限字符集,此字符集称为字母表。
字符: ∑中每一个元素称为一个字符
字(字符串): 是指由∑中的字符所构成的一个有穷序列。
空字:不包含任何字符的序列称为空字,记为ε
空集:不包含任何元素的集合,记为Φ
∑*(闭包):取字母表中的0个,1个…多个字符构成的字符串的集合。即∑上的所有字的全体,包含空字ε
正规式和正规集的递归定义
1)ε和∅都是∑上的正规式,它们所表示的正规集为{ε}和∅;
2)任何a∈∑,a是∑上的正规式,它所表示的正规集为{a};
3)假定e1和e2都是∑上的正规式,它们所表示的正规集为
L(e1)和L(e2),则 (e1|e2)、(e1·e2)、(e1)也是正规式,
所表示的正规集为L(e1)L(e2),L(e1)L(e2),(L(e1))。
仅由有限次使用上述三步骤而得到的表达式才是∑上的正规
式,仅由这些正规式表示的字集才是∑上的正规集。
正规集可以用正规表达式(简称正规式)表示。
正规表达式是表示正规集一种方法。一个字集合是正规集当且仅当它能用正规式表示。
所有词法结构一般都可以用正规式描述
若两个正规式所表示的正规集相同,则这两个正规式等价。
DFA与NFA区别:
DFA:易于程序实现,仅有一个初态,箭弧上只有一个字符,单值部分映射,一一对应;
NFA:易于人工设计,一或多个初态,箭弧上可以为一个字,映射多个状态。
第七章语义分析和中间代码生成
后缀式表示法:Lukasiewicz发明的一种表示表达式的方法,又称逆波兰表示法。
三地址代码,是指这种代码的每条指令最多只能包含三个地址,即两个操作数地址和一个结果地址。
x:=y op z 三地址代码可以看成是抽象语法树或DAG的一种线性表示。
第九章运行时存储空间的划分
过程定义是一个说明,其最简单的形式是一个标识符和一段语句相关,标识符是过程名,语句是过程体。 一个过程的活动指的是该过程的一次执行。
过程P一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序,包括执行P时调用其它过程花费的时间。 过程可以是递归的。
一个目标程序运行所需的存储空间包括: 存放目标代码的空间,存放数据项目的空间,存放程序运行的控制或连接数据所需单元(控制栈)。
采用栈式存储分配机制
活动记录:运行时,每当进入一个过程就有一个相应的活动记录累筑于栈顶。此记录含有连接数据、形式单元、局部变量、局部数组的内情向量和临时工作单元等。
静态分配策略(FORTRAN)
如果在编译时能确定数据空间的大小,则可采用静态分配方法:在编译时刻为每个数据项目确定出在运行时刻的存储空间中的位置。
动态分配策略(PASCAL)
如果在编译时不能确定运行时数据空间的大小,则必须采用动态分配方法。允许递归过程和动态申请释放内存。
第十章优化
代码优化就是为了提高目标程序的效率,对程序进行等价变换,使得目标代码具有更高的时间效率和或空间效率。
优化的原则:
等价原则:优化后不应该改变程序运行的结果。
有效原则:优化后产生的目标代码运行时间较短,占用存储空间较小。
合算原则:应尽可能以较低的代价取得较好的优化结果。
常用优化技术:①删除公共子表达式②复写传播③删除无用代码④强度削弱⑤删除归纳变量
优化分类
①局部优化 ②循环优化
标签:总结,知识点,文法,语言,一个,正规,编译,编译程序,源程序 来源: https://blog.csdn.net/weixin_45230291/article/details/118367288