导航:首页 > 源码编译 > 编译器优化未来

编译器优化未来

发布时间:2023-05-30 01:36:13

‘壹’ 为什么需要改变编译

答案如下:
1.编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
2.解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.
3.因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式).
4.编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。
4.编译器在优化过程中采用了自动或半自动的代码生成用以替代人工优化。人的精力是有限的,通过(接近无限)的算力去适配每一个应用场景看到的网络,改变编译器,这是编译技术比人工路线强的所在。

‘贰’ 现代C/C++编译器有多智能

最近在搞C/C++代码的性能优化,发现很多时候自以为的优化其实编译器早就优化过了,得结合反汇编才能看出到底要做什么样的优化。
请熟悉编译器的同学结合操作系统和硬件谈一谈现代c/c++编译器到底有多智能吧。哪些书本上的优化方法其实早就过时了?
以及程序员做什么会让编译器能更好的自动优化代码?
举个栗子:
1,循环展开,大部分编译器设置flag后会自动展开;
2,顺序SIMD优化,大部分编译器设置flag后也会自动优化成SIMD指令;
3,减少中间变量,大部分编译器会自动优化掉中间变量;
etc.
查看代码对应的汇编:
Compiler Explorer
【以下解答】
举个之前看过的例子:
int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = ret * 131 + *s; ++ s; } ret %= N; if (ret < 0) ret += N; //注意这句 return ret;}
【以下解答】
举个简单例子,一到一百求和
#include int sum() { int ret= 0; int i; for(i = 1; i <= 100; i++) ret+=i; return ret;}int main() { printf("%d\n", sum()); return 0;}
【以下解答】
话题太大,码字花时间…
先放传送门好了。
请看Google的C++编译器组老大Chandler Carruth的演讲。这个演讲是从编译器研发工程师的角度出发,以Clang/LLVM编译C++为例,向一般C++程序员介绍理解编译器优化的思维模型。它讲解了C++编译器会做的一些常见优化,而不会深入到LLVM具体是如何实现这些优化的,所以即使不懂编译原理的C++程序员看这个演讲也不会有压力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
演示稿:https://meetingcpp.com/tl_files/mcpp/2015/talks/meetingcxx_2015-understanding_compiler_optimization_themed_.pdf
录像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不开请自备工具…)
Agner Fog写的优化手册也永远是值得参考的文档。其中的C++优化手册:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog
要稍微深入一点的话,GCC和LLVM的文档其实都对各自的内部实现有不错的介绍。
GCC:GNU Compiler Collection (GCC) Internals
LLVM:LLVM’s Analysis and Transform Passes
========================================
反模式(anti-patterns)
1. 为了“优化”而减少源码中局部变量的个数
这可能是最没用的手工“优化”了。特别是遇到在高级语言中“不用临时变量来交换两个变量”这种场景的时候。
看另一个问题有感:有什么像a=a+b;b=a-b;a=a-b;这样的算法或者知识? - 编程
2. 为了“优化”而把应该传值的参数改为传引用
(待续…)
【以下解答】
推荐读一读这里的几个文档:
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X
其中第一篇:http://www.agner.org/optimize/optimizing_cpp.pdf
讲解了C++不同领域的优化思路和问题,还有编译器做了哪些优化,以及如何代码配合编译器优化。还有优化多线程、使用向量指令等的介绍,推荐看看。
感觉比较符合你的部分需求。
【以下解答】
一份比较老的slides:
http://www.fefe.de/source-code-optimization.pdf
【以下解答】
利用C++11的range-based for loop语法可以实现类似python里的range生成器,也就是实现一个range对象,使得
for(auto i : range(start, stop, step))
【以下解答】
我觉得都不用现代。。。。寄存器分配和指令调度最智能了
【以下解答】
每次编译poco库的时候我都觉得很为难GCC
【以下解答】
有些智能并不能保证代码变换前后语义是等价的
【以下解答】
诶诶,我错了各位,GCC是可以借助 SSE 的 xmm 寄存器进行优化的,经 @RednaxelaFX 才知道应该添加 -march=native 选项。我以前不了解 -march 选项,去研究下再来补充为什么加和不加区别这么大。
十分抱歉黑错了。。。以后再找别的点来黑。
误导大家了,实在抱歉。(??ˇ?ˇ??)
/*********以下是并不正确的原答案*********/
我是来黑 GCC的。
最近在搞编译器相关的活,编译OpenSSL的时候有一段这样的代码:
BN_ULONG a0,a1,a2,a3; // EmmetZC 注:BN_ULONG 其实就是 unsigned longa0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
【以下解答】
提示:找不到对象
【以下解答】
忍不住抖个机灵。
私以为正常写代码情况下编译器就能优化,才叫智能编译器。要程序员绞尽脑汁去考虑怎么写代码能让编译器更好优化,甚至降低了可读性,那就没有起到透明屏蔽的作用。
智能编译器应该是程序猿要较劲脑汁才能让编译器不优化。
理论上是这样的。折叠我吧。
【以下解答】
编译器智能到每次我都觉得自己很智障。
【以下解答】
虽然题主内容里是想问编译器代码性能优化方面的内容,但题目里既然说到编译器的的智能,我就偏一下方向来说吧。
有什么更能展示编译器的强大和智能?
自然是c++的模版元编程
template meta programming
简单解释的话就是写代码的代码,写的还是c++,但能让编译器在编译期间生成正常的c++代码。
没接触过的话,是不是听上去感觉就是宏替换的加强版?感觉不到它的强大呢?
只是简单用的话,效果上这样理解也没什么
但是一旦深入下去,尤其翻看大神写的东西,这明明看着就是c++的代码,但TM怎么完全看不懂他在干什么?后来才知道这其实完全是另外一个世界,可是明明是另外一个世界的东西但它又可以用来做很多正常c++能做的事....
什么?你说它好像不能做这个,不能做那个,好像做不了太多东西,错了,大错特错。就像你和高手考试都考了100分的故事一样,虽然分数一样,但你是努力努力再努力才得了满分,而高手只是因为卷面分只有100分.....在元编程面前,只有想不到,没有做不到。
再回头看看其他答案,编译器顺手帮你求个和,丢弃下无用代码,就已经被惊呼强大了,那模板元编程这种几乎能在编译期直接帮你“生成”包含复杂逻辑的c++代码,甚至还能间接“执行”一些复杂逻辑,这样的编译器是不是算怪兽级的强大?
一个编译器同时支持编译语法相似但结果不同却又关联的两种依赖语言,这个编译器有多强大多智能?
写的人思维都要转换几次,编译器转着圈嵌着套翻着番儿地编译代码的代码也肯定是无比蛋疼的,你说它有多强大多智能?
一个代码创造另外一个代码,自己能按照相似的规则生成自己,是不是听上去已经有人工智能的发展趋势了?
上帝说,要有光,于是有了光。
老子曰,一生二,二生三,三生万物。
信c++,得永生!
===
FBI WARNING:模板元编程虽然很强大,但也有不少缺点,尤其对于大型项目,为了你以及身边同事的身心健康,请务必适度且谨慎的使用。勿乱入坑,回头是岸。
【以下解答】
c++11的auto自动类型推断算么....
【以下解答】
智能到开不同级别的优化,程序行为会不同 2333
【以下解答】
这个取决于你的水平

