转自:https://www.jianshu.com/p/eb63d31ad638
编译原理
第一章 引言
1.从面向机器的语言到面向人类的语言
汇编指令:用符号表示的指令被称为汇编指令
汇编语言:汇编指令的集合称为汇编语言
2.语言之间的翻译
转换(也被称为预处理):高级语言之间的翻译,如FORTRAN
到ADA
的转换
编译:高级语言可以直接翻译成机器语言,也可以翻译成汇编语言,这两个翻译过程称为编译
汇编:从汇编语言到机器语言的翻译被称为汇编
交叉汇编:将一个汇编语言程序汇编成为可在另一机器上运行的机器指令成为交叉汇编
反汇编:把机器语言翻译成汇编语言
反编译:把汇编语言翻译成高级语言
3. 编译器与解释器
(1)语言翻译的两种基本形态
解释器与编译器的主要区别:运行目标程序时的控制权在解释器
而不在目标程序.
(2)各自特点
- 编译器:
工作效率高
,即时间快、空间省;交互性与动态性差,可移植性差
. - 解释器:
工作效率低
,,即时间慢、空间费;交互性与动态性好,可移植性好
.
共同点:均完成对源程序
的翻译.
差异:编译器采用先翻译后执行,解释器采用边翻译边执行.
4. 编译器的工作原理与基本组成
(0)通用程序设计语言的主要成份 声明+操作=完整定义
(1)以过程
为基本结构的程序设计语言的组成
- 声明性语句:提供操作对象的性质,如数据类型、值、作用域等;
- 操作性语句:确定操作的计算次序,完成实际操作。
- 过程定义 = 过程头+过程体
(2)以阶段划分编译器
注:符号表管理器和出错处理贯穿编译器工作的各个阶段.
(3)编译器各阶段工作
1> 词法分析:词法分析的输入是源程序
,输出是识别出的记号流
.目的是识别单词
. 至少分以下几类:关键字(保留字)、标识符、字面量、特殊符号
2> 语法分析: 输入是词法分析器返回的记号流
,输出是语法树
.目的是得到语言结构并以树的形式表示.对于声明性语句,进行符号表的查填,对于可执行语句,检查结构合理的表达式运算是否有意义.
3> 语义分析:根据语义规则对语法树中的语法单元进行静态语义检查,如类型检查和转换等,目的在于保证语法正确的结构在语义分析上也是合法的.
4> 中间代码生成(可选):生成一种既接近目标语言,又与具体机器无关的表示,便于代码优化与代码生成.
(到目前为止,编译器与解释器可以一致)
5> 中间代码优化(可选):局部优化、循环优化、全局优化等;优化实际上是一个等价变换,变换前后的指令序列完成同样的功能,但在占用的空间上和程序执行的时间上都更省、更有效
6> 目标代码生成:不同形式的目标代码—汇编语言形式、可重定位二进制代码形式、内存形式(Load-and-Go)
7> 符号表管理:合理组织符号,便于各阶段查找\填写等.
8> 出错处理:
动态错误:源程序中的逻辑错误,发生在程序运行的时候。也称为动态语义错误
静态错误:静态错误分为语法错误和静态语义错误.
<1> 语法错误:有关语言结构上的错误,如单词拼写错误、表达式缺少操作数、begin和end不匹配
<2> 静态语义错误:分析源程序时可以发现的语言意义上的错误,如加法的两个操作数一个是整形变量,另一个是数组名
(4)编译器的分析\综合模式
逻辑上把编译器分为分析(前端)部分
和综合(后端)部分
.
1> 分析(前端):语言结构和意义的分析; 从词法分析到中间代码生成各阶段的工作
2> 综合(后端):语言意义处理;从中间代码生成到目标代码生成的各阶段的工作
3> 编译器和解释器的区别往往是在形成中间代码之后开始的.
5. 编译器扫描的遍数
每个阶段将程序完整分析一遍的工作模式称为一遍扫描。
(将源程序或源程序的某种形式的中间表示完整分析一遍,亦称作一遍扫描)
第二章 词法分析
1. 词法分析中的若干问题
(1) 记号、模式与单词
单词的分类:关键字(保留字)、标识符、字面量、特殊符号
模式(pattern):产生/识别单词的规则
记号(token):按照某个模式(或规则)识别出的元素(一组)
单词(lexeme):被识别出的元素的值(字符串本身) ,也称为词值
(2) 词法分析器的作用与工作方式
词法分析器的作用:
1> 识别记号并交给语法分析器(根据模式识别记号)
2> 滤掉源程序中的无用成分,如注释、空格和回车等
3> 处理与具体平台有关的输入(如文件结束符的不同表示等)
4> 调用符号表管理器和出错处理器,进行相关处理
工作方式:
1.单独一遍扫描
2.作为语法分析器的子程序
3.并行方式
2. 模式的形式化描述
(1) 字符串与语言
语言L是有限字母表∑上有限长度字符串的集合.
定义中强调两个有限,因为计算机的表示能力有限 :
1> 字母表是有限的,即字母表中元素是有限多个;
2> 字符串的长度是有限的,即字符串中字符个数是有限多个。
(字符串与字符串集合相关的概念与运算,如前缀、后缀、子串、子序列等,字符串的并、交、连接、差、闭包)
(2) 正规式与正规集
令Σ是一个有限字母表,则Σ上的 正规式 及其表示的集合递归定义如下:
1. ε是正规式,它表示集合 L(ε) = {ε}
2. 若a是Σ上的字符,则a是正规式,它表示集合L(a)={a}
3. 若正规式r和s分别表示集合L(r)和L(s),则
(a) r|s是正规式,表示集合L(r)∪L(s),
(b) rs是正规式,表示集合L(r)L(s),
(c) r*是正规式,表示集合(L(r))*,
(d)(r)是正规式,表示的集合仍然是L(r)。
括弧用来改变运算的先后次序!
可用正规式描述(其结构)的语言称为 正规语言 或 正规集 。
若运算的优先级和结合性做下述约定:
1. 三种运算均具有左结合性质;
2. 优先级从高到低顺序排列为:闭包运算、连接运算、或运算。
则正规式中不必要的括号可以被省略。
若正规式P和Q表示了同一个正规集,则称P和Q是等价的,记为P=Q