Skip to main content

JavaScript引擎運行流程解析

JavaScript 引擎的運作流程

  1. 解析(Parsing)

  2. 編譯(Compilation)

  3. 執行(Execution)

  4. 優化(Optimization)(可選階段,但現代引擎會做)

這些步驟是由 JavaScript 引擎(如 Chrome 的 V8、Firefox 的 SpiderMonkey、Safari 的 JavaScriptCore 等)負責完成。


1. 解析(Parsing)➡ 產生 AST

當你寫好 JS 程式碼並載入到瀏覽器或 Node.js 中後,第一步是「解析」:

  • JavaScript 引擎會把原始碼(例如:let a = 1 + 2讀成文字

  • 然後進行語法分析,把這些文字變成「抽象語法樹(AST, Abstract Syntax Tree)」

  • AST 是一種程式碼的結構化表示方式,讓電腦可以理解每個語句的邏輯關係

範例:

let a = 1 + 2;

會被解析成 AST,大致如下(簡化過):

VariableDeclaration
└─ Identifier: a
└─ BinaryExpression: 1 + 2


2. 編譯(Compilation)➡ 產生機器可執行的程式

以前 JavaScript 是純直譯語言(interpreter),但現在像 V8 都是「即時編譯(JIT, Just-In-Time compilation)」。

流程如下:

  • AST 會被轉換成「中間表示(Intermediate Representation, IR)」

  • 然後把 IR 轉換成「機器碼(Machine Code)」或「位元碼(Byte Code)」

  • 這些碼可以被 CPU 執行

V8 的元件簡單舉例:

元件名稱功能說明
IgnitionV8 的直譯器,產生 Byte Code
TurboFanV8 的優化編譯器,把常用程式碼變成更有效率的機器碼

3. 執行(Execution)➡ 跑出結果

  • 引擎執行 Byte Code 或機器碼,開始跑你的程式

  • 同時,會建立「執行環境(Execution Context)」和「作用域鏈(Scope Chain)」

  • 還會產生「記憶體空間(Heap 與 Call Stack)」去儲存資料與控制流程

這時候也會用到:

  • Event Loop(處理非同步)

  • Call Stack(函式呼叫)

  • Heap(物件存在的位置)

  • Lexical Environment(變數與作用域管理)


4. 優化(Optimization)➡ 執行更快

當某段程式碼被「重複執行」或「關鍵效能區塊」時,JIT 編譯器會:

  • 將它標記為 熱區(hot path)

  • 使用 TurboFan(或其他優化器)進行進階優化,例如:

    • 移除不必要的檢查(如型別檢查)

    • 內聯函式(把小函式展開塞進主要邏輯中)

    • 編譯成更有效率的機器碼


圖解整體流程

你的 JavaScript 程式碼

【Parsing】

產生 AST

【Compilation(JIT)】

轉成 Bytecode 或機器碼

【Execution】

執行、建立執行環境、作用域、處理事件迴圈

【Optimization】
(針對熱區進行 TurboFan 優化)


延伸補充

名詞說明
AST程式碼的語法樹,用來表示語句與邏輯結構
JITJust-In-Time,即時編譯,執行中邊跑邊優化
IgnitionV8 的直譯器,把 AST 編譯成 Bytecode
TurboFanV8 的優化器,把常用程式轉成高效機器碼
Heap儲存物件的記憶體空間
Call Stack儲存函式呼叫與執行順序
Event Loop處理非同步任務的機制

JavaScript 引擎運作流程圖(文字版)

+---------------------+
| JavaScript 原始碼 |
+---------------------+
|
v
+---------------------+
| 解析器 (Parser) |
| 解析原始碼 ➜ AST |
+---------------------+
|
v
+---------------------+
| 建立 AST(抽象語法樹)|
+---------------------+
|
v
+---------------------+
| 編譯階段 |
| ➜ Ignition 直譯器 |
| ➜ 轉成 Bytecode |
+---------------------+
|
v
+---------------------+
| 執行階段 |
| ➜ 執行 Bytecode |
| ➜ 建立執行環境 |
| ➜ 管理 Call Stack |
| ➜ 處理 Event Loop |
+---------------------+
|
v
+---------------------+
| 熱區偵測 |
| ➜ TurboFan 編譯器 |
| ➜ 最佳化常用程式碼 |
+---------------------+
|
v
+---------------------+
| 執行優化後的機器碼 |
+---------------------+


每個區塊說明

區塊功能說明
JavaScript 原始碼你寫的程式碼
解析器將程式碼轉換成 AST
AST抽象語法樹,讓引擎能理解程式邏輯
Ignition把 AST 轉換成可執行的 Bytecode
執行階段建立執行環境、作用域鏈、處理事件
TurboFan偵測到熱區後,進一步將 Bytecode 轉成更快的機器碼