先宣告一下,這種長系列的大塊頭部落格只能保證盡可能的深入到每一行原始碼,有些**我不樂意深究就寫個注釋說明一下作用。另外,由於本地整理的比較好,部落格就隨心寫了。
bool parseprogram(parseinfo* info, isolate* isolate)
所需要關心的核心**就是這些,非常簡單,parser物件的初始化屬性非常多,這裡就不列出來了。
接下來進入第二個核心方法,即parseprogram。
functionliteral* parser::parseprogram(isolate* isolate, parseinfo* info)
同樣,所需要關心**只有兩行,其中第一步則是啟動了scanner的初始化,第二步則是開始全面解析。
scanner包含scanner、scanner-character-strams兩個部分,其中stream則是經過初步處理的源string,必須轉換後才能進行解析。處理的過程在之前省略的**中,這裡稍微給出大概的轉換流程。
bool parseprogram(parseinfo* info, isolate* isolate)
/** * 有四種特殊的string型別 分別new不同的子類
* scannerstream::for(isolate, data, 0, data->length());
*/utf16characterstream* scannerstream::for(isolate* isolate, handledata, int start_pos, int end_pos)
}
常規的字串一般都是onebytestring,這裡就不細講了。最後返回乙個特殊stream類,其屬性記錄字串的長度、當前的解析進度、解析的開始與結束標記等等。
將字串轉換後,就可以利用scanner來進行逐步解析,在此之前,需要對scanner類有乙個簡單的了解,如下。
/**
* scanner類
* 跟utf16characterstream乙個檔案
*/class v8_export_private scanner
// 返回current_的位置資訊
const location& location() const
private:
// 當前字元的unicode編碼 -1表示結尾(typedef int32_t uc32)
uc32 c0_;
tokendesc* current_; // desc for current token (as returned by next())
tokendesc* next_; // desc for next token (one token look-ahead)
tokendesc* next_next_; // desc for the token after next (after peakahead())
// 從handle轉換後的型別 負責執行解析的實際類
utf16characterstream* const source_;
}
選取了一些比較簡單的屬性和方法,scanner內部有三個游標屬性負責遍歷字串,分別是current_、next_、next_next_,字面意思理解就行了。source_則是之前說的轉換stream類,所有的解析實際上都是呼叫這個屬性的方法。而兩個結構體tokendesc、location也非常重要,乙個負責詞法描述,乙個負責記錄詞法位置資訊,如下。
/**
* 詞法結構體
* 每乙個tokendesc代表單獨一段詞法
*/struct tokendesc
*/location location = ;
/*** 字串詞法相關
*/literalbuffer literal_chars;
literalbuffer raw_literal_chars;
/*** 詞法的列舉型別
* 例如 '(' 是 token::lparen '===' 是 token::eq_strict
* 所有型別可見token.h
*/token::value token = token::uninitialized;
messagetemplate invalid_template_escape_message = messagetemplate::knone;
location invalid_template_escape_location;
// 小整數
uint32_t smi_value_ = 0;
bool after_line_terminator = false;
}
通過這個結構體和一些方法,就能完整的將源字串逐步轉換為抽象語法樹。但是實際轉換過程非常複雜,分支極多,後面再繼續**。
JS中V8引擎簡介
document 2020 09 29 v8引擎 認識v8 v8 策略 v8常用的gc演算法 新生代物件的垃圾 將新生代記憶體也分成兩個大小相等的空間 使用空間為from,空閒空間為to 活動物件儲存於from空間中 to一直是空閒的 當from空間應用到一定程度之後 觸發gc操作 標記整理後將活動...
Mac OS下V8引擎編譯方法
v8 的github位址 因為需要訪問到google的伺服器,所以下面做的一切都需要翻到牆外面。翻牆方法自行解決吧。v8的版本控制是有乙個叫depot tools的工具維護的,這個東西相當於的將git包了一層。具體安裝方法 mac 下編輯 bash profile檔案,在檔案最開頭新增下列 其中 u...
Js直譯器V8引擎嵌入的異常處理
js直譯器v8引擎嵌入的異常處理 2011年08月10日 v8引擎為google開發的js語言直譯器有著高效易用等特點,通常它執行乙個js指令碼需要經過編譯和執行步驟,由於我們的指令碼程式很可能不正確,隨時造成過程環節的異常,我們來解決乙個異常以及錯誤的捕捉和處理過程,如下指令碼 test.js 使...