為什麼經常聽人說編譯器比你聰明?

時間 2021-05-11 22:39:45

1樓:

其實沒我聰明,我沒見過哪個編譯器能把判斷是否是 2 的冪的迴圈寫法,優化成 n & (n-1) 的 /doge 。

2樓:

關於「人的優勢是知道的多」這一點,現在的編譯器通過inlining和LTO來擴大分析範圍,還是可以作出更多優化的。有時求解非常複雜的約束關係來進行優化,也有https://

r 這種基於Z3的優化器。

3樓:

不是編譯器比你聰明,而是寫編譯器的人比你更聰明、更專業。

知乎上不是有句話麼,不要拿你的愛好去對比別人吃飯的技能,程式優化方面也是如此。

4樓:李白

這句話的意思其實是:

寫編譯器的人比你聰明。

這類話經常出現的另乙個場景是:「編教材的人比你聰明」。

反例則是:「我比銀行聰明」、「我比馬化騰聰明」

5樓:

對於演算法與資料結構相關的問題,編譯器目前無法代替人優化。在AI足夠聰明前,編譯器還是無法把乙個n^3的樸素演算法自動優化到nlogn的理論最優演算法.

不過,在指令執行層面上,「廣義上的編譯器」,已經妥妥超越了人類。比如現代的jvm和v8,已經做到了執行時隨資料流優化,人類是不可能做到的。

然而,演算法達標的程式設計師畢竟不多,所以這句話還是大致成立的。

6樓:立黨

因為經常有人在網上或者跟前輩學來的亂七八糟的奇技淫巧,專喜歡耍小聰明,網上看來個東西或者聽人家說乙個東西,扭頭順手就給用上了,把i++換成++i還要放在各種方括號和引數裡,拿個位運算代替乘法之類的,讀起來莫名其妙,然後在真正的瓶頸的地方寫得跟個傻比似的,這種人最招人煩。

告訴你比編譯器聰明,是讓你好好寫,別整些低端么蛾子,在乙個乘法或者位運算或者i++還是++i上浪費精力,沒有任何效能提公升,反而減少可讀性,浪費所有人的時間和精力。

7樓:靈劍

是針對特定任務,比如說強行把乘法改成移位,自作主張加臨時變數之類,編譯器作者更懂CPU,這些編譯器都會自己處理。

程式設計師要處理的是大局觀上的問題。

8樓:

不是因為有些人就喜歡xjb優化

比如把a + b 寫成 a | b

編譯器比你更懂該怎麼優化

況且而且雖然編譯器也是人寫的

但人也是有高下之分的

9樓:Milo Yip

因為那些人不了解編譯器的侷限。

編譯器為了正確性,必須生成運算結果和預期完全相同的目標碼,例如有些浮點運算次序不能改變,否則誤差會不一樣。

編譯器不能自行改變資料結構和演算法,不能節省資料的記憶體,不能提高快取命中率。

編譯器不知道執行時的分支統計(profile guilded optimization 除外)。

編譯器不知道兩個指標會否可能指向同一位址(別名問題)。

計算器比人做算術更快更精確,但不能說前者比後者聰明。編譯器再強大,也只是乙個工具而已。合理地利用工具去提公升效率是人類聰明之處,不要妄自菲薄。

10樓:David Dong

因為社會分工。

第一是寫編譯器的人通常對程式語言和系統結構的了解超過大多數程式設計師。

第二是即使你對程式語言和系統結構瞭如指掌,你也不可能花大量時間去反覆優化乙個應用級的軟體。

如果你確實需要追求極端的效能,可以花大量時間反覆優化乙個軟體的話,你確實不能完全依賴編譯器,可能要針對性的調節。

11樓:siegfried415

我寫過編譯器,當然因為時間有限,只做了很有限的優化,比如基於流(而不是包)的模式匹配,解決跨包的攻擊檢測。差不多10年之後,我發現公司裡的普通程式設計師自己手寫的流匹配模組的效率還是不如我的原始版本。

12樓:王召德

因為編譯優化是乙個研究方向,在這個方向畢業了很多博士,他們一群都還算很厲害的人幾年如一日的尋找著可以優化的方法並進行嘗試,一旦行之有效便會被應用到實際編譯器中,這個過程積累下來達到的編譯優化水平在很大程度上要比個人一拍腦袋想到的方法要好,所以經常這麼說

13樓:Glavo

你要知道,乙個優秀的編譯器,是數個,或者數十個高水平程式設計師,花費大量時間大量精力去優化,才讓他能夠有這麼強大的優化能力。

你說編譯器也會有 bug,這是自然的,但是有 bug 和優化水平有什麼關係?再說了,就算編譯器有 bug,那也遠遠少於你自己造成的 bug,你看看你這裡出的 bug 有多少是編譯器造成的,有多少是你自己寫出來的?

14樓:樹下長了朵蘑菇

寫編譯器的人水平真的是很高。並且不妨找本《編譯原理》這種書看一看,注意看後端的部分,書裡會介紹很多優化的技巧,並且很多技巧是結合特定機器的feature開發的,優化效率是很高的。

15樓:諸葛不亮

因為寫編譯器的人水平超過99.9999%程式設計師。

沒錯,9的個數我沒寫錯,百萬分之一量級。

有人對這個數量級有異議,那麼就砍掉乙個9吧,這是底線,不可能再砍了

C C 主流編譯器為什麼不做成debug模式編譯的程式檢查陣列越界 溢位等錯誤,release模式編譯的程式不檢查?

看錯問題了 debug模式,VC可以檢查指向棧上物件的指標是否越界 對於new或者malloc出來的堆上的資料,就沒法判斷了 根源在於,C C 並沒有規範規定new或malloc出來的空間前後需要有什麼樣的標記,new甚至可以過載使得分配記憶體在自己預申請的空間內,或者這個空間甚至根本不是C C 系...

為什麼高版本的編譯器在使用calloc的時候有類似呼叫建構函式的環節,但是malloc始終沒有?

正如 Milo Yip 大佬所說,對於非pod型別,它們可能有自己的建構函式,虛表等,不能單用malloc這樣粗暴的方法,應該通過c 關鍵字new來使它初始化,它不僅僅構造物件,同時也構造虛表 如果有的話 乙個常見的問題是,vs下有人經常會ZeroMemory清空乙個容器,如vector,容器依舊可...

C語言病毒繁殖,為什麼一旦輸入93,編譯器就沒反應了?

王旭東 這題嚇死我了,尋思著有什麼程式需要在編譯的時候輸入?或者程式中乙個數字能造成編譯程式宕機?這真的是超級病毒了!題主,拜託先把一些基本概念搞搞清楚好吧!語法和演算法方面其他人都說過了,在此不表。但是好歹自己設個斷點看看呢!單步執行試試看!改變一下輸入的資料試試看!先從n比較小的數開始單步執行。...