v8引擎和v12引擎 深入V8引擎 AST 2

2021-10-14 13:35:26 字數 2482 閱讀 7959

先宣告一下,這種長系列的大塊頭部落格只能保證盡可能的深入到每一行原始碼,有些**我不樂意深究就寫個注釋說明一下作用。另外,由於本地整理的比較好,部落格就隨心寫了。

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 使...