代码优化- 基本概念

news2024/9/20 4:47:05

思考一个问题:我们可以再抽象语法树上做编译优化吗?

答案是否定的,如果在抽象语法树上做编译优化的话,程序员所写的可能包含错误的代码,可能就被删除了,比如,对下面的程序做不可达代码删除优化,printf中应该首先给一个格式化字符串,而不是一个整型数,所以存在语义错误,如果先做优化,由于总是执行then分支,else分支执行不到,所以会把else分支删除,只保留if部分,那么编译器就不会爆语义错误了。这就违反了编译器中的一个基本原则--不能违反源程序的语义性质,这样的程序做类型检查时,程序员期待编译器报错,如果优化先做的话,那么这个错误消失了,所以对程序员理解这个程序的含义是相互矛盾的。

if (1) 
{
    ...
}
else
{
    printf(2);
}

所以必须要在语义分析做完之后,再做编译优化。

(注:图中的抽象语法树是做完语义分析之后的)

优化并不是局限于某一个中间表示,而是依附于不同的中间表示,在每一层上都可以做。

什么是代码优化?

代码优化是对被优化的程序进行的一种语义保持变换

语义保持:程序的可观察行为不能改变

变换的目的是让程序能够比变换前更小、更快、Cache行为更好、更节能等等

不存在“完全优化”

等价于停机问题:给定程序p(循环不终止的程序),把Opt(p)和下面的程序比较

(扩展:停机问题是可计算性和计算复杂性的基本定理:给定程序P,是否存在算法Q,Q将P作为输入,判断P是否可以运行终止。这是个不可计算问题,即不存在这样的算法Q)

L:
    jmp L

如果存在一个完全优化算法Opt,那么最终会将程序p优化成上面的样子,但是由于停机问题是不可计算问题,所以不可能存在这样的完全优化算法Opt。

这样的结论告诉我们,编译优化是一个没有尽头的过程。换句话说,我做完了第一个优化,将程序P通过O1优化为P1,为了加快程序的运行,我们可以继续通过O2将程序P1优化为P2,可以这样一直进行下去,也就意味着程序总是可以被优化的。

代码优化很困难

●  不能保证优化总能产生“好”的结果

●  优化的顺序和组合很关键

●  很多优化问题是非确定的

●  优化的正确性论证很微妙

对待编译优化正确的观点

(1)“把该做对的做对”,不是任何程序都会同概率出现,所以能处理大部分常见情况的优化就可以接受。

(2) “不期待完美编译器”,如果一个编译器有足够多的优化,则就是一个好的编译器。

编译优化路线图 

(1)前端优化

局部的、流不敏感的

常量折叠、代数优化、死代码删除等

(2)中期优化

全局的、流敏感的

常量传播、拷贝传播、死代码删除、公共子表达式删除等

(3)后端优化

在后端(汇编代码级)进行

寄存器分配、指令调度、窥孔优化等
 

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

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

相关文章

Hadoop笔记整理

Hadoop 一. 引言 1.1 什么是大数据 大数据:(Big Data):数据量级很大的应用处理。TB级 ,日数据增长GB级 K -- M---- G ---- T ----PB ---- EB ---ZB 1024通过对海量数据进行分析,挖掘,进而发现数据内在的规律,从而为企业或者…

【数据结构】超详细讲解:算术表达式转化为后缀表达式、前缀表达式、表达式树的构建

作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 【数据结构】:该专栏专注于数据结构知识,持续更新&#xff0c…

Praat脚本-037 | 批量把标注TextGrid生成韵律文本

目录 引题方案一方案二方案三获取脚本关注版权说明 引题 Praat是一种非常出色、轻便、开源免费的标注工具,它的最主要用途是标注,即对语音信号中的一些特征、信息进行标注,保存为TextGrid文件,这个TextGrid文件实质 上就是一种文…

chatGPT写文章-为什么chatGPT写的文章是原创

用chatGPT写文章会重复吗 ChatGPT在生成文本时会优先从先前的训练数据中学习到的文本中选取片段,并根据先前的内容和上下文来生成新的文本。因此,从理论上来说,在相同的输入条件下,每次使用ChatGPT生成文本都可能会产生不同的输出…

Web前端-Vue2.0框架学习

Web前端-Vue框架学习 1. 前端工程化与Webpack1.1 隔行变色的demo实现1.2 webpack的基本使用1.3 webpac插件1.3.1 webpack-dev-server插件1.3.2 html-webpack-plugin 1.4 webpack中的loader(加载器)1.4.1 css-loader1.4.2 less-loader1.4.3 url-loader &a…

【动态规划】经典问题第四组,背包问题运用(分割等和子集,最后一块石头的重量 II)

