编译原理——基本块、流图、基本块优化、循环优化(代码优化)

5 篇文章 6 订阅
订阅专栏

一、划分基本块、画流图

  1. 找基本块的入口:一共有三类入口:①代码段的第一个指令;②条件跳转和无条件跳转的目标语句;③条件跳转语句的下一条语句
  2. 根据划分的入口画流图,一个基本块的区间:从入口开始,至到遇到下一个入口结束

例题1

在这里插入图片描述

分析

  1. 首先根据上面的3类找基本块入口的方法,把基本块入口找出来;
    在这里插入图片描述
  2. 根据划分的入口画流图,一个基本块从入口开始,至到遇到下一个入口结束
    在这里插入图片描述

例题2

在这里插入图片描述

分析

  1. 首先根据上面的3类找基本块入口的方法,把基本块入口找出来;一共5个基本块:B1、B2、B3、B4、B5;
    在这里插入图片描述
  2. 根据划分的入口画流图,一个基本块从入口开始,至到遇到下一个入口结束
    在这里插入图片描述

二、基本块优化

例题1

在这里插入图片描述

(一)、删除公共子表达式

删除前面已经计算过得、公共子表达式;由于A+C、A*C已经计算过,故将H=D,I=E;
在这里插入图片描述

(二)、复制传播

把后面用的H、I的换为根(源头),H的源头是D,那么把下面用到H的换成D;I的源头是E,那么把下面用到I的换成E;
在这里插入图片描述

(三)、删除死代码

把没用的代码直接删掉;H、I已经没用任何用处了
在这里插入图片描述

(四)、根据题目要求再优化

在这里插入图片描述
常量B,可以直接删掉,把用到B的都替换成3即可;然后只写G、L、M用到的基本块,其余的不用写;
在这里插入图片描述

例题2

图片来源于: Bilibili 中间代码优化习题讲解,讲的挺不错的,可以去看看;
在这里插入图片描述

三、循环优化

例题1

这个例题就是从 Bilibili 中间代码优化习题讲解里截取的,挺经典;
在这里插入图片描述

(一)、代码外提

把循环中,一直不变的量(常量)移出循环,可以放在循环的上一个基本块中;
在这里插入图片描述

(二)、归纳变量强度削弱
  1. 通过循环结束if判断条件(i<=10),以及代码块( i 每次+1),可以发现 i 就是基本归纳变量;那么与i(基本归纳变量)相关的t2、t10就是归纳变量
  2. 注意基本归纳变量归纳变量是两个东西;
  3. 然后削弱归纳变量把 i 通过别的方式替换掉),t2=4*i,乘法可以削弱为加法 变为 ==》t2=t2+4;然后那么t2就需要初始化,所以在B1将有一个t2=4 * i(i起始为1)的初始化;
    在这里插入图片描述
    在这里插入图片描述
(三)、删除基本归纳变量
  1. 上面已经削弱了归纳变量,那么现在可以删除基本归纳变量 i,以及更换或删除和 i 相关的条件;
  2. 由于循环结束条件是i<=10,那么就是t2加10次4,那不就是t2=40为临界条件,所以把i<=10改为t2<=40
  3. 所有与基本归纳变量 i 相关的t10也可以删了(t10的作用理解为for循环的i++);
  4. 并且B1中把常量1代入4*i,可以理解为:合并已知量;
    在这里插入图片描述

例题2

在这里插入图片描述

分析

首先观察四元式程序,发现不用进行基本块优化,那么就可以直接通过上面的循环优化的步骤来做这个题;

(一)、归纳变量强度削弱
  1. 可以发现循环体没有常量,所以省去第一步,直接进行第二步,归纳变量的削弱;
  2. 然后一个比较重要的规律:像 A=K*I 都可以转化为自身+=一个非I的数;比如此题的A=K*I,可以转换为A=A+K,因为K * I就相当于 I个K的和赋给A,等价于 A自身+=K,这样+= I次即可;需要记得初始化那些削弱后的归纳变量;