‘叁’ 华为Mate 20升级EMUI9.1后实测,新增这6个功能加分

前段时间,华为Mate 20升级到EMUI 9.1,升级之后究竟有哪些新功能值得一看,下面笔者就为大家解读一番。

方舟编译器和超级文件系统(EROFS),很多小伙伴们可能早已耳熟能详。鉴于方舟编译器和超级文件系统(EROFS)主要提升系统性能、应用运行速度和流畅度,而这些体验上的变化需要通过一定的手段量化,故此选用鲁大师评测中的体验评测项目,分别在升级前后进行体验评测跑分,前后两次跑分尽量控制变量,保证结果公平公正。

通过数据可以看到:体验评测得分在升级系统后有比较显着的提升,而主要的提升点在“桌面使用”和“照片查看与操作”这两个子项,考虑到方舟编译器需要应用适配,这个分数提升应该都是超级文件系统(EROFS)的功劳。可以预见的是,未来随着方舟编译器的继续升级优化以及更多应用适配,这个提升的空间是相当大的。

GPU Turbo(吓人的)技术面世已经一年有余,随着不断的升级适配,已经支持60余款主流手机 游戏 。

以第一批就已支持的 游戏 崩坏3为例,虽然这是一款比较吃配置的手游,但是在GPU Turbo 3.0的适配之下, 游戏 帧率可以稳定在30fps,波动方差仅为1.57fps,考虑到这款手游本身仅适配到30帧,这个结果是相当令人满意的。

EMUI 9.1针对语音助手进行了大幅度升级,现在的语音助手与当初的语音智障已经不可同日而语。自拍、慢动作拍摄、卡路里识别、扫码、识物、翻译等各种操作,现在只需要说出你的指令,即可一步直达,解放双手。

接听来电之前,可以欣赏一段短视频,还可以为特别的“TA”定制专属来电视频。可以在设置里面选择你喜欢的任何视频作为来电视频,也可以去华为主题APP下载精心设计的视频铃声,让来电动起来!

笔者在升级系统前后一直搭配华为Mate 20使用荣耀FlyPods青春版蓝牙耳机,超低时延蓝牙兼顾高音质和音画同步,使用体验得到显着提升,建议使用蓝牙耳机的小伙伴们一定要升级!

