GNU
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號,直達精彩內(nèi)容來源|技術(shù)讓夢想更偉大整理?|?李肖遙很多時候,出現(xiàn)一些類似GNU,GCC,CLANG,LLVM等與編譯器有關(guān)的名詞的時候,都不太清楚它到底是干嘛的,理解這些東西后,對于xcode中很多配置型的需求修改起來都會得心應(yīng)手,因此有必要了解透徹他們直接的關(guān)...
關(guān)注、星標(biāo)公眾號,直達精彩內(nèi)容
GCC接受hello.c作為輸入,最后產(chǎn)生目標(biāo)可執(zhí)行代碼hello,這個簡單的流程實際上經(jīng)歷了很多步驟。
1,GNU
先看看wiki百科上的官方說明:
“GNU,名稱來自Gnu's Not Unix"的縮寫,一個類UNIX的操作系統(tǒng),由GNU計劃推動,目標(biāo)在于創(chuàng)建一個完全兼容于UNIX的自由軟件環(huán)境?!?由于當(dāng)時UNIX系統(tǒng)是商業(yè)軟件,是收費的,而且有一部分源碼是沒有開放的,所以在1983年,理查德·斯托曼提出GNU計劃,希望發(fā)展出一套完整的開放源代碼操作系統(tǒng)來取代Unix,計劃中的操作系統(tǒng),名為GNU。
總結(jié)
GNU計劃本來是為了開發(fā)一個自由系統(tǒng)來取代UNIX的,但是由于開發(fā)的內(nèi)核hurd一直不怎么樣,這個系統(tǒng)至今都沒出穩(wěn)定版本,然而GNU計劃中開發(fā)的其他一些自由軟件,比如GCC編譯器,卻非常的好,在移植到各大操作系統(tǒng)上一直廣泛使用至今。
注意一點
文中說的自由軟件,千萬別與免費軟件混淆了,自由是說你可以自由的使用,當(dāng)然前提是獲得了源碼才能自由的使用。
2,GCC
先看看wiki百科上的官方說明:
“ GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由GNU開發(fā)的編程語言編譯器。它是一套以GPL及LGPL許可證所發(fā)布的自由軟件,也是GNU項目的關(guān)鍵部分,亦是自由的類Unix及蘋果電腦Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。GCC(特別是其中的C語言編譯器)也常被認為是跨平臺編譯器的事實標(biāo)準(zhǔn)。GCC原名為GNU C語言編譯器(GNU C Compiler),因為它原本只能處理C語言。GCC很快地擴展,變得可處理C 。之后也變得可處理Fortran、Pascal、Objective-C、Java、Ada,以及Go與其他語言。
總結(jié)
mac之前的cocoa框架便是用GCC編譯的,所以ios與mac os都是默認使用的GCC編譯器(現(xiàn)在是clang與llvm,下面會有介紹)
3,Clang
先看看wiki百科上的官方說明:http://zh.wikipedia.org/wiki/Clang
“ Clang 是一個C、C 、Objective-C和Objective-C 編程語言的編譯器前端。它采用了底層虛擬機(LLVM)作為其后端。它的目標(biāo)是提供一個GNU編譯器套裝(GCC)的替代品。Clang項目包括Clang前端和Clang靜態(tài)分析器等。
總結(jié)
GCC目前作為跨平臺編譯器來說它的兼容性無異是最強的,兼容最強肯定是以犧牲一定的性能為基礎(chǔ)的,蘋果為了提高性能,因此專門針對mac系統(tǒng)開發(fā)了專用的編譯器clang與llvm,clang用于編譯器前段,llvm用于后端。
3,LLVM
先看看wiki百科上的官方說明:http://zh.wikipedia.org/wiki/LLVM
“ LLVM,它是一個編譯器的基礎(chǔ)建設(shè),以C 寫成。它是為了任意一種編程語言寫成的程序,利用虛擬技術(shù),創(chuàng)造出編譯時期,鏈結(jié)時期,運行時期以及“閑置時期”的優(yōu)化。在Xcode4之后,蘋果將Xcode的默認編譯器變成了LLVM,為什么呢?
LLVM歷史
Apple(包括中后期的NeXT) 一直使用GCC作為官方的編譯器。GCC作為開源世界的編譯器標(biāo)準(zhǔn)一直做得不錯,但Apple對編譯工具會提出更高的要求。
Clang歷史
Apple吸收Chris Lattner的目的要比改進GCC代碼優(yōu)化宏大得多——GCC系統(tǒng)龐大而笨重,而Apple大量使用的Objective-C在GCC中優(yōu)先級很低。此外GCC作為一個純粹的編譯系統(tǒng),與IDE配合得很差。加之許可證方面的要求,Apple無法使用LLVM 繼續(xù)改進GCC的代碼質(zhì)量。于是,Apple決定從零開始寫 C、C 、Objective-C語言的前端 Clang,完全替代掉GCC。
更詳細的原因:
Xcode編譯器介紹:
總結(jié):
因為GCC的編譯器已經(jīng)慢慢無法滿足蘋果的需求,因此,蘋果開發(fā)了Clang與LLVM來完全取代GCC,Xcode4之后,蘋果的默認編譯器已經(jīng)是LLVM了。Clang作為編譯器前端,LLVM作為編譯器后端。
4,編譯器相關(guān)知識
問題:蘋果以clang作為編譯器前端,llvm作為編譯器后端,那么編譯器的前后端到底是什么東西呢?
GCC接受hello.c作為輸入,最后產(chǎn)生目標(biāo)可執(zhí)行代碼hello,這個簡單的流程實際上經(jīng)歷了很多步驟。





