GCC/G++、ICC、Clang、MSVC、BCC等C/C++編譯器有什麼特長和不足?


GCC/G++,跨體系結構很多,很多開源軟體默認編譯器都是GCC/G++,這一點上Clang比不上。

ICC,沒有自己專門的前端(傳說中的外包),而且是針對Intel體系結構上專門優化,不多言。

Clang,重點介紹。licence極度友好,代碼質量非常棒,採用的IR為LLVM IR非常優秀,各大公司逐步發力在Clang上,包括不限於微軟,IBM,Nvidia等,各大公司也在開始瘋狂的往Clang / LLVM交代碼(圈地),也開始往Clang實現OpenMP,Nvidia GPU等支持,目前在趕超GCC的道路上一路激情的狂奔,前途一片光明。但是Clang依賴於的LLVM,目前的性能無法與GCC相提辯論,在Benchmark性能測試上幾乎沒有勝利的項目,優化的道路上任重道遠(但是隨著各大公司的瘋狂回饋,讓人可以看見希望),同時一些開源軟體沒有辦法編譯過去,主要是缺乏對GCC 一些Builtin函數、自身帶的彙編器的孱弱導致。

MSVC,WIndows平台上最常用的編譯器,在C++編譯器聖戰中的勝利者,一個常被人詬病的是對標準的支持不夠新不夠快(最近開始逐步加快了)。隨著微軟發布基於Clang / C2,這一條路以後若成功,MSVC與Clang / C2並行,甚至逐步逐步退出舞台,都是有可能的事情。

BCC,Borland C++,曾經非常流行的C++編譯器,然而在C++編譯器聖戰中失敗了,後面也被Borland賣掉了,目前幾乎沒有聽說了。

補充IBM XL C++,前身是VisualAge C++,在IBM特定硬體與平台上表現非常牛逼,Benchmark性能測試非常優秀,其最初的設計思想就是為了性能,其最高優化級別可以達到O5,帶來的反噬則是在編譯時間上往往過長。而另外一個常被人詬病的是對C++標準的支持、開源軟體的支持、錯誤信息的提示上都不夠友好,然而從13.2開始,隨著IBM採用Clang融合方案,目前這幾項都得到有效改良,然而融合的道路也必定是漫長的,以前的歷史包袱等也需要背上。


補充下 Borland C++,被 Embarcadero?收購後成為了 推出了 RAD Studio,最新版本是Embarcadero? RAD Studio? 10 Seattle ,支持windows和osx ios開發 其中bcc64是基於clang改造的,安裝包體積接近7G。

OpenWatcom 從2010年開始準備支持win64 目前依然不慍不火。Github上可以搜到。


  • G++:bug多,修得慢,號稱符合標準其實支持的亂七八糟的擴展比VC++還離譜,而且佔用內存巨大

  • Clang++:無論是代碼的可讀性、性能、內存佔用還是錯誤信息比G++好一萬倍。搞理論的都喜歡通過給Clang++臨時添加低質量的代碼來做概念證明,大部分不會進去。

  • MSVC:支持C++/AMP,秒殺其它C++編譯器,特別是編譯佔用的內存啊,在寫C++他爹Bjarnet Stroustrup的那種風格的C++的時候,只有Clang++的1/10。寫初學者C++程序的時候,跟Clang++佔用的內存差不多。

  • ICC:總之無論你喜歡什麼,發布的時候用它編譯總是沒錯的。


從-使用經驗-(劃掉)手感來看,

GCC:應該被掃進時代的垃圾桶

Clang:就你TM話多

MSVC:他能編譯過的,別人一般編譯不過;新版本莫名其妙的Bug多,語法錯誤都能把編譯器搞崩潰,大概也是印度人加成吧

ICC:別人能編譯過的,他一般都得改改

PS:以上除了MSVC都支持x64內聯彙編

總結:都是辣雞


