编译引论
编译程序
源语言,源程序
目标语言,目标程序
宿主语言,宿主机
分类:解释程序,编译程序,汇编程序
分类:解释执行,编译执行
编译程序结构
词法分析
语法分析
语义分析和中间代码生成
代码优化
目标代码生成
表格管理
出错处理
五个阶段
遍
一遍
多遍
区别
T型图
交叉编译
形式语言自动机理论
文法和语言
字母表
字符串
符号串长度
符号串子串
符号串的连接
符号串的方幂
符号串集合的乘积
符号串集合的方幂
集合的闭包
文法四元组
元语言
推导
直接推导
直接推导序列
最左、最右推导
句型,句子,规范句型
文法递归
语言
文法等价
文法表示方法
BNF表示法
扩充BNF(EBNF)表示法
语法图表示法
属于元语言
文法二义性
语法分析树
二义文法
文法和语言的类型
0型文法-短语结构文法
1型文法-上下文有关文法
2型文法-上下文无关文法
3型文法-正则文法,线性文法
从上到下限制越来越严,但描述功能越来越弱
有限自动机
确定的有限自动机
五元组
状态有限集合
输入字符的有限集合
状态转换函数
唯一初态
终态集
化简
接受状态,拒绝状态
状态等价,不等价(可区别)
无关状态
划分法
归约有限自动机
非确定的有限自动机
五元组
区别在于后继状态不唯一
两者区别
非确定的状态转换函数值是一个状态子集
非确定的可以带空串转换
两者等价
闭包
子集法
正规式,正规集
正规式和有限自动机等价转换算法
词法分析
输入与输出
关键字
常数
标识符
运算符
界限符
属性字-输出
单词-输入
输入与预处理
输入缓冲区-对半互补
预处理
滤掉源程序中的注释
剔除远程系中的无用字符
进行宏替换
实现文件包含的嵌入和条件编译的嵌入
词法分析器状态转换图构造方法
对程序的单词按类构造相应的状态转换图
超前搜索
对各类状态转换图合并
程序中心法
数据中心法
主表(状态,分表地址),分表
步骤
方法
自动生成器(Lex/Flex)
X-构造能识别正规式描述的单词集
Y-子集法
Z-划分算法
Lex运行
pas.l-Lex编译器-Lex.yy.c
Lex.yy.c-C编译器-a.out
PAS源程序-a.out-PAS语言源程序的词法分析结果
三个步骤
Lex编译器内部结构
语法分析
构造
源程序串L
源程序的文法G
识别出的语法范畴表示
自上而下分析
综述
功能:编译程序的核心
分析方法
自上而下分析
产生
面向目标
推导过程
自下而上分析
辨认
基于目标
归约过程
不确定自上而下语法分析
一般-试探推导-回溯
左递归
直接左递归
间接左递归
左公因子
回溯
First集
LL(1)分析
分析器构造
总控程序
LL(1)分析表
分析栈
分析表构造
Follow集
判断唯一候选条件
LL(1)文法
任何LL(1)文法都无二义性
含有左递归的文法必然是非LL(1)文法
非LL(1)语言存在
存在算法判断任一文法是LL(1)文法
存在算法判断两个LL(1)文法是否产生相同语言
不存在算法判定上下文无关语言能否由LL(1)文法产生
自下而上分析
移进-归约的自下而上分析
采取分析动作:移进,归约,接受或报错
判断栈顶字符串的可规约性
决定选用文法中的哪条规则进行归约
自下而上分析的关键问题
短语
直接短语
句柄-最左直接短语
算符优先分析
优先关系-低于,高于,等于
算符优先文法
算符文法
算符优先文法
算法优先表
任何句型都不会含两个连续非终结符
FirstVT和LastVT集合
素短语
最左素短语
优先函数表的构造
引入原因
终结符N个,优先关系表大小(N+1)^2
终结符N个,优先函数表大小2*(N+1)
算符优先分析器
总控程序
分析栈
优先函数表
组成
LR分析
最常用,最有效的一种分析方法
理论上比较完善
适用性强,对G的限定少
便于自动生成
输入串-分析对象
下推分析栈
状态符号
文法符号
历史-展望信息
内容
LR分析总控程序
LR分析表
动作表
依据-栈顶当前状态和当前输入符号
移进
归约
接受
出错
动作
状态转换表
依据-栈顶状态和面临的符号
LR文法
LR(K)文法
任何LR(K)文法都是无二义性文法,任何二义性文法都不是LR(K)文法
LR(0)分析
实现思想
活前缀
活前缀中已含有句柄的全部符号-特殊-可归前缀
活前缀中只含有句柄的一部分符号
活前缀中不包含句柄的任何符号
活前缀与句柄之间关系
LR(0)项目
归约项目
接受项目
移进项目
待约项目
· 表示栈顶和源程序串的分界点
构造识别所有活前缀的非确定有限自动机
开始符号的第一个产生式为NFA的唯一初态
令所有LR(0)项目为NFA的一个状态,归约项目为终态
圆点只差一个位置的两个项目中间连接一条弧
待约符号需要求出闭包
LR(0)项目分类
LR(0)项目集规范族
GO函数
LR(0)文法
即含移进项目又含归约项目
含有多个归约项目
识别可归约前缀DFA的每一个状态不存在
SLR(1)分析
Follow集
SLR(1)文法
LR(1)分析
搜索符
LALR(1)分析
同心项目集
项目集中的LR(0)相同
搜索符不同
判断文法
LR(0)
SLR(1)
LR(1)
LALR(1)
从上到下,依次判断,LR(1)可能性最大
常识
任何一个二义文法都不是一个LR文法
二义文法会导致语法分析的二义性
逻辑结构
LR分析中错误与恢复
错误种类
词法错误
语法错误
语义错误
违反环境限制错误
错误恢复
紧急恢复方式
短语级恢复
出错产生式
全局纠正
语义分析和中间代码生成
语义分析概念
任务:进行语义处理和检查,产生相应中间代码或目标代码
中间代码:介于源语言和目标代码之间的一种代码
方便生成目标代码
便于移植
便于优化
引入中间代码作用
语法制导翻译
任务-按照语法范畴进行语义处理,翻译成相应的中间代码
属性翻译文法
分析树
继承属性
综合属性
一个结点的属性值是通过子结点的属性值得到的
一个结点的属性值是由父亲结点或兄弟结点得到的
中间语言
逆波兰式表示
表达式中不带括号,计算顺序表示清晰
运算处理方便
优点
N-元式表示
三元式
三元式顺序编号-NO
操作符-OP
ARG1-第一操作数,ARG2-第二操作数
组成
间接三元式
用间接码表单独给出三元式的执行顺序
四元式
OP-操作符
ARG1-第一操作数,ARG2-第二操作数
RESULT-计算结果操作数
图表示
三元式-一棵子树
OP-子树根
ARG1-子树左叶结点
ARG2-子树右叶结点
中间代码生成
说明类语句翻译
常理定义语句翻译
简单数据类型变量说明语句翻译
记录结构型数据说明翻译
赋值语句和表达式翻译
赋值语句翻译
算术表达式翻译
逻辑表达式翻译
控制流语句翻译
控制流语句特点
语句标号与拉链返填技术
语句标号处理
先定义后引用
先引用后定义
定义性出现 L:S
使用性出现 goto L
标号表
标号名
定义与否标志
0-使用性出现
1-定义性出现
地址
组成
语句标号
显式-位于源语句之前
隐式-内含与源语句之中,且在源程序中未标识
拉链返填技术
链头在代码区的四元式中
链尾在标号表中
链在与同一语句相关的跳转代码中
条件语句翻译
循环语句翻译
多分支语句翻译
数组元素引用
信息向量表
数组存储方式
按行
按列
数组元素地址计算
数组元素引用目标结构
动态数组
产生此部分代码,静态数组元素引用
函数翻译
处理调用
处理说明
运行环境
存储组织和分配
过程
活动
生存期
存储空间
静态
过程的定义
名字的声明
声明的作用域
符号表
动态
过程的活动
名字的绑定
绑定的生存期
活动记录
声明
绑定
运行环境
环境-状态的区别
环境与语言特性相关
变量与值的映射
名字-存储位置-值
环境-绑定
状态-赋值
区别
赋值改变状态,不改变环境
环境与语言特性相关
存储分配策略
静态存储分配
对语言的限制
数据对象的长度和它在内存中位置的限制必须在编译时知道
不允许递归过程
数据结构不能动态建立
动态存储分配
栈式存储分配
堆式存储分配
存储分配过程的活动记录AR
存储区保存的对象
生成的目标代码
目标代码运行时的数据空间
记录过程活动的控制栈
基于栈的存储分配
静态链
存取链SL
控制链SP/DL
嵌套层次显示表DISPLAY
函数所需的数据空间
生存期在本过程本次活动中的数据对象
管理过程活动的记录信息
主程序在第0层
基于堆的存储分配
静态,栈,堆关系
可以静态分配的数据可以栈分配
可以静态和栈分配的数据可以堆分配
代码优化
概述
代码优化定义
优化整体过程
等价-不改变程序的执行效果
变换-引起程序形式上的变动
改进,提供程序途径
改进算法
在源程序级上等价变换
利用系统提供的程序库
编译时优化
优化的目的-产生高效的目标代码
空间-程序及数据所占空间尽可能少
时间-源程序运行时间尽可能短
高效
优化技术分类
全局优化
局部优化
循环优化
优化阶段
中间代码级优化
目标代码级优化
优化具体实现
常量合并与传播
公共子表达式删除
死代码删除
无用转移语句删除
循环不变量或不变代码外提
函数嵌套
循环转换
其他
优化编译程序的组织
控制流分析
数据流分析
代码变换
局部优化
基本块
基本块特点
基本块划分
入口语句
程序的第一个语句
由条件转移语句或无条件转移语句转移到的语句
紧跟在条件转移语句和无条件转移语句后面的语句
基本块确定
由该入口语句和下一个入口语句之间的所有语句构成的一个基本块
由该入口语句到一转移语句之间的所有语句构成的基本块
由该入口语句到程序中的停止或暂停语句之间的语句序列构成一个基本块
程序的控制流图
流图的所有结点组成的集合
流图的首节点
流图的所有有向边组成的集合
组成
DAG
组成
叶节点-标识符或常量
内部结点-运算符标记或计算值
标识符-一个结点上可以有多个
类型
0型-定值语句
1型-单目运算且定值
2型-双目运算,取数组元素且定值
循环查找
循环条件
强连通性
入口惟一
必经结点
自反性
传递性
反对称性
满足偏序关系
必经结点集
回边
利用回边求循环
数据流分析
点
通路
定值点
定值方式
赋值语句
输入语句
函数调用的形参与实参结合
引用点
i=i+1;前面为定值点,后面为引用点
i++;既是定值点也是引用点
到达-定值
ud链-引用-定值链
相对于引用点的定值情况
活跃变量
du链-定值-引用链
相对于定值点的引用情况
循环优化
循环前置结点
代码外提
不变运算
限制条件
A所在的结点是所有出口结点的必经结点
在L对A不止一次定值情况下不允许外提
L中的所有A引用点只有S中的定值点才能到达
强度削弱
删除归纳变量
基本归纳变量
归纳变量
顺序
寻找归纳变量
强度削弱
删除归纳变量
从上往下执行
循环展开,合并