導航:首頁 > 源碼編譯 > llvm編譯器開發怎麼樣

llvm編譯器開發怎麼樣

發布時間:2023-06-19 04:21:45

① 如何利用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

② LLVM - 工具

LLVM工具通過調用LLVM的一部分庫,實現庫的功能,通常使用編譯器或者開發編譯器的人會用到這些工具。

這是一個在LLVM IR級別做程序優化的工具,輸入和輸出都是LLVM IR。編譯器,或者基於LLVM做優化的開發者通常會使用這一標准工具來查看優化的效果。它也提供了很多option, 可以執行某一特定的pass。

這是微觀意義上的LLVM編譯器,不同於gcc的編譯器,它的輸入是LLVM IR,輸出是匯編文件或者是目標文件。通過-filetype=asm或者-filetype=obj來指定輸出是匯編文件還是目標文件,若生成是目標文件,llc會調用LLVM中的匯編輸出的代碼庫來工作(注意這個匯編器和gcc的匯編器也不同,它輸入的是MI,是一種後端的中間表示)。除陸稿此之外,還可以用-On來指定優化級別(llc默認優化級別是-O2),或者其他一些參數。

(.bc文件換成.ll文件也可以)

這是LLVM匯編器,它早春孝輸入匯編文件,輸出目標文件, 類似於gnu中的as命令。同時,它也可以反匯編,指定特殊參數(–disassemble)就行。可以發現,llc和llvm-mc都會調用到輸出目標文件的庫,也就是MCObjectStreamer。

這個工具是LLVM IR的解釋器,也是一個JIT編譯器。LLVM可以把C語言翻譯成LLVM IR,然後解釋執行,與Java的那一套類似,這也是最初LLVM編寫時的實現(一個虛擬機運行IR)。

最早看到這個工具,以為是鏈接器,其實它是IR級別的鏈接器,鏈接的是IR文件。談到這里,可以說一下LLVM針對多個源文件編譯時的兩種目標碼輸出方式。

第一種是LLVM先通森困過前端把每個源文件單獨翻譯成IR級別,然後用llvm-link鏈接成一個IR,然後再經過優化、後端等步驟生成目標文件,使用llvm-link的同時,可以使用鏈接時優化。不過需要注意,這種方式同樣需要最終調用鏈接器,將這個目標文件鏈接成可執行文件。

第二種是LLVM通過前端把每個源文件單獨翻譯後,再單獨經過優化、後端等工作,將每個源文件生成目標文件,之後再調用鏈接器,將所有目標文件鏈接成可執行文件。

這是針對LLVM IR的匯編器,其實名字里帶as,實際上不是gcc那個as,它的功能是將.ll文件翻譯為.bc文件,LLVM項目里,.ll稱為LLVM匯編碼,所以llvm-as也就是IR的匯編器了。

與llvm-as剛好相反,IR的反匯編器,用來將.bc文件翻譯為.ll文件。

最後也提一下clang,它也是現在LLVM項目中一個很重要的前端工具。clang能夠調用整個編譯器的流程,也就是上邊其他工具調用的庫,它很多都同樣會調用。clang通過指定-emit-llvm參數,可以配合-S或-c生成.ll或.bc文件,這樣我們就能把Clang的部分和LLVM的後端分離開來獨立運行,對於觀察編譯器流程來說,很實用。

還有一些其他工具,就不舉例了,可以查看LLVM項目路徑下/src/tools/中查看。

③ 如何更好的掌握編譯器的設計與實現

1. 閱讀相關書籍:編譯原理、編譯器設計、編譯器實現等;
2. 自學相關編程語言:C、C++、Java等;
3. 實踐:可以使用開源的編譯器框架,例如ANTLR,搭建自己的編譯器;
4. 了解編譯器的各個組成部分,並學習它們的工作原理;
5. 閱讀技術文章,了解編譯器的設計和實現的最新進展;
6. 加入開源項目,編寫和維護編譯器;
7. 在論壇上交流,和更多的編譯器開發者分享心得體會;
8. 參加學術會議,接觸到最新的研究成果;
9. 嘗試著自己設計一個編譯器,用實踐來加深理解。

④ 目前主流的C++編譯器有哪些

我用Cfree,也推薦你用這個,這個編譯器是自帶提示的,就是你只要輸入關鍵字或者之前設定函數的前幾個字母,該編譯器就會自動給你「聯想」出你需要的關鍵字或者相關的函數、成員等,這時只需要按下會車就實現自動輸入,這樣不會因為你輸入錯誤而照成不必要的修改……

⑤ swift編譯器是用什麼語言開發的

雖然Swift是一個全新的語言,但與Objective-C和C卻有著千絲萬縷的關系,Swift其實就是Objective-C的文本變種,對於這門全新的語言,蘋果做的工作其實遠沒有想像的艱巨。LLVM編譯器做工作只是先把swift翻譯成Objctive-C代碼,然後再把Objective-C代碼翻譯成C語言代碼,然後再把C語言代碼翻譯成匯編,最終翻譯成機器碼。雖然Swift其實就是Objective-C,但是對入門者而言Swift遠比Objective-C好學,吸取所有語言的精華,所以如果自學建議直接學習swift,但是如果參加培訓建議先學習C/Objective-C,這樣能夠更好的理解底層的實現原理。

閱讀全文

與llvm編譯器開發怎麼樣相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163