LLVM
百度百科
LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用于優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閑時間(idle-time),對開發者保持開放,并兼容已有腳本。
LLVM 核心庫提供了與編譯器相關的支持,可以作為多種語言編譯器的后臺來使用。能夠進行程序語言的編譯期優化、鏈接優化、在線編譯優化、代碼生成。LLVM的項目是一個模塊化和可重復使用的編譯器和工具技術的集合。
優點:
- 語言無關的中間代碼()
1、LLVM能夠將不同的語言相互連結起來;也使得LLVM能夠緊密地與IDE交互和集成。
2、發布中間代碼而非目標代碼能夠在目標系統上更好地發揮其潛能而又不傷害可調試性(i.e. 在目標系統上針對本機的硬件環境產生目標代碼,但又能夠直接通過中間代碼來進行行級調試)
這里再看看中間代碼是個啥:
中間語言(中間代碼)是一種面向語法,易于翻譯成目標程序的源程序的等效內部表示代碼。其可理解性及易于生成目標代碼的程度介于源語言和目標語言之間。
中間語言與具體機器特性無關,一種中間語言可以為生成多種不同型號的目標機的目標代碼服務。
可對中間語言進行與機器無關的優化,有利于提高目標代碼的質量。
把源程序映射成中間代碼表示,再映射成目標代碼的工作分在幾個階段進行,使編譯算法更加清晰
常用的中間語言有逆波蘭表示、四元式、三元式和樹表示。
mysql執行計劃樹我覺得就是樹表示。
- 作為工具和函數庫
使用LLVM提供的工具可以比較容易地實現新的編程語言的優化編譯器或VM,或為現有的編程語言引入一些更好的優化/調試特性。
LLVM架構
不同的前端后端使用統一的中間代碼LLVM IR。
如果需要支持一種新的編程語言,那么只需要實現一個新的前端。如果需要支持一種新的硬件設備,那么只需要實現一個新的后端。
優化階段是一個通用的階段,它針對的是統一的LLVM IR,不論是支持新的編程語言,還是支持新的硬件設備,都不需要對優化階段做修改。
Codegen
來自知乎
CodeGen是在協同開發環境中工作的軟件開發人員可以用來生成源代碼的工具.在生成代碼之前,開發人員必須聲明定義如何創建給定源代碼的規則。這些規則在模板文件中定義。CodeGen解釋開發人員在模板文件中定義的代碼和指令,以便生成有用的輸出。CodeGen還需要另一個信息源來定義要生成的內容的上下文。
每次開發人員使用CodeGen生成代碼時,他們通常提供兩個主要信息:1. 元數據的來源,通常是存儲庫結構的名稱。2. 定義要創建的內容的規則的模板文件的名稱。每次CodeGen生成一個輸出文件時,它通常做三件事:1. 從元數據源(通常是存儲庫結構)讀取信息。2. 從模板讀取規則。3. 將規則與元數據合并以創建輸出文件。
那么顯然上述的闡述并不能給我帶來直觀印象。
下面這個解釋感覺更加直觀。
Code Generator 是一個翻譯框架,這個框架提供了把LLVM IR翻譯到機器碼或者匯編碼的方法。
它總共包括六部分 :
- 抽象目標描述:描述機器的接口,不包含實現
- 用來生成對象的class:一些抽象的類可以表示任何目標機器的機器代碼
- 用來描述目標文件層次的算法和類:表示匯編層次的構造,如標簽、節、指令。
- 用來實現各階段原生代碼生成的算法
- 抽象目標接口描述的實現
- JIT
總的來說就是目標機器的描述以及機器代碼的表示。
參考文獻
LLVM - 百度百科
讓你理解什么是LLVM
https://llvm.liuxfe.com/ The LLVM
Target-Independent Code Generator
LLVM Code Generator
知乎一篇文章