其實GCC沒有這麼不堪,除非你想改它的源碼 ,誠如輪子哥所言,GCC帶了許多不知有卵用的功能,比較混亂。GCC對C++的支持沒有對C的支持那麼有誠意,個人用C首選GCC,用C++的話再考慮其他編譯器。

PS:GCC其實是偽裝成編譯器的某種東西,誰用誰知道(據說信仰點滿後可以飛升)。

ICC嘛,我想吐槽它的兼容性。

MSVC,我寫C++時會用它,感覺面向機器的優化不夠狠,勝在比較人性化(可惜我等搬磚工從來就沒有房子值錢)。

Clang/LLVM是後生,出身好,最近膨脹得很快,但願不要被玩壞。

BCC我沒用過,TC當年倒是把我折騰得死去活來(只是我菜)。

Open64也是個編譯器,由於我才疏學淺,沒看出有它有什麼優點。


GCC/G++: Linux 逼你用

MSVC: Windows 逼你用

Clang: iOS 逼你用,OS X 將要逼你用,BSD 正在考慮該怎麼逼你用,微軟正在考慮怎麼開掉 VC 團隊逼你用

BCC: 十年前的老代碼逼你用

DMC: DMD 逼你用


Windows開發首選MSVC。

Linux開發首選GCC/G++ 。

OS X開發首選Clang。

對代碼性能要求高的程序可以考慮ICC。ICC支持Windows/Linux,是否支持OS X不清楚。

好久沒聽說BCC了。


ARM上 clang的性能不比GCC5差

clang的Assembler也還不錯 而且比較嚴格 能發現GCC沒發現的錯誤 比如某些指令對立即數範圍的限制

內聯彙編是略差 一方面這玩意不是語言規範 基本就是以GCC為標準 另一方面受設計限制 某些Modidier不容易實現 比如128位寄存器對

Clang也有一些獨有的特色 比如code formatter ,Google做的sanitizer , 模塊化


本人在Linux下用ICC/GCC。Intel宣稱他們對ICC做了優化可以提高代碼的性能,這一點對大規模計算十分有益。經實測,在Intel core的機器上代碼加速可達50%以上(openmp)

Linux下的ICC對教育目的是免費的,但是貌似得每年更新一次。


vs2015的編譯器效率某些方面不比icc低了!


clang/clang++已經很好了,我在Linux和FreeBSD上面都在用,都是生產級別的應用。


說句無關的,mingw大法好,哈哈

ps 我可沒說mingw是編譯器 [滑稽 ]


(1)前景最好的應該是clang,錯誤提示/編譯速度都是一流。另外現在有很多代碼自動完成/提示工具是基於clang的。clang編譯出的debug文件已經可以用gdb調試了哈,vs2015也內置了clang來提供對cross platfrom的支持。

(2)gcc/g++/msvc因為面向了具體的platform,所以老的項目裡面可能用了他們自帶的擴展/或者在彼此應用環境下有一些best practice,這個沒有辦法,還得接著用。。。

(3)Borland?還活著?

(4)ICC,據說經ICC編譯後效率有提高,即使是AMD的U也是這樣。。。我沒試過。。。

對我自己而言,優先順序是clang&>g++&>msvc。


Borland c++,後端是pascal,號稱是最快的編譯器,現已沒落,新版rad studio已採用clang編譯器。

clang和gcc,緊跟標準,擴展與特性最豐富,編譯效率clang勝於gcc,再者,clang對ide特性有良好支持。

icc,針對intel高度優化。

msvc/cl,最常用的編譯器,以穩定高效著稱。

補充幾個古董c++編譯器:cint,watcom c++, visualage, symatec c++,cfront

坐等真的乾貨。


推薦閱讀:

疑犯追蹤第五季第一集的疑犯追蹤中,為什麼是使用ps3來搭建大型計算機?

TAG:計算機 | C編程語言 | CC | 編譯器 | IntelCCompiler |