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

news2025/1/10 16:49:03

一、划分基本块、画流图

  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;
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++: STL : 容器:set/multi set,map/multimap

一&#xff1a;set容器 1.1: set容器的构造和赋值 简介&#xff1a;所有元素都会在插入时自动被排序 本质&#xff1a;set/multiset 属于关联式容器 &#xff0c;底层结构是二叉树实现 set与multiset区别&#xff1a; set: 不 允许容器中有重复元素 multiset &#xff1a;允…

Shader Graph(一)基本使用

一、如何使用Shader Graph 1.1 新建项目 通过创建URP或HDRP模板项目&#xff0c;可以自动配置好Shader Graph。 1.2 已有项目 在「Package Manager」中安装「Shader Graph」及URP或HDRP组件。然后在弹出的渲染管线向导面板中点击「Fix All」即可。如果项目中存在已经创建好…

three.js实战-Sprite实现标签效果

1. demo效果 2 .什么是精灵(Sprite) 按照Three.js官网的解释是&#xff1a;精灵是一个总是面朝着摄像机的平面&#xff0c;通常含有使用一个半透明的纹理。精灵不会投射任何阴影&#xff0c;即使设置了也将不会有任何效果。 3. 代码大致逻辑 创建一个canvas对象,首先调用ctx…

密码学_DES加密算法

目录 DES&#xff08;Data Encryption Standard&#xff09; IP置换&#xff1a; E盒扩展 S盒压缩 P盒置换 K密钥生成 PC-1置换表&#xff08;通常用此表&#xff09;&#xff1a; PC-2置换表&#xff08;通常用此表&#xff09;&#xff1a; IP-1逆置换表 DES&#x…

MyBatis的SQL执行结果和客户端执行结果不一致问题排查

MyBatis的SQL执行结果和客户端执行结果不一致问题排查问题引入测试表、测试数据问题介绍排查问题调试 MyBatis源码JDBC 执行 SQL解决问题待解决问题最近遇到一个调试很久的问题&#xff0c;MyBatis 查询 Oracle 数据库查询结果与在客户端查询结果不一致。 问题引入 测试表、测…

自动化审批流程有哪些?使用中的优点是什么

自动化审批对HR管理有多重要呢&#xff1f;相信每一位HR都会希望让审批流程实现自动化&#xff0c;从而释放更多的时间去处理更加复杂的工作。 在人力资源管理过程中&#xff0c;自动化审批可以有效帮助HR提高流程效率。当管理人员每天收到很多审批请求之后&#xff0c;如果不…

AVS3中的AMVR和EMVR

在AVS2中运动预测中使用的MV都是1/4像素精度&#xff0c;通过在整像素间插值能显著提升非整像素运动预测的精度&#xff0c;同时带来的问题是随着MV精度的提高编码MVD所需的比特数也会增加。 AMVR AMVR支持的MVD编码5种精度的MVR{1/4,1/2,1,2,4}&#xff0c;索引为0到4&#x…

IU5706 外置MOS、33V输出大功率同步升压芯片产品介绍

概要 IU5706E是高性能宽输入范围&#xff08;4.5V~24V&#xff09;同步升压控制器&#xff0c;支持高达33V的输出电压。输出电压采用恒定频率电流模式脉宽调制&#xff08;PWM&#xff09;控制来实现调节。 芯片通过外部定时电阻器或通过与外部时钟信号同步来设置开关频率。在电…

PGL 系列(五)DeepWalk

DeepWalk 通过随机游走(truncated random walk)学习出一个网络的表示,在网络标注顶点很少的情况也能得到比较好的效果。随机游走起始于选定的节点,然后从当前节点移至随机邻居,并执行一定的步数,该方法大致可分为四个步骤: (a) 展示了原始的用户行为序列。(b) 基于这些用…

Redis架构 - Sentinel哨兵模式

简介 Redis Sentinel是Redis官方提供的一个高可用方案。是一种用于监控、提醒和自动故障转移的系统。它可以监控多个Redis实例&#xff0c;并在主服务器出现故障时执行故障转移&#xff0c;将从服务器升级为主服务器。 在Sentinel模式下&#xff0c;可以设置多个Sentinel实例…

