LLVM教程(一)-- LLVM的簡介

一、介紹

LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time),對開發者保持開放,併兼容已有腳本。LLVM計劃啓動於2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持開展。2006年Chris Lattner加盟Apple Inc.並致力於LLVM在Apple開發體系中的應用。Apple也是LLVM計劃的主要資助者。

LLVM 命名最早源自於底層虛擬機(Low Level Virtual Machine)的縮寫,由於命名帶來的混亂,目前LLVM就是該項目的全稱。LLVM 核心庫提供了與編譯器相關的支持,可以作爲多種語言編譯器的後臺來使用。能夠進行程序語言的編譯期優化、鏈接優化、在線編譯優化、代碼生成。LLVM的項目是一個模塊化和可重複使用的編譯器和工具技術的集合。LLVM是伊利諾伊大學的一個研究項目,提供一個現代化的,基於SSA的編譯策略能夠同時支持靜態和動態的任意編程語言的編譯目標。自那時以來,已經成長爲LLVM的主幹項目,由不同的子項目組成,其中許多正在生產中使用的各種 商業和開源的項目,以及被廣泛用於學術研究。

二、子項目

LLVM的主要子項目:

1 LLVM核心庫提供了一個現代的源和目標無關的優化器,以及對許多流行的CPU(以及一些不太常見的CPU)的代碼生成支持。這些庫建立在一個良好指定的代碼表示,稱爲LLVM中間表示 (“LLVM IR”)。 LLVM核心庫有詳細的文檔,特別容易發明自己的語言(或端口現有的編譯器)來使用LLVM作爲優化器和代碼生成器。

2 Clang是一個“LLVM本地”C / C ++ / Objective-C編譯器,其目的是提供驚人的快速編譯(例如,在調試配置中編譯Objective-C代碼時,比GCC快3倍),非常有用的錯誤和警告消息,以及 爲構建優秀的源代碼級工具提供了一個平臺。 Clang靜態分析器是一種可以自動在代碼中查找錯誤的工具,也是使用Clang前端作爲解析C / C ++代碼的庫而構建的工具的一個很好的例子。

3 dragonegg將LLVM優化器和代碼生成器與GCC解析器集成。 這允許LLVM編譯Ada,Fortran和GCC編譯器前端支持的其他語言,以及訪問Clang不支持的C功能。

4 LLDB項目建立在由LLVM和Clang提供的庫上,以提供一個偉大的本地調試器。 它使用Clang AST和表達式解析器,LLVM JIT,LLVM反彙編器等,以便它提供一個“只工作”的經驗。 在加載符號時,它比GDB的速度更快,記憶效率也更高。

5 libc ++和libc ++ ABI項目提供了C ++標準庫的標準一致和高性能實現,包括對C ++ 11的完全支持。

6 compiler-rt項目提供低級代碼生成器支持例程(如“__fixunsdfdi”)的高度調優的實現,以及當目標沒有短序列的本地指令以實現核心IR操作時生成的其他調用。 它還爲動態測試工具(如AddressSanitizer,ThreadSanitizer,MemorySanitizer和DataFlowSanitizer)提供運行時庫的實現。

7 OpenMP子項目提供了與Clang中的OpenMP實現一起使用的OpenMP運行時。

8 vmkit項目是基於LLVM技術構建的Java和.NET虛擬機的實現。

9 polly項目使用多面體模型實現一組緩存位置優化以及自動並行性和向量化。

10 libclc項目旨在實現OpenCL標準庫。

11 lee項目實現了一個“符號虛擬機”,它使用定理證明程序來嘗試通過程序來評估所有動態路徑,以便發現錯誤並證明函數的屬性。 klee的一個主要特點是它可以在它檢測到錯誤的情況下產生一個測試用例。

12 SAFECode項目是一個用於C / C ++程序的內存安全編譯器。 它使用運行時檢查來檢測代碼,以在運行時檢測存儲器安全錯誤(例如,緩衝區溢出)。 它可以用於保護軟件免受安全攻擊,也可以用作內存安全錯誤調試工具,如Valgrind。

13 lld項目旨在成爲clang / llvm的內置鏈接器。 目前,clang必須調用系統鏈接器來產生可執行文件。

除了LLVM的官方子項目,還有各種各樣的其他項目,它們使用LLVM的組件來完成各種任務。 通過這些外部項目,您可以使用LLVM編譯Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和許多其他語言。 LLVM的一個主要優勢是其多功能性,靈活性和可重用性,這就是爲什麼它被用於各種各樣的不同任務:從輕量級JIT編譯嵌入式語言如Lua到編譯Fortran代碼爲大規模超級 電腦。

三、參考資料

http://llvm.org/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章