㈠ Gcc和llvm編譯器有什麼區別,我這配置哪個快
LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。
㈡ llvm是什麼
LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閑時間(idle-time),對開發者保持開放,並兼容已有腳本。
㈢ Clang 比 GCC 好在哪裡
從代碼上說,clang結構更簡單。因為clang只需要完成詞法和語法分析,代碼優化和機器代碼的生成工作由llvm完成。所以和全部由自己包下的gcc比起來,clang可以更專注地做好一件事。
這種結構也使clang可以被單獨拿出來用在其他的程序里。比如vim的clang_complete插件就是利用clang進行語法分析後給出精確的自動補全和語法錯誤提示的。而gcc就沒法很方便地做到這一點。
在實用性方面,除了有更快的編譯速度更快和更友好的出錯提示外,clang還內置有靜態分析工具,可以對代碼進行靜態分析(clang --analyze)。這也是gcc做不到的。
總結如下:
Clang是LLVM的前端,可以用來編譯C,C++,ObjectiveC等語言。傳統的編譯器通常分為三個部分,前端(frontEnd),優化器(Optimizer)和後端(backEnd)。
在編譯過程中,前端主要負責詞法和語法分析,將源代碼轉化為抽象語法樹;優化器則是在前端的基礎上,對得到的中間代碼進行優化,使代碼更加高效;後端則是將已經優化的中間代碼轉化為針對各自平台的機器代碼。Clang則是以LLVM為後端的一款高效易用,並且與IDE結合很好的編譯前端。
㈣ 如何將Java bytecode編譯成LLVM IR,即有沒有可用的LLVM的Java前端
首先簡要介紹一下LLVM。LLVM是一個針對LLVM Intermediate Representation(IR,中間語言)的跨平台優化編譯器,它的模塊化設計很好,使得這個編譯器中的很多功能可以被單獨實現或者改進,這與其C++實現無法分開。由此,LLVM可以被設計成很多語言
㈤ 編譯器二:LLVM和GCC的區別
GCC: GNU Compiler Collection
GCC屬於傳統編譯器,傳統編譯器的工作原理基本上都是三段式的,可以分為前端(Frontend)、優化器(Optimizer)、後端(Backend)。前端負責解析源代碼,檢查語法錯誤,並將其翻譯為抽象的語法樹(Abstract Syntax Tree)。優化器對這一中間代碼進行優化,試圖使代碼更高效。後端則負責將優化器優化後的中間代碼轉換為目標機器的代碼,這一過程後端會最大化的利用目標機器的特殊指令,以提高代碼的性能。
事實上,不光靜態語言如此,動態語言也符合上面這個模型,例如Java。Java Virtual Machine也利用上面這個模型,將Java代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個前端就可以了。當需要支持多種目標機器時,只需要添加多個後端就可以了。對於中間的優化器,我們可以使用通用的中間代碼。
這種三段式的結構還有一個好處,開發前端的人只需要知道如何將源代碼轉換為優化器能夠理解的中間代碼就可以了,他不需要知道優化器的工作原理,也不需要了解目標機器的知識。這大大降低了編譯器的開發難度,使更多的開發人員可以參與進來。
雖然這種三段式的編譯器有很多有點,並且被寫到了教科書上,但是在實際中這一結構卻從來沒有被完美實現過。做的比較好的應該屬Java和.NET虛擬機。虛擬機可以將目標語言翻譯為bytecode,所以理論上講我們可以將任何語言翻譯為bytecode,然後輸入虛擬機中運行。但是這一動態語言的模型並不太適合C語言,所以硬將C語言翻譯為bytecode並實現垃圾回收機制的效率是非常低的。
GCC也將三段式做的比較好,並且實現了很多前端,支持了很多語言。但是上述這些編譯器的致命缺陷是,他們是一個完整的可執行文件,沒有給其它語言的開發者提供代碼重用的介面。即使GCC是開源的,但是源代碼重用的難度也比較大。
LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的縮寫,定位是一個虛擬機,但是是比較底層的虛擬機。它的出現正是為了解決編譯器代碼重用的問題,LLVM一上來就站在比較高的角度,制定了LLVM IR這一中間代碼表示語言。LLVM IR充分考慮了各種應用場景,例如在IDE中調用LLVM進行實時的代碼語法檢查,對靜態語言、動態語言的編譯、優化等。
LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。
㈥ 如何利用LLVM寫一個編譯器
LLVM有自己的教程,如果你只想做個玩具,那可以首先試著實現LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,請看他的文檔http://llvm.org/docs/
Kaleidoscope是一個範式簡單的腳本語言,教程里的詞法,語法分析都是手寫的,基本流程就是詞法語法解析,利用LLVM的API生成中間代碼並執行。
我用visual studio編譯的LLVM(version 3.6)實現過Kaleidoscope,我遇到的坑不少,如果你想以visual studio編譯的LLVM實現Kaleidoscope,你可能同樣會遇到
1. LLVM的生成目標對象為ELF格式,在windows下使用JIT的API時會出現incompatible object format的錯誤警告,需要在通過重新設定Mole的triple,我的PC的getTargetTriple的結果是「i686-pc-windows-msvc」,直接在後面再加上「-elf」即可
TheMole->setTargetTriple("i686-pc-windows-msvc-elf");
2. LLVM不支持windows下通過動態鏈接導出函數,如果需要使用C/C++的函數,需要通過addSymbol進行注冊
llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);
3. Kaleidoscope里使用的JIT的查找函數的API,getPointerToFunction已經被棄用了,需要替換為getFunctionAddress
㈦ xcode裡面有llvm clang編譯器嗎
Xcode 中最開始使用的是 GCC,後來開始引入 LLVM 後端(前端仍然是 GCC),再後來引入 Clang 前端,再後來 Clang/LLVM 成為默認,然後從 Xcode 5.0 版本以後,Clang/LLVM 是唯一提供的編譯器套件。
㈧ LLVM相比於GCC,有哪些技術上的優勢
首先簡要介紹一下LLVM。LLVM是一個針對LLVM Intermediate Representation(IR,中間語言)的跨平台優化編譯器,它的模塊化設計很好,使得這個編譯器中的很多功能可以被單獨實現或者改進,這與其C++實現無法分開。由此,LLVM可以被設計成很多語言編譯器實現的後端,負責處理程序優化和跨平台,而前端只需將程序轉換成LLVM IR即可。比如說,Clang就是基於LLVM實現的C/C++編譯器,它的主要功能就是將C/C++程序轉換成LLVM IR,然後由LLVM負責後續的工作。
LLVM技術上的(最大)優勢就在於它的模塊化設計。在LLVM中,IR的解析,優化,匯編碼的生成,寄存器分配,匯編碼優化以及機器碼生成,各種類型的二進制文件生成全部都是介面定義清晰的模塊完成的,很容易分別改進或者添加定製功能。而且由於LLVM的C++實現,很多模塊理解和使用比較容易。這些特性使得LLVM可以很容易地被用在科研和生產實踐當中。反觀GCC,模塊化做得不如LLVM好,這使得它定製或者改進比較不方便。
㈨ 怎麼用llvm編譯器編寫c語言
LLVM的幫助。對於這個工具,我不知道改怎麼去形容它,但是他給我的這個編譯器的確帶... 我們使用的工具是基於C/...LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-tim...
㈩ LLVM每日談之一 LLVM是什麼
寫在前面的話: 最近接觸llvm比較多,在這個上面花了不少的時間。感覺llvm要完全理解透是個很不容易的事情,需要在學習過程中好好的整理下自己的思路。剛好又閱讀了開源項目Storm的作者Nathan Marz的博客《You should blog even if you have no readers》,就打開自己的blog,開始了這個llvm每日談的系列。希望自己能堅持的久一點,多寫寫llvm的每個方面,多寫寫自己的理解。 llvm是low level virtual machine的簡稱,其實是一個編譯器框架。llvm隨著這個項目的不斷的發展,已經無法完全的代表這個項目了,只是這種叫法一直延續下來。 llvm是一個開源的項目。它最早的時候是Illinois的一個研究項目,主要負責人是Chris Lattner,他現在就職於Apple. Apple 目前也是llvm項目的主要贊助者之一。 llvm的主要作用是它可以作為多種語言的後端,它可以提供可編程語言無關的優化和針對很多種CPU的代碼生成功能。此外llvm目前已經不僅僅是個編程框架,它目前還包含了很多的子項目,比如最具盛名的clang. llvm的優點是開源,有一個表達形式很好的IR語言,模塊化作的特別好。 llvm這個框架目前已經有基於這個框架的大量的工具可以使用。 llvm的官方網站地址是:llvm.org。在這里可以下載最新的發布代碼,也可以找到介紹llvm的相關文檔。 附錄:llvm目前支持的工具(描述來自網路) llvm-as 將人類可讀的 .ll 文件匯編成位元組代碼 llvm-dis 將位元組代碼文件反編成人類可讀的 .ll 文件 opt 在一個位元組代碼文件上運行一系列的 LLVM 到 LLVM 的優化 llc 為一個位元組代碼文件生成本機器代碼 lli 直接運行使用 JIT 編譯器或者解釋器編譯成位元組代碼的程序 llvm-link 將幾個位元組代碼文件連接成一個 llvm-ar 打包位元組代碼文件 llvm-ranlib 為 llvm-ar 打包的文件創建索引 llvm-nm 在 位元組代碼文件中列印名字和符號類型 llvm-prof 將 'llvmprof.out' raw 數據格式化成人類可讀的報告 llvm-ld 帶有可裝載的運行時優化支持的通用目標連接器 llvm-config 列印出配置時 LLVM 編譯選項、庫、等等 llvmc 一個通用的可定製的編譯器驅動 llvm-diff 比較兩個模塊的結構 bugpoint 自動案例測試減速器 llvm-extract 從 LLVM 位元組代碼文件中解壓出一個函數 llvm-bcanalyzer 位元組代碼分析器 (分析二進制編碼本身,而不是它代表的程序) FileCheck 靈活的文件驗證器,廣泛的被測試工具利用 tblgen 目標描述閱讀器和生成器 lit LLVM 集成測試器,用於運行測試