如何學習 clang和LLVM(有關於源代碼閱讀),需要哪些知識?
參考文章及視頻:
文章:AST Matcher Reference
Basic source-to-source transformation with Clang使用Clang實現C語言編程規範檢查loarabia/Clang-tutorial · GitHub視頻:
https://www.youtube.com/watch?v=VqCkCDFLSschttps://www.youtube.com/watch?v=tJJb-7mMWFwhttp://devimages.apple.com/llvm/videos/Libclang.movhttp://devimages.apple.com/llvm/videos/ExtendingClang.m4v
我最近和Clang/LLVM打交道比較多,目前遊離在LLVM IR和IBM WCode之間。對於學習Clang/LLVM來說,其實需要看你做什麼,是研究C, C++, Objective-C在Clang的實現,抑或著是想利用Clang做AST層面的事情,還是說想要利用LLVM IR來做一些事情,抑或著你是想要添加LLVM優化,還是說想要為LLVM添加新的體系結構支持.......Clang/LLVM現在都很大了,所以需要了解好自己想要的是什麼,然後去針對的閱讀,而非直接就開始一大塊的開始,這實在是太大了。
而在閱讀源代碼之前,無論如何,首先是需要基本的編譯原理知識。你需要知道我們編譯器的幾個基本步驟,如詞法分析,語法分析,語意分析,代碼生成等過程,有了這個基本的思路,你才不至於迷失在Clang的浩海代碼中,如看見Sema,AST,CodeGen這樣的字眼你也能對應上這是哪個階段的,若你想要了解C, C++, Objective-C等的實現,大部分都要集中在Lexer,Parser, AST, Sema等部分。與此同時,若你想要理清楚,明白為什麼這麼實現,如C++。那麼,你還需要備一份C++標準,並且熟悉C++標準的常用語,至少可以分清楚Declaration,Definition,L-Value, R-Value等,因為你會看見Clang有很多Decl,若不理解Declaration,你很難理解為什麼會有這麼多Decl冒出來。而這一部分代碼的閱讀,我會推薦當你想要了解某一部分的實現時再去挑著讀,而非挨著挨著讀。
而若你如我一樣,需要直接面對LLVM IR,那麼你更多需要的是學習 LLVM IR Language,即LLVM Language Reference Manual ,但是我知道直接看這樣的文檔是抽象的,是無趣的,我也如此。那麼其實最好的辦法就是從C/C++程序dump出.ll文件,然後閱讀它,修改它,看看會發生什麼。同時,在這個階段,你需要更多的有關鏈接器,Object File,Symbol Table等知識,這樣才能更好的做這件事情。而這階段的代碼,主要都是都在Clang CodeGen裡面,所以你要閱讀代碼這部分是比較集中的,但是你要完整理清楚,你還是不可避免的需要從Driver等部分開始,但是你若是只想知道IR,大部分在CodeGen,Clang的源碼大多是CG****。
若你是做LLVM後端的話,這部分我了解的比較少,但是LLVM最好的地方就是它文檔還算好,如我立馬就找到了一個相關的東西:Writing an LLVM Backend 然後空明大神補了一個:The LLVM Target-Independent Code Generator
而無論是什麼,都不要忘記了,這是在LLVM體系中,所以對LLVM的熟悉是必須的。那麼,就需要對LLVM有了解,如整體架構: The Architecture of Open Source Applications: LLVM 同時也需要知道Module是什麼,遍歷Module後的Function,Global Value是什麼,Function遍歷後BasicBlock是什麼,遍歷BasicBlock後的Value是什麼等等,這是非常重要的,因為即使是Clang都會用到LLVM的東西,畢竟其架設到LLVM體系中。同時,對於LLVM的一些API也需要熟悉,如dyn_cast&<&>, isa&<&>, smallvector等,LLVM稱其為Programmer Manual: LLVM Programmer』s Manual 而如dyn_cast等是很重要的,如我們拿到了Value* v,我們可以用dyn_cast來判斷這個v到底是不是Function等,然後再對Function等操作,那麼這個時候無論是我這樣的編譯器開發者還是樓主這樣的源代碼閱讀者都是需要去看LLVM Doxygen,如LLVM: llvm::Function Class Reference,這樣我們就知道了LLVM的Function到底有什麼方法,到底可以做什麼了。
所以,編譯器這一塊兒其實需要蠻多知識的,即使只是源碼閱讀。
初學看 Getting Started with LLVM Core Libraries 吧,比一般的文章來的系統全面。
SHINING的博客我的博客有一系列關於LLVM,CLANG學習和代碼閱讀的博文,歡迎關注,歡迎探討。
Clang是LLVM的前端,可以用來編譯C,C++,ObjectiveC等語言。傳統的編譯器通常分為三個部分,前端(frontEnd),優化器(Optimizer)和後端(backEnd)。在編譯過程中,前端主要負責詞法和語法分析,將源代碼轉化為抽象語法樹;優化器則是在前端的基礎上,對得到的中間代碼進行優化,使代碼更加高效;後端則是將已經優化的中間代碼轉化為針對各自平台的機器代碼。Clang則是以LLVM為後端的一款高效易用,並且與IDE結合很好的編譯前端。
個人學習筆記,
有關LLVM - 葉金雷的文章 - 知乎專欄我個人的經驗是先看《getting started with llvm core libraries》和《llvm cookbook》這兩本書,大概對llvm和clang各個部分有一定了解,然後根據個人需求深入探索,關於源碼的學習,這裡有個人寫得讀源碼的筆記,可惜不完整,只能用來參考:Yong Li
《getting started with llvm core libraries》和另外兩本都有,個人感覺《getting started with llvm core libraries》適合初學者,但要學LLVM還是建議先看以下龍書或虎書:要不可能根本無法理解他在講什麼。當然如果是後端,鯨書估計是跑不了的
《llvm cookbook》 還是比較淺的, 看過後覺得沒啥營養。
LLVM CookbookPackt.Getting Started with LLVM Core Libraries
這兩本推薦看.
可以加入llvm的社區, 還是很活躍的.
多閱讀源碼.
clang 不熟悉, llvm 分為中間優化,後端代碼生成,二進位代碼生成中間優化:各種優化演算法後端:CPU指令,特性機器碼:各種二進位格式 比如elf pe
推薦閱讀:
※有什麼好用的C/C++源代碼混淆工具?
※生成編譯器的代碼又由誰負責編譯?
※如何看待Twitter將重新實現Scala編譯器?
※計算機編程語言必須能夠自舉嗎?
※為什麼pat考試可選的語言眾多,但提供的編輯器卻少得可憐,甚至非常老舊?