VC, GCC, Clang/LLVM區別


https://alibabatech.medium.com/gcc-vs-clang-llvm-an-in-depth-comparison-of-c-c-compilers-899ede2be378

Background

VC, GCC和Clang/LLVM
VC主要為Windows平台設計,GCC是GNU和Linux系統的官方編譯器,
LLVM包含一系列模塊化的編譯器組件和工具鏈。LLVM可以作為多種語言的編譯器的背景。 Clang是一種C,C++,Objective-C或Objective-C ++編譯器,它基於LLVM用C++編譯。
一個好的編譯器使我們能夠專注於編程過程,而不是與之對抗。它可以支持最新的語言標准,可以從最抽象的代碼生成優化的命令,並且可以在更短的時間內編譯源代碼。

LLVM發展史

LLVM源自克里斯·拉特納(Chris Lattner)在2000年對UUIC的研究。克里斯·拉特納(Chris Lattner)希望為所有靜態和動態語言創建一種動態編譯技術。 LLVM是根據BSD許可開發的一種開源軟件。最初的1.0版本於2003年發布。2005年,Apple Inc.聘請Chris Lattner及其團隊為Apple計算機開發編程語言和編譯器,此后LLVM的開發進入了快車道。從LLVM 2.5開始,每年都會發布兩個次要的LLVM版本(通常在3月和9月)。 2011年11月,LLVM 3.0發布,成為默認的XCode編譯器。默認情況下,XCode 5開始使用Clang和LLVM 5.0。版本策略針對LLVM 5.0和更高版本進行了調整,並且每年發布兩個主要版本。當前的穩定版本是8.0。
LLVM的名稱首先是Low Level Virtual Machine的縮寫。由於該項目不僅限於創建虛擬機,因此經常會縮寫LLVM。 LLVM開發之后,它成為許多編譯工具和低級工具技術的統稱,因此名稱不太合適。開發人員決定放棄此縮寫背后的含義。現在,LLVM已成為正式品牌名稱,適用於LLVM下的所有項目,包括LLVM中間表示(LLVM IR),LLVM調試工具和LLVM C ++標准庫。 LLVM可用作傳統的編譯器,JIT編譯器,匯編器,調試器,靜態分析工具,以及與編程語言相關的其他功能。
在2012年,LLVM與UNIX,WWW,TCP / IP,TeX和Java等傳統系統一起獲得了計算機協會(ACM)的軟件系統獎。 LLVM大大簡化了新編程語言工具鏈的實施。近年來,許多新的編程語言,例如Swift,Rust和Julia,都使用LLVM作為其編譯框架。此外,LLVM已成為Mac OS X,iOS,FreeBSD和Android系統的默認編譯器。

Clang發展史

Clang旨在提供可以代替GCC的前端編譯器。蘋果公司(包括后來的NeXT)一直在使用GCC作為官方編譯器。作為開源社區中的標准編譯器,GCC始終表現良好。但是,Apple Inc.對編譯工具有其自己的要求。一方面,Apple Inc.為Objective-C語言(甚至后來的C語言)添加了許多新功能。但是,GCC開發人員不接受這些功能,因此分配了較低的優先級來支持這些功能。后來,它們被簡單地分為兩個分支以進行單獨的開發,因此Apple Inc.發布的GCC版本比正式版本要早得多。另一方面,GCC代碼是高度耦合的,很難單獨開發。此外,在更高版本中,代碼質量持續下降。但是,Apple Inc.所需的許多功能(例如改進的集成開發環境(IDE)支持)必須將GCC稱為模塊,但是GCC從未提供這種支持。此外,GCC運行時庫豁免從根本上限制了LLVM GCC的開發。同樣受許可證限制,Apple Inc.無法使用LLVM進一步提高基於GCC的代碼生成質量。因此,Apple Inc.決定從頭開始編寫C,C ++和Objective-C語言的前端Clang,以完全取代GCC。
顧名思義,Clang僅支持C,C ++和Objective-C。開發工作於2007年開始,C編譯器首次完成。 2009年,用於Objective-C雲的Clang會在生產環境中完全使用。對C ++的支持也在迅速發展。 Clang 3.3完全支持C ++ 11,Clang 3.4完全支持C ++ 14,Clang 5完全支持C ++ 17,當時所有這些都大大領先於GCC。

比較

與Clang和LLVM相比,GCC支持更多的傳統語言,例如Ada,Fortran和Go。
GCC支持較少流行的體系結構,並且比Clang和LLVM更早支持RISC-V。
與Clang和LLVM相比,GCC支持更多的語言擴展和更多的匯編語言功能。 GCC仍然是編譯Linux內核的唯一選擇。 盡管業界也報道了使用Clang和LLVM進行內核編譯的研究,但是如果不修改源代碼和編譯參數就無法編譯內核。
新興語言正在使用LLVM框架,例如Swift,Rust,Julia和Ruby。
Clang和LLVM比GCC更嚴格地遵守C和C ++標准。 在GCC升級過程中,不會發生GNU內聯和其他問題。
Clang還支持一些擴展,例如線程安全檢查的屬性。
Clang提供了其他有用的工具,例如用於靜態分析的scan-build和clang靜態分析器,用於語法分析的clang-format和clang-tidy以及編輯器插件Clangd。
Clang提供更准確和友好的診斷信息,並突出顯示錯誤消息,錯誤行,錯誤行提示和維修建議。 Clang將診斷信息視為功能。 診斷信息僅從GCC 5.0開始改進,並在GCC 8中逐漸成熟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM