【编译原理】代码优化,流图/DAG优化

news/2024/7/10 5:52:44 标签: 编译原理, 图解, 优化

优化原因

  • 逐条语句进行的代码生成策略经常产生含有大量冗余指令和次最优解结构的目标代码。
  • 代码优化就是被优化程序进行一种语义保持的变换

 

优化位置

  • 中间代码优化(与机器无关)
  • 目标代码优化(与机器有关)

 

优化分类

 

优化技术

  • 删除公共子表达式t1 = 4 * it2 = 4 * i的右侧是公共的,优化t1 = 4 * it2 = t1
  • 复写传播t1 = f[t2]t3 = t2t4 = f[t3]优化t1 = f[t2]t3 = t2t4 = f[t2]
  • 删除无用表达式:把上面的t3 = t2删掉(事实上,复写传播的目的正是使某些变量的复制变为无用)
  • 强度削弱t1 = 4 * i,i的值每次循环减1,优化t1 = t1 - 4,将强度较高乘法运算优化为强度较低的加法运算
  • 删除归纳变量:若存在线性关系t1 = 4 * it2 = 4 * j,则i > j优化t1 > t2

 
 

流图构造

——— 根据中间代码构造流图需要三步:

  1. 入口语句程序的第一句 + 转移语句的目标句 + 转移语句的下一句
  2. 根据入口语句划分基本块
  3. 画图

——— 例题练手 >_<:

(1) read x
(2) read y
(3) r = x mod y
(4) if r = 0 goto (8)
(5) x = y
(6) y = r
(7) goto (3)
(8) write y
(9) end
  1. 找入口语句:(1) (3) (5) (8)
  2. 划分基本块:(1)(2); (3)(4); (5)(6)(7); (8)(9)
  3. 画图
    在这里插入图片描述

 
 
 

DAG优化

(1) T0 = 3.14
(2) T1 = 2 * T0
(3) T2 = R + r
(4) A = T1 * T2
(5) B = A
(6) T3 = 2 * T0
(7) T4 = R + r
(8) T5 = T3 * T4
(9) T6 = R - r
(10) B = T5 * T6

在这里插入图片描述

(1) T0 = 3.14
(2) T1 = 6.28
(3) T3 = 6.28
(4) T2 = R + r
(5) T4 = T2
(6) A = 6.28 * T2
(7) T5 = A
(8) T6 = R - r
(9) B = A * T6

 
 
 
 

 
 
 
 

 
 
 
 

E N D END END


http://www.niftyadmin.cn/n/1330145.html

相关文章

JavaFX学习(持续更新)

本文是作者学习JavaFX 这个框架的一些记录 更多学习内容在Java学习大纲(持续更新) 主要内容如下&#xff1a; javaFx&#xff08;1&#xff09;大局 jjavaFx之控件&#xff08;2&#xff09; 标签和按钮 javaFx之控件&#xff08;3&#xff09; 图片与相册 javaFx&#xff08;…

【计算机图形学】入门Three.js,并搭建你的第一个3D场景

什么是Three.js&#xff1f; WebGL&#xff08;Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个JavaScript绑定&#xff0c;WebGL可以为HTML5 Canvas提供硬件…

数据库学习笔记(持续更新)

所有资料汇总学习:点这里 Java学习大纲(持续更新):点这里 1&#xff1a;SQLyog使用 2&#xff1a;SQL语句&#xff0c;数据库配置&#xff0c;JDBC简单使用 3&#xff1a;MySQL入门 4&#xff1a;Redis入门

【经典专题】寻找质数——巧妙的埃氏筛和线性筛

很经典的题目&#xff1a;给出nnn&#xff0c;统计 [2,n)[2,n)[2,n) 中质数的数量 Demo1&#xff1a;input 10&#xff0c;output 4 Demo2&#xff1a;input 100&#xff0c;output 25 暴力枚举 首先&#xff0c;复习一遍质数的定义&#xff1a;在大于1的自然数中&#xff0c;…

SQLyog使用

JDBC学习&#xff1a;https://blog.csdn.net/weixin_39778570/article/details/95066091 下载好SQL服务&#xff0c;并启动&#xff0c;下载好SQLyog,打开SQLyog&#xff0c;新建一个数据库连接,打注释的填写名字,一开始不用设置密码进入 目录创建连接创建数据库创建和删除表数…

【计算机图形学】结课大作业——三维场景变换(ASCII表)

效果 >_< 技术栈 【前端】HTML / CSS / JavaScript【图形学】WebGL / Three.js 思路 three.js开发一般是比较套路的——init() animate() init()时把所有的场景摆放好animate()就是一个递归调用的渲染过程。 如何实现ASCII码图形的静态排列和动态变化&#xff1…

【python爬虫应用03】csdn个人所有文章质量分查询

&#x1f6e0;️ 环境准备 在开始编写代码之前&#xff0c;我们需要进行一些环境准备。以下是所需的环境和库&#xff1a; 操作系统&#xff1a;Windows编程语言&#xff1a;Python 3编辑器&#xff1a;VSCode&#xff08;可选&#xff09; 安装所需的库&#xff1a; reque…

Spring疑难杂症(控制层文件在服务器上无法访问)

Java学习大纲(持续更新)&#xff1a;https://blog.csdn.net/weixin_39778570 目录问题描述解决方案问题描述 编译工具:Eclipse 版本(Version): Oxygen.3a Release (4.7.3a) 我的Mvaen项目是这样的 AreaController类 在web层下面这三个类只有一个(AreaController)能在服务器…