llvm編譯器架構
llvm概述
llvm專案是模組化和可重用的編譯器及工具鏈技術的集合。儘管名稱如此,llvm與傳統虛擬機器關係不大。名稱「 llvm」本身不是縮寫。它是專案的全名。
llvm最初是伊利諾伊大學的乙個研究專案,目的是提供一種基於ssa的現代編譯策略,該策略能夠支援任意程式語言的靜態和動態編譯。從那時起,llvm逐漸發展成為乙個由多個子專案組成的總體專案,其中許多子專案已用於各種商業和開源專案的產品中,並廣泛用於學術研究。llvm專案中的**已根據「具有llvm例外的apache 2.0許可」獲得許可
llvm的主要子專案是:
1. 該llvm核心庫提供乙個現代化的源**與目標無關的優化,隨著**生成支援許多流行的cpu(以及一些不太常見的!),這些包都是圍繞著建立以及指定被稱為llvm中間表示的**表示(「 llvm ir」)。llvm核心庫有充分的文件記錄,特別容易發明自己的語言(或移植現有的編譯器)以將llvm用作優化器和**生成器。
2. 錯誤和警告訊息,並為構建出色的源**級工具提供平台。該clang靜態分析器和clang-tidy工具,**自動發現錯誤,而且是那種可以使用clang前端的庫來解析c / c ++**生成工具的很好的例子。
3. 該
4. 在
5. 當目標沒有簡短的本機指令序列來實現核心ir操作時,addresssanitizer,threadsanitizer,memorysanitizer和dataflowsanitizer)提供了執行時runtime庫的實現 。
6. 該
7. 該的openmp與在clang的openmp實現使用執行時間。
8. 該
9. 該
10. 該
11. 該
除了llvm的官方子專案之外,還有許多其他專案將llvm的元件用於各種任務。通過這些外部專案,可以使用llvm來編譯ruby,python,haskell,rust,d,php,pure,lua和許多其它語言。llvm的主要優勢在於它的多功能性,靈活性和可重用性,這就是為什麼它被用於各種各樣的任務:從輕量級jit編譯嵌入式語言(如lua)到為大型超級電腦編譯fortran**的原因。
llvm擁有廣泛而友好的社群,這些社群對構建出色的低階工具感興趣。如果有興趣參與其中,那麼最好的方法是瀏覽llvm部落格並註冊llvm developer郵件列表。有關如何傳送補丁程式,獲取提交訪問許可權以及版權和許可主題的資訊,請參閱《 llvm開發人員政策》。
靜態聯編與動態聯編
在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...
靜態聯編和動態聯編
聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...
靜態聯編和動態聯編
聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...