6.1 函数基础

文章目录编写函数调用函数形参和实参函数的形参列表函数的返回类型局部对象自动对象局部静态对象函数声明在头文件中进行函数的声明分离式编译编译和链接多个源文件一个典型的函数 定义包括以下部分:返回类型、函数名字、由0个或多个形参组成的 列表以及函数体。其中&#xff0…

数据库,计算机网络、操作系统刷题笔记20

数据库&#xff0c;计算机网络、操作系统刷题笔记20 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

第三十章 数论——扩展中国剩余定理

第三十章 数论——扩展中国剩余定理一、中国剩余定理的弊端二、扩展中国剩余定理1、作用2、内容3、问题4、代码一、中国剩余定理的弊端 在第二十九章中&#xff0c;作者详细地讲解了中国剩余定理的使用&#xff0c;在开始本章节的讲解之前&#xff0c;建议读者先去看上一章节的…

Tensorflow2 图像分类-Flowers数据深度学习模型保存、读取、参数查看和图像预测

目录 1.原文完整代码 1.1 模型运行参数总结 1.2模型训练效果 ​编辑2.模型的保存 3.读取模型model 4.使用模型进行图片预测 5.补充 如何查看保存模型参数 5.1 model_weights 5.2 optimizer_weights 使用之前一篇代码&#xff1a; 原文链接&#xff1a;Tensorflow2 图像分…

English Learning - L1-7 介词 2022.12.26 周一

English Learning - L1-7 介词 2022.12.26 周一7 介词7.1 介词功能 1 - 表示动作的方向&#xff0c;范围和程度7.2 介词功能 2 - 胶水词&#xff0c;链接不同的名词7.3 介词功能 3 - 与 be 动词连用代替动词7.4 江南四大介词on核心意义&#xff1a;在。。。上; 在&#xff08;某…

融云 x OHLA:「社交+游戏」双轮驱动,逐鹿中东陌生人社交

完整报告&#xff0c;关注公众号文章限免下载 走过十多年的出海历程&#xff0c;中国创业者面临的机遇和挑战正在发生根本性变化。TikTok、SHEIN 在全球大获全胜的背后&#xff0c;不仅有中国产业链成熟、工程师红利的厚积薄发&#xff0c;也有一代代出海人布局全球商业路径的思…

Ubuntu20.04部署KVM并安装Ubuntu Server 20.04

kvm虚拟化技术 KVM介绍 KVM是Linux开源社区大力支持的虚拟化技术&#xff0c;基于Intel和AMD的硬件虚拟化技术。KVM&#xff08;Kernel-bashdVirtual Machine&#xff0c;即基于内核的虚拟机&#xff09;&#xff0c;它是用于Linux内核中的虚拟化环境设施&#xff0c;是Linux…

python:什么?你听MP3居然还要付费?看我一键......

前言 大家早好、午好、晚好吖 ❤ ~ 在我们上班空闲\游玩\散步的时候,总会习惯的拿出手机放首音乐来听一听 但是吧,有时候我们听一首歌起劲的时候,它会你提醒你 这时候怎么办呢&#xff1f;通常我们是下一首&#xff0c;或者充值 但是手头不宽裕但又想听怎么办&#xff1f; …

JavaEE-Spring(IoC控制反转,DI依赖注入,Spring项目创建和基本使用,ApplicationContext和BeanFactory的区别)

文章目录1. IoCDI2. Spring项目创建和使用ApplicationContext和BeanFactory的区别1. IoC Spring是一个包含多个工具方法的IoC容器 tomcat是web容器 List/Map是数据存储容器 IoC&#xff1a;Inversion of Control&#xff08;控制反转&#xff09; 将对象的控制权交给Spring&…

RK3399+PCIe+FPGA 在高速AD采样中的应用

一、需求 要实现高速AD/DA的数据采集&#xff0c;并发送到高性能arm核进行数据处理&#xff1b; 方案RK3399pcieFPGAAD/DA。 二、器件介绍 一、RK3399 RK3399是一款低功耗、高性能处理器&#xff0c;用于计算、个人移动互联网设备和其他智能设备应用。基于Big.Little架构&…