導航:首頁 > 源碼編譯 > 編譯器優化未來

編譯器優化未來

發布時間: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優化的情況,其優化效率已經可以和一名中高級編譯專家手工優化的效果差不多。

閱讀全文

與編譯器優化未來相關的資料

熱點內容
機器學習貝葉斯演算法 瀏覽:252
驗鞋的app有哪個 瀏覽:393
php資料庫文件在哪裡 瀏覽:627
pythonrun模塊 瀏覽:714
高並發處理方案php 瀏覽:145
梯形迭代式演算法 瀏覽:437
ppt轉pdf破解 瀏覽:1002
如何給股票賬號加密碼 瀏覽:105
新鄭java程序員 瀏覽:912
為什麼王者榮耀安卓和蘋果玩不了 瀏覽:774
山西百信恆山伺服器雲主機 瀏覽:843
ssh連接linux伺服器 瀏覽:384
怎麼架設mu伺服器 瀏覽:700
pythonorgdownload 瀏覽:918
選股入門公式源碼小寫怎麼編寫 瀏覽:290
解壓瀏覽器哪個好 瀏覽:449
棍法PDF 瀏覽:663
電腦文件夾怎麼後退一步 瀏覽:166
單片機高速ad 瀏覽:534
androidhttp獲取json 瀏覽:163