在这里插入图片描述
在这里插入图片描述

(二)、删除基本归纳变量 I
  1. 关于新的循环结束条件,最简单的方法就是看原程序的目的;所以循环结束条件可以是A<K * 100,也可以是B<J * 100;
  2. 由于此题仅仅要求对循环进行优化,所以最后I=1的初始值还保留着,也可以像上面把常量I=1代入K*I,这里就不画蛇添足了;
  3. 然后我把K*100封装一个变量T了,然后代码外提部分我直接放在基本块1了,答案那样新开一个基本块也是一样的;
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

例题3

在这里插入图片描述

分析

首先观察四元式程序,发现不用进行基本块优化,那么就可以直接通过上面的循环优化的步骤来做这个题;

(一)、代码外提

B=J+1与循环无关,那么直接提出去即可;
在这里插入图片描述

(二)、归纳变量强度削弱
  1. 需注意此题的归纳变量C,C=B+I,这里是加法,就不能像上面例题1、2直接转化本身 +=K;
  2. 可以发现每次C=B+I,每次的值都是,也就是C在B的基础上,每次加个1,所以 C赋个初值C=B+1,然后每次C=C+1,正好可以把I=I+1替换掉;
    在这里插入图片描述
    在这里插入图片描述
(三)、删除基本归纳变量 I
  1. 通过分析原程序,新的循环结束条件,是C=B+100;封装一个T=B+100,那循环结束就是C=T;
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

