原始碼 狀態機 LLVM學習筆記 1 初探原始碼

2021-10-16 09:53:45 字數 1589 閱讀 4227

一直耳聞llvm相比於gcc:

昨天讀到了一篇雖然概括卻很周到的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.com

c/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

[今日學習內容較瑣碎,待整理下再續..]

原始碼 狀態機 kafka原始碼學習

對原始碼的學習不僅能加深自我的內功,還可能為kafka社群做出自己的貢獻。我打算從如下幾個方面開啟學習之旅,本篇主要是列出所學內容的大綱,後續幾篇慢慢為其增磚添瓦。一 日誌模組 1.訊息檔案物件的儲存實現 2.搞懂高水位機制的實現 3.常見日誌操作大全 4.改進版二分查詢演算法的應用 5.位移索引和...

學習筆記 狀態機

狀態機是有限狀態自動機的簡稱,是現實事物執行規則抽象而成的一種數學模型 將電路的全部工作方式,分成幾個場景,這些場景的工作方式明顯不同,然後將這些場景通過數學模型表示出來 輸出只和狀態有關而與輸入無關 狀態表 輸出不僅和狀態有關而且和輸入有關係 狀態表 人有三個狀態健康,感冒,中。觸發的條件有淋雨 ...

狀態機學習筆記(一)

狀態機可歸納為4個要素,即現態 條件 動作 次態。詳解如下 現態 是指當前所處的狀態。條件 又稱為 事件 當乙個條件被滿足,將會觸發乙個動作,或者執行一次狀態的遷移。動作 條件滿足後執行的動作。動作執行完畢後,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足後,也可以不執行任何動...