LLVM和Clang背后的故事
LLVM是Apple官方支持的編譯器,而該編譯器的前端是Clang,這兩個(gè)工具都被集成到了Xcode里面。在這篇文章中,我們來(lái)了解一下LLVM和Clang背后的故事。
在很長(zhǎng)一段時(shí)間里,Apple一直使用GCC作為官方的編譯器。GCC作為開(kāi)源世界的編譯器標(biāo)準(zhǔn)一直做得不錯(cuò),但Apple對(duì)編譯工具提出了更高的要求。
仗著自己在開(kāi)源社區(qū)的地位,GCC 開(kāi)發(fā)者對(duì)Apple的Objective-C語(yǔ)言新增的很多特性不予理睬,甚至當(dāng)Apple想做的很多功能需要用模塊化的方式來(lái)調(diào)用 GCC時(shí),GCC卻一直不給做。一般的公司遇到這種情況,可能都有些受不了,何況是喬布斯領(lǐng)導(dǎo)的Apple呢?
與GCC的不和讓Apple一直在尋找一個(gè)高效的、模塊化的、協(xié)議更放松的開(kāi)源的編譯器替代品。最終,Apple相中了Chris Lattner的LLVM。
現(xiàn)在依然就職于Apple的Chris Lattner可是一位大神,他于2000年畢業(yè)于俄勒岡州波特蘭大學(xué)計(jì)算機(jī)科學(xué)專(zhuān)業(yè),同年前往UIUC(伊利諾伊大學(xué)厄巴納香檳分校),攻讀計(jì)算機(jī)科學(xué)碩士和博士學(xué)位。在UIUC期間,他的GPA是4.0(滿(mǎn)分),并不斷地研究探索關(guān)于編譯器的未知領(lǐng)域,發(fā)表了多篇論文。在碩士畢業(yè)論文中,他提出了一套完整的在編譯時(shí)、鏈接時(shí)、運(yùn)行時(shí)甚至是在閑置時(shí)優(yōu)化程序的編譯思想,奠定了LLVM的基礎(chǔ)。
LLVM在Chris Lattner念博士時(shí)更加的成熟。首先,LLVM使用GCC作為前端來(lái)對(duì)用戶(hù)程序進(jìn)行語(yǔ)義分析產(chǎn)生 IF(Intermidiate Format),然后,LLVM使用分析結(jié)果完成代碼優(yōu)化和生成。這項(xiàng)研究讓Chris Lattner在2005年畢業(yè)的時(shí)候,成為了小有名氣的編譯器專(zhuān)家。他也因此早早地被Apple相中,成為其編譯器項(xiàng)目的骨干。
進(jìn)入Apple之后,Chris Lattner首先在OpenGL小組做代碼優(yōu)化,把LLVM運(yùn)行時(shí)的編譯架在OpenGL棧上,這樣OpenGL棧能夠產(chǎn)出更高效率的圖形代碼。這個(gè)強(qiáng)大的OpenGL實(shí)現(xiàn)被用在了后來(lái)發(fā)布的Mac OS X 10.5上。同時(shí),LLVM 的鏈接優(yōu)化被直接加入到Apple的代碼鏈接器上。
一個(gè)好的工具,必須要有用武之地。幾年之后,LLVM的機(jī)會(huì)就來(lái)了。Mac OS X 10.6 Snow Leopard的新功能,完全得益于LLVM的技術(shù),而這一個(gè)版本,也是將LLVM推向真正成熟的重大機(jī)遇。
“一個(gè)籬笆三個(gè)樁,一個(gè)好漢三個(gè)幫”,LLVM能夠?qū)崿F(xiàn)很多華麗的功能,要?dú)w功于LLVM自身的新前端——Clang。
GCC系統(tǒng)龐大而笨重,因此,Apple決定從零開(kāi)始寫(xiě)C、C++、Objective-C語(yǔ)言的前端Clang,以求完全替代掉GCC。
Clang于2007年開(kāi)始開(kāi)發(fā),C編譯器最早完成,在2009年的時(shí)候,Objective-C編譯器已經(jīng)完全可以用于生產(chǎn)環(huán)境,而在一年之后,Clang基本實(shí)現(xiàn)了對(duì)C++編譯的支持。
Clang一個(gè)重要的特性是編譯快速、占內(nèi)存少,而代碼質(zhì)量還比GCC來(lái)得高。得益于本身健壯的架構(gòu)和Apple的大力支持,Clang越來(lái)越全能,支持的項(xiàng)目越來(lái)越多,如Mac OS X 10.6時(shí)代的Xcode和Interface Builder等,皆由Clang編譯。Clang的加入也代表著LLVM真正走向成熟。
此外,Clang有一個(gè)重要的衍生項(xiàng)目是靜態(tài)分析工具,能夠通過(guò)自動(dòng)分析程序的邏輯,在編譯時(shí)就找出程序可能的bug,這個(gè)功能叫做ARC。ARC的實(shí)現(xiàn)讓當(dāng)時(shí)的廣大開(kāi)發(fā)者們大為驚愕。
除了LLVM核心和Clang以外,LLVM還包括一些重要的子項(xiàng)目,比如一個(gè)原生支持調(diào)試多線(xiàn)程程序的調(diào)試器LLDB和一個(gè)C++的標(biāo)準(zhǔn)庫(kù)libstdc++。不光是Apple,很多的項(xiàng)目和編程語(yǔ)言都從LLVM中取得了關(guān)鍵性的技術(shù)。
從LLVM的發(fā)展歷程中可以看到,LLVM在短短五年內(nèi)(2005年-2010年)取得了快速的發(fā)展,這充分反映了Apple對(duì)于產(chǎn)品技術(shù)的遠(yuǎn)見(jiàn)和超強(qiáng)的執(zhí)行力。也正是因?yàn)檫@樣,LLVM一躍成為了最領(lǐng)先的開(kāi)源軟件技術(shù)之一。而大神Chris Lattner也在2010年贏得了Programming Languages Software Award(程序設(shè)計(jì)語(yǔ)言軟件獎(jiǎng))。
大神的故事還沒(méi)有結(jié)束,Chris Lattner于2010年7月開(kāi)始著手Swift編程語(yǔ)言的設(shè)計(jì)工作,他實(shí)現(xiàn)了該語(yǔ)言的大部分基礎(chǔ)架構(gòu)。2011年末,又有幾位大神加入了該項(xiàng)目。2013年7月,Swift項(xiàng)目成為了蘋(píng)果開(kāi)發(fā)者工具部門(mén)的主要焦點(diǎn)。在2014年6月2日,Swift語(yǔ)言正式發(fā)布,Chris Lattner及其工作又一次贏得了廣大開(kāi)發(fā)者們驚愕的目光。目前,Chris Lattner是蘋(píng)果公司開(kāi)發(fā)者工具部門(mén)的主管,領(lǐng)導(dǎo)Xcode、Instruments和編譯器團(tuán)隊(duì)。
【本文是51CTO專(zhuān)欄作者周兆熊的原創(chuàng)文章,作者微信公眾號(hào):周氏邏輯(logiczhou)】