版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、LLVM簡要概述LLVM簡要概述作者:趙玉武時間:2015-11-25目 錄1.LLVM簡介11.1.LLVM的主要項目有:11.2.發(fā)展歷程42.LLVM/Clang的使用42.1安裝42.2 GCC介紹61. GCC簡介72. GCC強大的背后83. GCC的多樣性93.1 PC開發(fā)93.2 嵌入式開發(fā)10How to set TCP_NODELAY on BSD socket on Solaris?112 Answers111.LLVM簡介LLVM 命名最早源自于底層虛擬機(Low Level Virtual Machine)的縮寫,由于命名帶來的混亂,目前L
2、LVM就是該項目的全稱。LLVM 核心庫提供了與編譯器相關(guān)的支持,可以作為多種語言編譯器的后臺來使用。能夠進行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化、代碼生成。LLVM的項目是一個模塊化和可重復(fù)使用的編譯器和工具技術(shù)的集合。LLVM是伊利諾伊大學(xué)的一個研究項目,提供一個現(xiàn)代化的,基于SSA的編譯策略能夠同時支持靜態(tài)和動態(tài)的任意編程語言的編譯目標(biāo)。自那時以來,已經(jīng)成長為LLVM的主干項目,由不同的子項目組成,其中許多正在生產(chǎn)中使用的各種 商業(yè)和開源的項目,以及被廣泛用于學(xué)術(shù)研究。1.1.LLVM的主要項目有:1、LLVM Core庫提供一個源代碼獨立于目標(biāo)優(yōu)化器,連同代碼生成的支持許多主流
3、的cpu(以及一些不太常見的!)這些庫是建立在一個指定好代碼表示稱為LLVM中間表示(“LLVM IR”)。LLVM核心庫良好的文檔記錄,它特別容易發(fā)明自己的語言(或港口現(xiàn)有的編譯器)使用LLVM作為優(yōu)化和代碼生成器.2、Clang是一個“LLVM本地”C / C+ / objective - C編譯器,旨在提供非??焖倬幾g(如呢3 x速度比GCC當(dāng)編譯objective - c代碼在調(diào)試配置),非常有用的錯誤和警告消息構(gòu)建水平重要來源,并提供一個平臺工具。Clang Static Analyzer是一種工具,可以自動發(fā)現(xiàn)bug的代碼,并且是一個很好的例子的工具,它可以使用Clang前端作為一
4、個庫來解析C / C+代碼。3、dragonegg集成了LLVM優(yōu)化和帶有GCC解析器的代碼生成器。這允許LLVM編譯Ada、Fortran和其他支持GCC編譯器編譯的前端語言,和訪問C功能不支持的Clang。4、LLDB項目建立在LLVM提供的庫和Clang提供本地調(diào)試器。它使用Clang AST和表達式解析器,LLVM JIT,LLVM反匯編器等。它也是超級快的和更多的內(nèi)存效率比GDB在加載符號。5、libc + +和libc + + ABI項目提供了一個標(biāo)準(zhǔn)的符合性和高性能的c+標(biāo)準(zhǔn)庫的實現(xiàn),包括完全支持c+ 11。6、compiler-rt項目提供了高調(diào)諧低級代碼生成器的實現(xiàn)支持的活動
5、,如“_fixunsdfdi”和其他調(diào)用時生成一個目標(biāo)沒有短的本地指令序列來實現(xiàn)核心紅外操作。它還提供了運行時庫的實現(xiàn)動態(tài)測試工具等AddressSanitizer,ThreadSanitizer,MemorySanitizer,DataFlowSanitizer.7、OpenMP子項目提供了一個OpenMP運行時使用OpenMP實現(xiàn)的Clang。8、 vmkit項目的實現(xiàn)Java和.NET虛擬機是建立在LLVM技術(shù)。9、Polly項目實現(xiàn)一套緩存位置優(yōu)化以及auto-parallelism和向量化使用多面體模型。10、libclc項目旨在實現(xiàn)OpenCL標(biāo)準(zhǔn)庫。11、Klee項目實現(xiàn)了一個“
6、具有象征意義的虛擬機”使用一個定理驗證通過程序來評估所有動態(tài)路徑為了找到缺陷和證明函數(shù)的性能。Klee的一個主要特征是, 如果它檢測到一個bugs,它能產(chǎn)生一個testcase(測試用例)。12、SAFECode項目是一個內(nèi)存安全C / C+編譯器程序。這個工具代碼中帶有運行時檢查,檢測內(nèi)存中是否有安全性錯誤(例如:緩沖區(qū)溢出)。它可以用來保護軟件免受安全攻擊,也可以用作安全錯誤內(nèi)存調(diào)試工具像Valgrind。13、lld項目旨在Clang / llvm內(nèi)置鏈接器。目前,Clang必須調(diào)用系統(tǒng)鏈接器來產(chǎn)生可執(zhí)行文件。除了官方LLVM的子項目,有各種各樣的其他項目使用組件LLVM的各種任務(wù)。通過
7、這些外部項目可以使用LLVM編譯Ruby,Python, Haskell,Java,D語言,PHP,Pure,Lua和許多其他語言。LLVM的主要優(yōu)勢是它的多功能性,靈活性,和可重用性,這就是為什么它被用于多種不同的任務(wù):從做輕量級JIT編譯Lua等嵌入式語言Fortran編譯代碼的大規(guī)模的超級電腦。一切,LLVM具有廣泛和友好的社區(qū)的人建造偉大的低級工具很感興趣。如果你有興趣參與,首先是瀏覽LLVM的博客并報名參加LLVM開發(fā)者郵件列表。有關(guān)如何在一個補丁發(fā)送的信息,提交訪問,和版權(quán)和許可的主題,請參閱LLVM開發(fā)策略。1.2.發(fā)展歷程1、2000年LLVM開始開發(fā)。2、2005年Apple
8、雇了Chris Lattner,LLVM也相當(dāng)于成了Apple的官方支持的編譯器。3、Apple已經(jīng)將它用在OpenCL的流水線優(yōu)化,Xcode已經(jīng)能使用llvm-gcc編譯代碼。4、2011-12-02 LLVM3.0發(fā)布,LLVM包括了一系列子項目,它們也同步發(fā)布了新版本,如C/C+/Objective-C前端Clang 3.0改進了C+程序編譯支持;改進C+ 2011標(biāo)準(zhǔn)支持;實現(xiàn)支持即將發(fā)布的C1x標(biāo)準(zhǔn)的某些特性;更快的生成代碼,更快的編譯,等等。3 5、LLVM榮獲2012年ACM軟件系統(tǒng)獎4 2.LLVM/Clang的使用2.1安裝方式一:采用源碼編譯方式到官方
9、網(wǎng)站下載()方式二:使用svn客戶端從開發(fā)平臺上下載1) 創(chuàng)建 LLVM 源代碼存放目錄 (llvm_source) $mkdir p llvm_source 2 )進入創(chuàng)建的目錄 $cd llvm_source 3 )獲取 LLVM $svn co /svn/llvm-project/llvm/trunk llvm 4 )獲取 Clang $cd llvm/tools $svn co /svn/llvm-project/cfe/trunk clang 方式三:使用編譯好的二進制文件下載clang+llvm-3.2-x86-linux-u
10、buntu-12.04.tar1)、解壓 tar xzvf clang+llvm-3.2-x86-linux-ubuntu-12.04.tar2)、cd clang+llvm-3.2-x86-linux-ubuntu-12.043)、將目錄/clang+llvm-3.2-x86-linux-ubuntu-12.04/bin配置到環(huán)境變量中Vi /etc/profileexport clang_llv=/clang+llvm-3.2-x86-linux-ubuntu-12.04/binexport PATH=$clang_llv:$PATH編寫程序進行測試:使用一個常見的 hello world
11、 程序來演示 Clang。在這里我們把這個文件命名為 test.c。它的內(nèi)容如下: #include <stdio.h> int main(int argc, char *argv) printf("hello worldn"); return 0; 您可以使用任何編輯器輸入并生成這個文件。有了這個文件以后,您可以試試以下命令行的命令: $ clang -help ( 查看幫助信息 ) $ clang test.c -fsyntax-only ( 檢查語法和詞法正確性 ) $ clang test.c -S -emit-llvm -o test.bc ( 生成優(yōu)
12、化前的 llvm bitcode) $ clang test.c -S -emit-llvm -o test.bc -O3 ( 生成優(yōu)化的 llvm bitcode) $ clang test.c -S -O3 -o test ( 生成可執(zhí)行代碼 ) 與 GCC 相比,Clang 的一大優(yōu)點是更加清晰明確的錯誤提示。您不妨嘗試著刪除"printf("hello worldn");"語句后面的分號。編譯這個程序,GCC 給出的錯誤信息將是: test.c: In function 'main': test.c:6:2: error: exp
13、ected '' before 'return'而 Clang 給出的錯誤信息則是: test.c:5:26: error: expected '' after expression printf("hello world.n")2.2 GCC介紹GCC,全稱GNU Compiler Collection,是一套GNU開發(fā)的編譯器環(huán)境,它的創(chuàng)始人便是大名鼎鼎的Richard.M.Stallman。最初GCC剛開始開發(fā)時,它還叫做GNU C Compiler,隨著開發(fā)的深入,GCC很快得到了擴展,不僅可以支持C語言,還可以處理C
14、+,Pascal,Object-C,Java以及Ada等其他語言。目前,GCC不僅是GNU的官方編譯器,也成為編譯和創(chuàng)建其他操作系統(tǒng)的編譯器,包括BSD家族以及MAC OS X等。另外,GCC也是跨平臺交叉編譯的首選,它不僅支持Intel的x86系列,同時也支持MIPS,ARM,PowerPC,SPARC等等處理器??梢赃@么說,即使GCC不是世界上效率最高的編譯器,它也一定是世界上最全面的編譯器。1. GCC簡介我們先回到一個常識性的問題,什么是編譯器呢?簡單地說,編譯器可以看作是一個語言翻譯器。就像把中文翻譯成英語一樣,編譯器可以把高級語言翻譯成計算機能夠執(zhí)行的機器語言。這樣看來,GCC可以
15、算得上是一個精通多國語言的高級翻譯官了。最簡單的GCC使用指令如下所示:gcc hello.c -o hello GCC接受hello.c作為輸入,最后產(chǎn)生目標(biāo)可執(zhí)行代碼hello。這個簡單的流程實際上經(jīng)歷了很多步驟,如下圖所示:雖然我們只用了一條命令就完成了編譯,但實際上gcc命令依次呼叫了cpp,gcc自己,gas以及l(fā)d來進行完整的編譯流程,最后生成最終的可執(zhí)行文件hello。下面我們看一下分解動作:cpp hello.c > hello.igcc -S hello.ias &
16、#160;hello.s -o hello.old -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.4.5 hello.o -lgcc -lgcc_eh -lc /usr/lib/gcc/i686-linux-gnu/4.4.5
17、/crtend.o /usr/lib/crtn.o -o hello 看完這些步驟有沒有暈頭轉(zhuǎn)向的感覺呢?對于普通的用戶來說,還是讓GCC幫我們做這些事情比較好。對于如何學(xué)習(xí)使用GCC,可以參考GCC官方的手冊,如果大家覺得官方的手冊太羅嗦,我這里推薦一本GCC的入門書籍An Introduction to GCC,這本書詳盡的介紹了GCC的使用方法,內(nèi)容淺顯易懂,很適合初學(xué)者。 2. GCC強大的背后學(xué)過編譯原理這門課程的同學(xué)對下面這副圖應(yīng)該很熟悉,這是經(jīng)典的編譯流程。GCC作為經(jīng)典的編譯器,自然也是遵循這個教科書流程(實際GCC的處理
18、更復(fù)雜點,但本質(zhì)上是一樣的)。我們先簡化一下上面這幅圖,以中間代碼為分界,前面的詞法分析、語法分析、語義分析我們把它稱之為前端處理,后面的優(yōu)化和目標(biāo)代碼生成我們稱之為后端處理。試想一下,是否可以為不同的高級語言單獨寫一個前端,然后為不同的處理器架構(gòu)單獨寫一個后端呢?GCC基本上也是這么實現(xiàn)的,不過不要誤會,并沒有一個統(tǒng)一的gcc執(zhí)行程序能夠處理如此多的前端和后端,每個語言的編譯器都是一個獨立的程序(如C語言的編譯器是gcc,C+的編譯器是g+),而不同的后端也要對應(yīng)不同的可執(zhí)行程序。你可以下載單獨的一份GCC源代碼,通過不同的configure來生成自己需要的編譯器。而且,編譯器的實現(xiàn)也比上圖
19、要復(fù)雜的多,前端的主要功能是產(chǎn)生一個可供后端處理的語法樹,而語法樹結(jié)構(gòu)實際上很難與處理器架構(gòu)脫鉤,這些都是編譯器應(yīng)用中需要解決的問題。GCC強大的真正原因是什么?是因為它支持了眾多的前端和后端嗎?這些都不過是一個表象而已。GCC是一款真正自由的編譯器,我們可以隨時把代碼拿過來修改以實現(xiàn)自己需要的功能。如果你的硬件平臺增加了一些指令,而普通的編譯器并不能產(chǎn)生這些指令怎么辦?在GCC后端添加這些指令吧。如果你覺得C語言用的不太順手,想給它添加一些功能怎么辦?修改GCC的前端吧。因為有了GCC,我們才擁有這些自由,以及迅速實現(xiàn)自己想法的能力,而這些才是GCC強大背后的基礎(chǔ)。2010年1月份的時候,G
20、oogle的Go語言前端被允許進入GCC編譯器家族,GCC更加強大了。 3. GCC的多樣性GCC因為其靈活性被應(yīng)用到了很多領(lǐng)域和系統(tǒng),從PC上的開發(fā)到嵌入式開發(fā),都可以見到GCC的影子。 3.1 PC開發(fā)我們先看看PC。MAC自從投入Intel的懷抱,是否也可以看作是一種PC呢?LinuxLinux系統(tǒng)應(yīng)該是GCC的主戰(zhàn)場,但也是最沒必要去說的一個系統(tǒng),除了GCC,難道我們還有更好的選擇嗎?Linux內(nèi)核、Apache服務(wù)器、MySQL數(shù)據(jù)庫,等等一系列偉大的作品都是通過GCC來構(gòu)建的,GCC可以說是GNU/Linux系統(tǒng)的基石。MAC OS XMAC OS
21、 X也是GCC的重度用戶,其應(yīng)用程序開發(fā)環(huán)境Cocoa就是使用的GCC,所以在MAC OS X下開發(fā)也是離不開GCC的。Windows現(xiàn)在在Windows下開發(fā)C/C+程序一般都是用微軟的編譯器,當(dāng)年的Borland已經(jīng)成為傳說。但是如果你不想付錢的話,也可以考慮Windows下的GCC。在Windows下體驗GCC最常用的有兩種方式:一是在Cygwin下使用GCC,另外一種是使用MinGW。Cygwin是一個自由軟件的集合,最初由Cygnus Solutions開發(fā),目的是在Windows系統(tǒng)上運行類Unix的軟件。通過Cygwin編譯的程序可以在Windows上運行,但必須使用cygwin
22、.dll。MinGW(Minimalist GNU for Windows),是將GNU開發(fā)工具移植到Windows平臺的產(chǎn)物,包括一系列頭文件、庫和可執(zhí)行文件,用MinGW開發(fā)的程序不需要額外的第三方DLL就可以直接在Windows上運行。Nokia的圖形開發(fā)包QT在Windows下就是調(diào)用MinGW來編譯的。DOS在DOS系統(tǒng)下也是可以用GCC的,國內(nèi)的DOS開發(fā)者可能更熟悉Turbo C或者Open Watcom,GCC的DOS版本DJGPP其實也是32位DOS程序開發(fā)的主流環(huán)境之一。最初DJGPP的發(fā)起人DJ Delorie曾經(jīng)詢問過Richard Stallman,F(xiàn)SF是否考慮過把
23、GCC移植到MS-DOS下,當(dāng)時Richard的回答是GCC太龐大,而MS-DOS只不過是個16位的操作系統(tǒng),所以官方并沒有考慮這件事。DJ Delorie并沒有因此而退縮,最終給我們帶來了這個優(yōu)秀的開發(fā)平臺。DJGPP剛開始開發(fā)時叫做djgcc,在引入了C+之后改為現(xiàn)在這個名字(DJ's GNU Programming Platform)。 3.2 嵌入式開發(fā)對于嵌入式開發(fā)領(lǐng)域來說,因為開發(fā)板的能力限制,是無法運行編譯環(huán)境的,這樣就需要在PC上通過交叉編譯來生成目標(biāo)可執(zhí)行程序,GCC的高度靈活性在嵌入式開發(fā)上發(fā)揮了極大的作用。Android看看當(dāng)今最火的移動平
24、臺Android,就是完全用GCC來構(gòu)建的,請注意,這里指的不是Android應(yīng)用程序,Android下的應(yīng)用程序是運行在Dalvik虛擬機上的Java程序。iOSApple的iOS應(yīng)用程序開發(fā)也是用Cocoa來進行,這怎么會離開GCC呢?MeeGo/Symbian在Apple和Google的沖擊下,Nokia似乎已經(jīng)日薄西山了,但對于中國國情來說,真的是這樣嗎?iPhone高高在上,擁有者只會是少數(shù),Google退出中國之后,Android Market很難在國內(nèi)有所作為,再加上Nokia手機一貫皮實的口碑,現(xiàn)在的Symbian以及將來的MeeGo的保有量應(yīng)該不會低。Nokia已經(jīng)把Symbian和MeeGo的開發(fā)環(huán)境統(tǒng)一到QT上了,這里依然是GCC的一畝三分田。 GCC是強大的,但它并不是一個人在戰(zhàn)斗,在它的背后站著GNU工具鏈,包括make,GCC,Binutils,GDB等一系列工具,這些工具之間是相輔相成的,只有把它們組合起來使用才能發(fā)揮其最大的威力。 How to set TCP_NODELAY on BSD socket on Solaris? I am trying to turn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 變更合同條款模板
- 北京機動車抵押合同模板
- 服裝售后服務(wù)情景演練
- 統(tǒng)編版2024-2025學(xué)年四年級語文上學(xué)期第三次月考質(zhì)量檢測(原卷版+ 解析版 考查范圍:第五六單元)
- 顱腦外傷急救治療方法
- 糖尿病的常用藥物
- 環(huán)境應(yīng)急預(yù)案匯報
- 預(yù)防傳染病和艾滋病
- 電氣機械及器材行業(yè)相關(guān)投資計劃提議范本
- 【初中地理】世界主要氣候類型第一課時-2024-2025學(xué)年七年級地理上學(xué)期(湘教版2024)
- YY/T 0299-2022醫(yī)用超聲耦合劑
- YY/T 0471.3-2004接觸性創(chuàng)面敷料試驗方法 第3部分:阻水性
- GB/T 1958-2017產(chǎn)品幾何技術(shù)規(guī)范(GPS)幾何公差檢測與驗證
- GB/T 193-2003普通螺紋直徑與螺距系列
- GA/T 798-2008排油煙氣防火止回閥
- 催乳穴位及手法課件
- 9《 復(fù)活》課件17張PPT 統(tǒng)編版高中語文選擇性必修上冊第三單元
- 護士注冊健康體檢表下載【可直接打印版本】
- 農(nóng)田雜草識別與防除課件
- 新《刑法-刑罰》考試題庫大全(含詳解)
- 客戶個人信息保護突發(fā)事件應(yīng)急預(yù)案
評論
0/150
提交評論