源码 状态机_LLVM学习笔记(1)--初探源码
一直耳聞LLVM相比于GCC:
- well documented
- 架構靈活,前后端解耦符合龍書的講解
昨天讀到了一篇雖然概括卻很周到的llvm入門導引
陳欽霖:LLVM Pass入門導引?zhuanlan.zhihu.com就沿著其中的提示探索了下LLVM源碼,倒也沒有想要成為專業的compiler開發,不過希望能給C++的學習提供一些更直觀的認識,所以本文是一篇LLVM源碼的學習筆記
環境準備,包括源碼,官方文檔都在導引中說清楚了,不贅述
接收命令行參數到不同Action
代碼規模比較龐大,下面這篇
LLVM代碼研讀(2) --- LLVM前端: Clang剖析?blog.csdn.net說的還是很清楚的,大概用了兩三個小時對照著源碼搞了個大概。這部分主要作用如本節標題所說,是接收命令行參數如 clang -cc1 helloworld.cpp后從參數提取,到Action的執行的過程。如果時間比較緊迫,下面的回答
Clang里面真正的前端是什么??www.zhihu.com也把這個流程涉及的函數調用快速過了一遍,然后就到了preprocessor
其實這塊還是有點困惑的地方,上面的回答指出默認的Action是SyntaxOnlyAction(),但是從這個函數的調用沒有找到直接是如何進行預處理的,倒是在其他的Action的Execute()中有些涉及了PP->Lex(),所以打了個馬虎眼,直接跳到了預處理==,如果有時間,或者好心的大佬可以指點下就好啦
關于前端的概覽
這塊看到了一個不錯的討論,問題、回答以及提供的資料資源都很棒
GCC/Clang lexer and parser?stackoverflow.comC/C++的lexer和parser是如何協同工作,parser會lookahead至少一個token,所以可有如下兩種方案:lexer運行整個文件,再讓parser生成AST;或是生成了一小部分用于parser來完成相應工作,這意味著兩者交替運行。前者考慮是源于C++是任意lookahead的,因為語法并非上下文無關,但這也許會消耗相當多的內存。實際情況比較接近后者,但也并不完全這樣,因為典型情況下lexer和parser都用相對簡單的狀態機實現的,lexing過程由如下兩個條件驅動 外部索取一個新token或 一個新的字符到來,而parser狀態機由如下兩個條件驅動 : 索取一個parse或 來了一個新的token
這兩個方向分別對應top-down, bottom-up的實現,傳統方案來說后者居多,以構造AST為中心
preprocessor與lexer
源碼目錄結構、類設計的手冊如下,其中較全面介紹了clang前端主要類的功能
“Clang” CFE Internals Manual?clang.llvm.org[今日學習內容較瑣碎,待整理下再續..]
總結
以上是生活随笔為你收集整理的源码 状态机_LLVM学习笔记(1)--初探源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++—引用。。。
- 下一篇: Matlab guide菜单+快捷菜单的