编译原理之基本块和流图

基本块和流图

采用图的方式表示中间代码, 有助于生成更好的代码
ä 构造方法
1. 把中间代码划分成基本块( basic block BB ),每个基本块满足如下条件:
控制流只能从基本块的第一个指令进入
除了基本块的最后一条指令,控制流在离开基本块前不会停机或者跳转
2. 基本块形成了流图( flow graph )的结点,流图的边指明了哪些基本块可能紧随一个基本块之后执行
ä 中断等程序行为可能打破基本块的上述约定 1
构造基本块和流图的目的是对代码进行优化
ä 如果中断正常返回,则中断本身的保护机制可以使程序正常执行下去,不影响正确性,但可能形象优化效果
ä 如果中断导致异常退出,优化的结果也不会有错,程序本身非正常终止

 基本块(1)

基本块:
ä 定义:基本块是程序中最大限度顺序执行的语句序列,其中只有一个入口和出口,入口是其第一个语句,出口是其最后一个语句
ä 基本块的入口语句可能是
程序的第一个语句
跳转的目标语句
条件跳转的下一条语句
ä 基本块的结束语句可能是
停机语句
跳转语句
跳转目标语句的前一个语句(词法序)
基本块(续)
ä 构造方法
输入:一个三地址指令序列
输出:与之对应的基本块列表,每个指令恰好被分到一个基本块中
方法:
ä 首先,取定中间代码序列中哪些指令是首指令( leader ,入口指令,基本块的第一条指令)
1. 中间代码的第一个三地址指令是一个首指令
2. 任意一个条件或无条件转移指令的目标指令是一个首指令
3. 紧跟在一个条件或无条件转移指令之后的指令是一个首指令
ä 然后,每个首指令对应的基本块包括了从它自己开始,直到下一个首指令(不含)或者中间程序的结尾指令之间的所有指令
ä 一个特殊情况:过程调用语句作为一个新的基本块的开始,甚至独立成为一个基本块

 

 后续使用信息

下次不再引用意味着优化的机会
ä 寄存器优化
ä 临时名字存储单元的指派
计算后续使用信息
ä 三地址语句中名字的 使用( use 定义:
假定三地址语句 i a 的值赋给 x, 如果语句 j x 作为运算对象,并且控制从 i 流到 j, 这条路径中没有 x 的其它赋值,则称 j 引用 x i 定的值
此时,称 x 在语句 i 处活跃( live
ä 在基本块内:后续使用信息
对每个基本块反向扫描
为每个名字 x 在符号表中登记它是否在本块中有后续使用
如果在本块中没有后续使用,则登记它是否在本块的出口活跃。缺省认为所有的非临时变量在出口都是活跃的

 

ä 算法 8.7 :对一个基本块中的每一个语句确定活跃性与后续使用信息
输入:一个三地址语句的基本块 B ,假设在基本块 B 开始时,所有的非临时变量都是活跃的
输出:对于每一个语句 i x   = y op z x y z 的活跃性信息及后续使用信息关联到 i
方法:从基本块 B 的最后一个语句开始,反向扫描到 B 的开始处。对每一个三地址语句 i x   := y op z 依次执行下述步骤:
ä 把当前符号表中 x y z 的后续使用信息和活跃信息附加到语句 i 上;(若 x 不活跃,则这个语句可以删掉)
ä 在符号表中设置 x “无后续使用”和“不活跃”;
ä 把符号表中 y z 的后续使用信息均置为 i 活跃信息均置为“活跃”。 

注意:上述次序不能颠倒,因为x可能是yz

 

 流图(1

定义:控制流图或流图
ä 结点是基本块的有向图 G = ( N , E , root )
N 是结点的集合,每个结点表示一个基本块
E 是边的集合,如果结点 n i n j 间存在前驱和后继的关系,则在存在一条从 n i n j 的有向边(此时意味着,在 n i 执行后,可能会执行 n j
ä n i 的出口语句是 goto (s) if … goto (s), 且( s) 是的 n j 入口语句
ä n j 在程序中的位置紧跟在 n i 后,且 n i 的出口语句不是无条件转移语句和停语句
root 是流图的首结点(或称为根结点),是包含程序第一个语句的基本块
ä 每个流图都可以等价变换为单入口,且每个结点最多有两个后继的图

 

 

 

流图的表示方式 

可以用任意的表示图的数据结构表示流图
结点(基本块)
ä 基本块是一个指令序列
ä 可能要频繁改变这个指令序列
数量或组成的指令
目的之一是优化
ä 采用指令链表的形式较为高效
  • 15
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
《编译》——复习资料,可适用于课程学习资料、期末复习资料、自主学习资料等等,复习资料共218页,内容丰富,干货十足! 主要内容包括: 一、概述 1 1.1 课程介绍 1 1.2 编译过程 3 1.3 高级语言程序简介 11 二、程序语言概论 14 2.1 程序语言的定义 14 2.2 文法的形式化定义和分类 18 2.3 文法和语言 22 2.4 语法分析树 29 三、词法分析_1 33 3.1 词法分析概述 33 3.2 词法分析程序的设计 38 3.3 正规式与自动机 41 3.3.1 正规式与正规集 41 3.3.2 确定有限自动机(DFA) 44 3.3.3 非确定有限自动机(NFA) 49 3.4 单元测试 51 四、词汇分析_2 52 4.1正则式和有限自动机的等价 52 五、词法分析_3 59 5.1 DFA的化简 59 六、词法分析_4 62 6.1 词法分析器的自动生成 62 6.2 词法分析程序实现实例 64 七、语法分析—自上而下分析_1 71 7.1 词法分析简介 71 7.2 自顶向下分析简介 73 7.3 消除左递归和回溯 76 八、语法分析—自上而下分析_2 80 8.1 LL(1)分析法 80 8.2 FIRST集和FOLLOW集的构造 82 8.3 单元测试 85 九、语法分析—自上而下分析_3 86 9.1 LL(1)分析表的构造 86 9.2 递归子程序的原理 89 9.3 单元测试 95 十、语法分析—自下而上分析_1 96 10.1 自下而上分析方法的基本思想 96 10.2 分析树与规范规约 99 10.3 符号栈的使用 103 10.4 单元测试 105 十一、语法分析—自下而上分析_2 106 11.1 算符优先文法 106 11.2 优先表构造 109 11.3 算符优先分析算法 112 10.4 单元测试 115 十二、语法分析—自下而上分析_3 116 12.1 LR分析器 116 12.2 LR分析过程 119 12.3 单元测试 132 十三、语法分析—自下而上分析_4 133 13.1 构造识别前缀的DFA 133 13.2 LR(0)项目集规范族构造 140 13.3 由DFA构造LR(0)分析表 146 13.4 单元测试 150 十六、属性文法和语法翻译制导 151 16.1 L-属性文法和自顶向下翻译 151 16.2 自下而上计算继承属性 159 十七、语义分析和中间代码产生_1 166 17.1 语义分析的任务 166 17.2 中间代码的生成 168 17.3 算术表达式和赋值语句 175 17.4 单元测试 178 十八、语义分析和中间代码产生_2 179 18.1 布尔表达式的作用和文法描述 179 18.2 做控制用布尔表达式的翻译(回填) 181 18.3 控制流语句的翻译 186 18.4 控制流语句的翻译(回填) 189 十九、代码优化_1 194 19.1 什么是代码优化 194 19.2 基本块流图 199 19.3 单元测试 202 二十、代码优化_2 203 20.1 基本块的DAG表示及其作用 203 二十一、重要知识点 213 1. 考试内容及分数分布 213 2. 名词解释 214 3. 简答题 215 4. 结语 216

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值