智能互联作为EMUI10的特点之一,在EMUI9.1上已经有所体现。自从去年底华为推出Huawei Share一碰传以来,解决了生活办公场景中一大痛点问题,得到了广泛好评。一碰传在不断开拓新功能的同时,也不忘给众多符合条件的老设备进行升级。

随着智慧屏的问世,智慧屏联动功能给我们带来了全新的互联体验,华为Mate 20也及时地得到了魔法闪投功能的升级。完全有理由相信,智能互联即将成为智能生活时代的中流砥柱,当下的智慧体验仅仅是一个开端。

华为Mate 20作为一款优秀的旗舰机,本身素质一流,现在拥有EMUI9.1强力加持,更是锦上添花!综合性能足够强大,未来的系统升级空间巨大,绝对是所在价位不二之选!

‘肆’ 本科独立用C语言完成没有优化的C语言编译器属于什么水平

我觉得水平还是很高的,但意义恐怕不大。编译器技术是非常成熟的领域,而且由于应用场景的限
制实时,复杂的算法已经自动出局了,你可选的东西是有限的。编译器可能有很多实现的形
式,虚拟机/解释器/静态编译器 等,也有成熟的开源实现。作为本科生,而非专门研究该分支的学生,应该合理分配自己学习的时间,如果做这个编译器就干
掉了大半年,那计网和OS这些课程该咋办? 

我知道很多人会认为没有做编译器优化特指中段优化,不考虑机器码上的优化比较划水。但编
译器优化是一个很复杂的东西:首先它和你用的IR表示有关而且是强烈耦合,SSA IR基本还
好,有开源代码和文献记载,你想要的都能在网上挖到但这怎么体现你的水平是吧。你
要考虑编译器的性能,尽管编译器的后端优化基本上可以纳入到某种PEabstract interpretation的
范畴中。

要不然你可以通过编写插件的方式白嫖例如visual studio code这类软
件的强大编辑功能,如果你写的不是c compiler,你也可以尽量把语法设计得很像c,这样你又能进一步
白嫖其强大的intellisense code,当然仍然有不少人或者应该说团队达到了这一步,到这里,应该卷死
了99.99%的同行应该毫无问题。

‘伍’ 通过编译器对程序优化来改进cache性能的方法有哪几种

你的程序可能太短,看不出区别来,你比对一下她们生成的汇编码就知道了


CPU 缓存是为了提高程序运行的性能,CPU 在很多处理上内部架构做了很多调整,比如 CPU 高速缓存,大家都知道因为硬盘很慢,可以通过缓存把数据加载到内存里面,提高访问速度,而 CPU 处理也有这个机制,尽可能把处理器访问主内存时间开销放在 CPU 高速缓存上面,CPU 访问速度相比内存访问速度又要快好多倍,这就是目前大多数处理器都会去利用的机制,利用处理器的缓存以提高性能。


就算优化带来的效果非常有限,但是经过长年累月的持续优化,效果也是非常明显的,比如当年的Chrome浏览器就是靠打开网页非常快从而打败微软系统自带的IE浏览器。电脑手机等硬件的性能是有限的,不同的算法会产生不同的效率,今天我们就简单说一个选择问题,开发程序时是节省内存还是节省计算量。

‘陆’ 编译器开发 与 嵌入式开发 哪个未来的前景比较好

嵌入式开发吧,编译器开发目前入门难,提高更难,而且又偏门。嵌入式运用广而且需求大,未来潜力大!

‘柒’ 多面体模型是编译器循环优化的未来吗

我们可以依赖现代编译器的优化技术而不是使用语言特性...编译/链接/调试 的开发模型将会被继承下来,但是把 ...‘;’的)循环体 赋值语句不会返回布尔类型的结果 ...

‘捌’ 现代C/C++编译器有多智能能做出什么厉害的优化

基本的循环外提,计算削弱,数据流分析合并都已经比较成熟了,可以说不考虑专用cpu优化的情况,其优化效率已经可以和一名中高级编译专家手工优化的效果差不多。

阅读全文

与编译器优化未来相关的资料

热点内容
android不同的layout 浏览:469
激光剑电影 浏览:920
华为招聘程序员 浏览:879
注册表扫描命令 浏览:219
中国老电影演员全部名单 浏览:942
用服务器ip地址访问 浏览:8
文登银河电影院今日放映表 浏览:82
学习板和单片机烧录器的区别 浏览:334
米思齐怎么编程顺序控制 浏览:807
linux磁盘规划 浏览:266
途观安卓大屏如何投屏 浏览:281
无声电影出现的时间 浏览:181
电信的app开票金额在哪里看 浏览:817
程序员薪资占比重图表 浏览:912
女主叫姜 浏览:314
催眠控制芯片bl 浏览:946
pdf复制后乱码 浏览:869
检测无法连接到加密锁授权服务器 浏览:532
新建文件夹2星空 浏览:581
同性恋激情电影 浏览:435