日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

源码 状态机_LLVM学习笔记(1)--初探源码

發布時間:2025/3/12 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 源码 状态机_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)--初探源码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。