GUN的全稱是GUN’s Not Unix。沒錯,Unix就是常常說到的Unix操做系統。很明顯這裏的意思是要跟Unix槓上了。它實際上是一個類Unix操做系統,實現了Unix系統的標準接口,目的就是用來取代Unix操做系統。前端
1983年,著名的黑客大師理查德·斯托曼提出了一項GUN計劃,內容就是開發一個徹底自由、開放源代碼的操做系統,以取代當時的Unix系統(當時的Unix系統是收費的商業軟件,而且只開放了部分源代碼)。這個操做系統就叫GUN,即GUN’s Not Unix的遞歸首字母縮寫。它的LOGO是一頭牛羚:程序員
其中有一個理由是「重現當年軟件界合做互助的團結精神」,就是說這份計劃由我的自願無償參與貢獻完成。那個年代開源計劃真的很盛行,程序員沒那麼多利益思想,只有一個共同的理想,作一件對人類有益的事,很偉大!向前輩們致敬!shell
GUN操做系統的內核是Hurd,這個內核至今都沒有完成。這也是GUN被人吐槽最多的地方。可是GUN計劃完成了不少其餘的功能,好比編譯器、文本編輯器、shell命令集等等,這些都是很是優秀的軟件工具,獲得了普遍的應用。其中就包括著名的GCC編譯器。編程
全稱叫GUN Compile Collection(GUN編譯器套裝),是一套GUN開發的編程語言編譯器。也是許多類Unix系統和MacOS操做系統的標準編譯器。最初GCC只支持C語言,後來擴展到C++、Objective-C、Java等其餘語言。後端
傳統編譯器是一個三層模型結構,包括前端編譯器、優化器、後端編譯器。前端主要負責源代碼的編譯解析、錯誤檢查以及生成抽象語法樹。優化器主要負責對語法樹的優化,以提升代碼的運行時間,好比消除冗餘計算等。後端主要負責將優化後的中間代碼轉成機器碼,這個階段會針對不一樣的機器架構、指令集優化以提升代碼的執行性能。數據結構
這個模型能夠針對不一樣的語言開發不用的前端,也能夠針對不用的機器架構開發使用不用的後端,只要保證中間代碼一致,就可使用同一套通用的優化方案。因此這個結構變成了下面這個樣子:架構
大多數的解釋器和編譯器都實現了這個模型,好比Java和.net的虛擬機、G++、GCC等。咱們着重說一下GCC,GCC支持了不少前端語言和後端架構,並且是開源的,因此獲得了不少編譯器愛好者支持和貢獻。可是它被設計成了一個總體的應用,致使它沒法被拆分紅單獨的庫來使用,有時候咱們只想使用它的某個特性,卻不得不引入整個編譯器代碼。編程語言
這裏面的緣由有不少,好比它內部使用了的大量的全局變量、不合理的數據結構設計、大量的宏定義以免重複編譯、代碼耦合度高、log不清晰不明確等等。編輯器
儘管這樣,GCC依然是如今跨平臺軟件編譯器的首選。
複製代碼
LLVM是Low Level Virtual Machine的首字母縮寫。 原本是一個低級別的虛擬機,但如今它是一種編譯器的基礎程序集合,包括一些LLVM中介碼、LLVM除錯工具等,這個名字已經不能表達它的真實含義了,僅僅是一種沿用名稱而已。它利用虛擬技術(中介碼)爲開發語言的編譯期、連接期、運行期以及閒置期提供了優化和改良。它的創始人就是大名鼎鼎的Chris Lattner。LLVM的幾大優點:模塊化
一、良好的架構設計,模塊複用性高
二、引入IR(Intermediate Representation)概念,兼容性高
三、錯誤和警告信息提示友好,日誌文件可讀性強
四、與目標語言和平臺無關
五、與IDE的配合良好
這裏解釋一下IR,LLVM編譯器在傳統的三層模型中加入了中介碼,前端完成源碼解析編譯後,轉成中介碼,LLVM編譯器針對中介碼進行優化和改良,而後將中介碼送入目標平臺編譯器生成目標代碼,整個編譯過程當中都是中介碼在參與,因此說跟目標語言和平臺無關。他們的結構以下:
蘋果原來默認的官方編譯器是GCC,隨着蘋果自家的語言Objective-C不斷髮展,加入不少新特性,致使GCC沒法知足蘋果的編譯要求。蘋果但願找到一個高效的、模塊化的、與IDE無縫結合的編譯器,因而在2005年請來了Chris Lattner負責他們的編譯器優化。Lattner徹底拋棄了GCC,而是從頭開始從新寫了一個前端編譯器就叫Clang。Clang只支持C家族的三門語言C、C++和Objective-C,相比於GCC,Clang的優點在於速度快、內存佔用體積小、模塊化、診斷信息可讀性強、設計清晰擴展性強等。
目前蘋果已經將官方的編譯器從GCC改成了Clang+LLVM。