编译原理--基本块的划分
weixin_52205764的博客
11-23 2346
一个练习,引自吉林大学PPT。基本块的划分原则有4条。
程序设计语言编译原理 (陈火旺)
03-22
编译原理经典教材 目录 第一章引论 1.1什么叫编译程序 1.2编译过程概述 1.3编译程序的结构 1.3.1编译程序总框 1.3.2表格与表格管理 1.3.3出错处理 1.3.4遍 1.3.5编译前端与后端 1.4编译程序与程序设计环境 1.5编译程序的生成 第二章高级语言及其语法描述 2.1 程序语言的定义 2.1.1语法 2.1.2 语义 2.2 高级语言的一般特性 2.2.1 高级语言的分类 2.2.2程序结构 2.2.3数据类型与操作 2.2.4语句与控制结构 2.3程序语言的语法描述 2.3 上下文无关文法 2.3.2语法分析树与二义性 2.3.3 形式语言鸟瞰 练 习 第三章词法分析 3.1 对于词法分析器的要求 3.1.1词法分析器的功能和输出形式 3.1.2词法分析器作为一个独立子程序 3.2词法分析器的设计 3.2.1输入、预处理 3.2.2 单词符号的识别:超前搜索 3.2.3状态转换图 3.2.4状态转换图的实现 3.3正规表达式与有限自动机 3.3.1正规式与正规集 3.3.2确定有限自动机(DFA) 3.3.3非确定有限自动机(NFA) 3.3.4正规文法与有限自动机的等价性 3.3.5 正规式与有限自动机的等价性 3.3.6确定有限自动机的化简 3.4词法分析器的自动产生 3.4.1语言LEX的一般描述 3.4.2超前搜索 3.4.3 LEX的实现 练 习 第四章语法分析——自上而下分析 4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.3.1左递归的消除 4.3.2消除回溯、提左因子 4.3.3 LL(1)分析条件 4.4递归下降分析程序构造 4.5预测分析程序 4.5.1预测分析程序工作过程 4.5.2预测分析表的构造 4.6 LL(1)分析中的错误处理 练 习 第五章语法分析——自下而上分析 5.1 自下而上分析基本问题 5.1.1 归约 5.1.2规范归约简述 5.1.3符号栈的使用与语法树的表示 5.2算符优先分析 5.2.1算符优先文法及优先表构造 5.2.2算符优先分析算法 5.2.3优先函数 5.2.4算符优先分析中的出错处理 5.3LR分析法 5.3.1 LR分析器 5.3.2LR(O)项目集族和LR(O)分析表的构造 5.3.3 SLR分析表的构造 5.3.4规范LR分析表的构造 5.3.5 LALR分析表的构造 5.3.6 二义文法的应用 5.3.7LR分析中的出错处理 5.4语法分析器的自动产生工具YACC 练 习 第六章属性文法和语法制导翻译 6.1属性文法 6.2基于属性文法的处理方法 6.2.1 依赖图 6.2.2树遍历的属性计算方法 6.2.3 一遍扫描的处理方法 6.2.4抽象语法树 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 6.4.1 翻译模式 6.4.2自顶向下翻译 6.4.3递归下降翻译器的设计 6.5自下而上计算继承属性 6.5.1 从翻译模式中去掉嵌入在产生式中间的动作 6.5.2分析栈中的继承属性 6.5.3模拟继承属性的计算 6.5.4 用综合属性代替继承属 练 习
编译原理 代码优化 基本块
06-04
基本块构造DAG的算法 for (i=0;i<QlistLength;i++) /*QlistLenth 之值为基本块中四元式的个数*/ {    取出第i四元式Qi; if (NODE(B)==NULL) {    建立一个以B为标记的叶结点,其编号为NODE (B);
编译原理基本块划分,循环流图
我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是
02-14 1001
汇编代码上进行基本块划分,构建流图,进行基本块划分,构建流图
编译原理 第十章 代码优化
greatcoder的博客
05-30 772
第十章 代码优化 优化:指对程序进行等价变换,使得从变换后的程序出发,能生成更有效的目标代码。 前端优化:在目标代码生成以前,对语法分析后的目标代码进行优化 后端优化:在生成目标代码时进行优化,依赖于具体的计算机指令系统 10.1 概述 优化原则: 等价原则:经过优化的代码不应改变程序运行的结果 有效原则: 有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小 合算原则:应尽可能以较低的代价取得较好的优化效果 10.2局部优化 10.2.1 基本块流图 基本块:指程序中一段顺序执
编译原理基本块流图
热门推荐
Vincent的博客
11-26 1万+
基本块流图 •采用图的方式表示中间代码,有助于生成更好的代码 ä构造方法 1.把中间代码划分成基本块(basic block,BB),每个基本块满足如下条件: ①控制流只能从基本块的第一个指令进入 ②除了基本块的最后一条指令,控制流在离开基本块前不会停机或者跳转 2.基本块形成了流图(flow graph)的结点,流图的边指明了哪些基本块可能紧随一个基本块之后执行 ä中断等程序行为...
慕课编译原理(第二十三章.局部优化-基本块划分)
weixin_42473228的博客
05-09 4158
慕课广西大学.编译原理.第二十三章.优化1.局部优化-基本块划分0 目录23 优化123.2 局部优化-基本块划分23.2.1 课堂重点23.2.2 测试与作业24 下一章 0 目录 23 优化1 23.2 局部优化-基本块划分 23.2.1 课堂重点 23.2.2 测试与作业 24 下一章 博客地址: ...
编译原理】中间代码优化(三) 循环优化
Esperanto.的博客
07-08 1万+
循环就是程序中那些可能反复执行的代码序列。也正是由于这部分代码序列可能会被反复执行,所以在进行中间代码优化时应着重考虑循环优化,这对提高目标代码的效率起到很大的作用。为了进行循环优化,首先需要确定的是程序流图中哪些基本块构成一个循环。按照结构程序设计思想,程序员在编程时应使用高级语言所提供的结构性的循环语句来编写循环。而由高级语言的循环语句所形成的循环,是不难找出的。对于循环中的代码,可以实行代码外提、强度削弱和删除归纳变量等优化操作。
编译原理习题—循环优化、强度消弱、自然循环、短路计算
我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是
12-07 565
(1)针对以下C程序片段,直接在源程序上进行循环优化循环不变计算外提,强度消弱与复写传播优化等) ​ 循环不变计算外提:​ 在第三层循环中,不变, ​ 强度消弱:​ ​ 复写传播优化:复写传播可以删去 (2)针对Homework 6的(1)中的C函数,在其三地址码基础上,给出流图,回边和自然循环。​ 三地址码: ​ 流图:B14NextB13i = i+1 goto B2B12j = j + 1 goto B4B11t33 = t32 goto B12B10t33 = t26B9if t26 >
程序的编译过程(流程图)
一个搬运知识的笨小孩
10-12 1840
程序从编写到可执行中间主要有两步流程: 1.编译 2.链接
掌握基于中间代码的基本块划分方法
03-19
1 掌握基于中间代码的基本块划分方法 2 掌握常量表达式优化的基本原理 3 掌握公共表达式优化的基本原理 4 掌握循环不变式外提的基本原理
javaSE代码实例
06-21
第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...
Visual C++ 2010入门经典(第5版)--源代码及课后练习答案
12-15
该资料是《Visual C++ 2010入门经典(第5版)》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2010入门经典(第5版) 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2010 原出版社: Wrox 作者: ...
零起点学通C++学习_多媒体范例教学代码
07-16
7.1 循环语句的前身——goto语句 7.2 慎用goto语句 7.3 while语句 7.3.1 带运算符的while语句 7.3.2 以字符为条件的while语句 7.3.3 限定while循环的次数 7.3.4 continue语句 7.3.5 break语句 7.3.6 永不...
Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码
02-04
 在程序中优化查询而无需改动代码。  作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行的方向,赋予了他们不断开拓的动力。 作者简介  KAREN MORTON 研究人员、教育家及顾问,Fidelity信息服务公司...
编译原理学习笔记23——优化1
我的的博客
02-06 1083
编译原理——优化 中间代码
编译原理笔记16】代码优化流图,常用代码优化方法, 基本块优化
记录学习痕迹的公众号:Piper蛋窝
08-14 5469
基本块为单位,进行运算上的推导优化。堪称妙!原来编译器这么强大!
编译原理代码优化流图/DAG优化
丧心病狂Loli控的博客
12-11 6882
优化原因 逐条语句进行的代码生成策略经常产生含有大量冗余指令和次最优解结构的目标代码。 代码优化就是被优化程序进行一种语义保持的变换   优化位置 中间代码优化(与机器无关) 目标代码优化(与机器有关)   优化分类 局部优化 循环优化 全局优化   优化技术 删除公共子表达式:t1 = 4 * i和t2 = 4 * i的右侧是公共的,优化为t1 = 4 * i和t2 = t1 复写传播:t1 = f[t2]、t3 = t2、t4 = f[t3]优化为t1 = f
编译优化之 - 通用循环优化
zhugl的博客
09-11 5023
前言   循环是程序中最常见结构,针对循环已有众多的优化技术。循环优化分为源码上的修改和编译器的优化,编译器能自动执行许多循环优化技术,但对源代码的修改可辅助编译器就行优化处理。 1. 源码上的优化 1. 多重循环的“外小内大”   在多重循环中,采用迭代次数较小的循环驱动内层迭代次数较大的循环能减少内存的消耗,如下示例: for (int i = 0; i < 10000; i++) { for (int j = 0; j < 200; j++) { } } 改为: for
编译原理基本块划分的代码
最新发布
06-06
基本块划分是编译原理中非常重要的一个概念,它可以将程序的代码划分成一些基本块,方便后续的分析和优化。 以下是基本块划分的代码实现,以C语言为例: ```c for (i = 0; i < n; i++) { if (a[i] > 0) { b[i] = a[i] * 2; } else { b[i] = a[i] / 2; } } ``` 基本块划分的过程如下: 1. 找到第一个语句,作为基本块的起始语句。 2. 从起始语句开始,逐条向下扫描,直到遇到转移语句(如if、for、while等)或函数调用语句,或者到达基本块的末尾。 3. 如果遇到转移语句,将转移语句之前的语句作为一个基本块。 4. 将转移语句作为一个新的基本块的起始语句。 5. 重复步骤2、3、4,直到扫描完整个程序。 根据上述基本块划分的过程,我们可以将上面的代码划分成三个基本块: ```c // 基本块1 for (i = 0; i < n; i++) { // 基本块2 if (a[i] > 0) { b[i] = a[i] * 2; } else { // 基本块3 b[i] = a[i] / 2; } } ``` 在实际编译器的实现中,基本块划分是很重要的基础性工作,它为后续的优化和代码生成提供了便利。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 操作系统——信号量机制(PV操作) 23793
  • 编译原理——正规式、NFA转换构造DFA、DFA的化简 21673
  • 编译原理——求后缀表达式、三元式、四元式 11919
  • 编译原理——基本块、流图、基本块优化、循环优化(代码优化) 6926
  • 蓝桥杯_练一练「42 点问题」java (枚举) 5774

分类专栏

  • 操作系统 3篇
  • 编译原理 5篇
  • 树状数组 6篇
  • 线段树 4篇
  • KMP 1篇
  • 图论 6篇
  • 最短路径 10篇
  • 最小生成树 4篇
  • LCA 2篇
  • 强连通分量 2篇
  • 二分图 6篇
  • 拓扑排序 5篇
  • 并查集 11篇
  • 前缀和与差分 4篇
  • 线性表 33篇
  • 二叉树 35篇
  • 二分 21篇
  • DP 20篇
  • DFS 63篇
  • BFS 11篇
  • 字符串哈希 5篇
  • Trie树 3篇
  • 贪心 30篇
  • 数学 11篇
  • Codeforces 5篇
  • 牛客 1篇
  • Linux 2篇
  • 矩阵 3篇
  • 递推 17篇
  • 递归 24篇
  • 暴力枚举 15篇
  • 离散化 1篇
  • 排序 10篇
  • 分治 18篇
  • 高精度计算 4篇
  • 蓝桥杯 73篇
  • 天梯赛 29篇
  • ccpc 3篇
  • Spring 1篇
  • 洛谷 90篇
  • 信奥一本通 152篇
  • 计蒜客 15篇
  • PTA 23篇
  • 力扣 10篇
  • Python学习笔记 4篇

最新评论

  • 编译原理——参数传递—传名、传地址、得结果、传值

    鹤望兰-0216: 讲得很好,非常感谢

  • 编译原理——正规式、NFA转换构造DFA、DFA的化简

    鳄鱼快跑223: 总结的真好,很到位

  • 编译原理——正规式、NFA转换构造DFA、DFA的化简

    栋栋在努力: zjj

  • 操作系统——信号量机制(PV操作)

    @ZiFenf: 还把别人水印给遮掉了

  • 1203:扩号匹配问题 c++_栈

    Tim111224: 21的判断可以去掉

大家在看

  • Java与机器学习:从零开始的入门指南 106
  • 一些简单却精妙的算法
  • 薪酬激励失效的原因及对策
  • 对动态规划进行降维打击(状态压缩)-康Sir的学习笔记 826
  • 手搓JDBC时报错 java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long

最新文章

  • 1277:【例9.21】方格取数——数字三角形模型
  • 1287:最低通行费——数字三角形模型
  • 1284:摘花生——数字三角形模型
2023年9篇
2022年449篇
2021年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上的yyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳SEO优化公司九江优化公司常德百度网站优化多少钱九江百搜标王公司泰州营销型网站建设公司盘锦网站改版多少钱甘南网站改版哪家好林芝网站推广系统哪家好西乡网站设计模板金华百搜标王公司阜阳网络营销报价西乡网站优化软件宿州网站优化多少钱眉山网站改版推荐吉安外贸网站设计推荐漯河模板制作大鹏百度标王哪家好无锡SEO按效果付费推荐东莞推广网站报价泉州网站推广方案抚州品牌网站设计报价金昌网站建设推荐绍兴推广网站推荐淄博营销型网站建设垦利如何制作网站价格清徐网页设计价格淄博英文网站建设固原网站制作设计哪家好大庆营销网站报价百色网站搜索优化价格沧州外贸网站建设价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化