前言 小亭子正在努力的学习编程,接下来将开启算法的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请收藏点赞关注支持一波, 感激不尽~~ 刷题专栏在这里~~ 深入理解动态规划建议关注…

各省份非金融类对外直接投资存量(2003-2020年)

中国各省份在非金融类对外直接投资方面呈现出不同的趋势和特点。截至2021年底,中国全国非金融类对外直接投资存量达到2.9万亿美元,其中,广东、江苏、山东、北京和上海是投资存量排名前五的省份。这五个省份的非金融类对外直接投资存量占全国总…

想想都脊背一凉,细思极恐,大家提早醒悟

一位程序员说了一件很可怕的事: 辛辛苦苦写了几年代码,做了些业务,在一片祥和中有了点成就感。然而回头一看,80%是没啥用的,甚至没法写到简历上,让人脊背一凉! 有人说,这…

Linux网桥简介、入门与配置

开始之前先得介绍一下什么是网桥,这里我们假设大家已经知道了物理的交换机是工作在链路层的。交换机的主要任务是在链路层查找转发表(mac地址与端口对应关系表),按照数据帧的目标mac地址,转发数据帧到相应的端口。那么…

半导体存储电路

半导体存储电路 SR锁存器和触发器寄存器存储器存储器分类RAMSRAMDRAM ROMMROMPROMEPROMEEPROMFLASH原理发现者应用工作原理存储单元 磁盘硬盘机械硬盘(HDD)固态硬盘(SSD) SR锁存器和触发器 SR锁存器用于记忆1位二进制信号&#x…

C语言之二分查找

目录 一、二分查找算法 二、分支语句中应注意的小点 一、二分查找算法 所谓二分查找,就是要在一组有序的数列中,查找给定的数是否在此数列中。 最主要的步骤有三个: 1.确定被查找的范围的左右下标left、right 2.根据left和right&#xff…

工业品6大采购痛点,维度云ERP帮您解决

行业现状 近年来,中国采购市场竞争加剧,市场规模不断扩大,利润总额持续增长,但在整体采购市场环境上升的情况下,企业生产成本上升,产品售价下降,行业利润却持续减少,产品大量过剩&am…

家用洗地机到底好不好用?好用的洗地机分享

洗地机是一种非常实用的清洁设备,它与传统的拖把或清洗粉相比,洗地机能够更全面、更彻底地清洁地面,除去污渍和灰尘之余,还能去除有害物质如细菌、病毒等,保证地面的卫生环境。洗地机的自动清洗和吸污功能能够大幅缩短…

Java文件字符流和字节流中的实战

文件输入输出流 文件内容操作与实战字符流ReaderWriter 字节流inputStreamOutputStream实战💪 文件内容操作与实战 文件的分类上一篇文章(文件对象处理)已经和大家讲解过了。本章主要文件主要针对于对文件内容的操作展开讲解,文件…

【golang学习笔记】——(一)安装golang

当前为了方便后续的编译和使用,在windows下进行go的安装。 一、msi安装 官网下载地址:https://golang.google.cn/ 进入Download选择Windows的msi文件下载即可 下载后进行默认或者自定义安装即可,golang无特殊配置,可按照默认安装…

算法篇——二叉树大集合上篇(js版)

222.完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在…

AutoGPT的出现,会让程序员失业吗?

最近,一个叫AutoGPT的模型火了,在GitHub上线数周Star数就直线飙升。截至目前,AutoGPT的Star数已经达到87k,马上接近90k,超过了PyTorch的65k。 根据AutoGPT的命名,就可以发现其神奇之处在于“auto”&#x…

从申请到调用:全国快递物流查询 API 使用教程

引言 面对越来越多的快递需求和快递公司的日益增多,手动查询快递状态的工作变得愈发繁琐。此时,一个全国快递物流查询 API 的出现能够极大地提高查询的效率和准确性,解决人工查询的问题,为用户提供更加便捷的服务体验。全国快递物…

ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7

编辑:ll ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7 型号:ADG1408YRUZ-REEL7 品牌:ADI /亚德诺 封装:TSSOP-16 批号:2023 安装类型:表面贴装型 引脚数量:16 类型&#…

tftp+Filezilla文件双向传输(1)-centos(VMware)-win10(host)

目录 1.下载安装vsftpdtftptftp-server 2.配置服务 2.1 配置服务 修改文件 /etc/vsftpd.conf 2.2 配置服务 守护进程 /etc/xinetd.d/tftp 2.3 配置服务 tftp服务器 2.4 配置登录用户 2.4.1 修改selinux 2.4.2 匿名用户登录 2.4.3 新建账户,不能登陆系…