Ignition Interpreter¶
Ignition Interpreter is the JS interpreter in V8. It first translates the abstract syntax tree generated by the Parser frontend into bytecode, and then interprets and executes the bytecode. The working pipeline is shown in the diagram below:

- First, the abstract syntax tree generated by the Parser is translated into basic bytecode. Ignition's virtual machine is designed as the most common register machine (where bytecode inputs and outputs explicitly specify register operands).
- Next, the bytecode goes through a series of intermediate optimization stages:
- First is optimization of the registers used by the bytecode, such as reducing unnecessary copies between registers.
- Next is optimization of instruction sequences, i.e., replacing instruction sequences with equivalent, more optimal instructions. This includes removing useless operations, simplifying equivalent operations, etc.
- Finally, the conventional dead code elimination phase, such as removing code that will never be executed and variables that will never be used.
- After optimization is complete, the Ignition Interpreter interprets and executes the bytecode.
Note that this series of operations runs in parallel in the background by the Script Streamer Thread, thereby reducing the pressure on the foreground main thread.
Ignition Bytecodes¶
Ignition Bytecode is a fixed-length instruction set. The underlying machine architecture is designed as the most common register machine. The complete bytecode list is shown in the diagram below:

For example, here is an example of JS code translated to Ignition Bytecode (initial state):

Why Interpret?¶
In fact, before Ignition appeared, JS was directly translated into unoptimized machine code, and optimized by TurboFan etc. when necessary (without Ignition enabled, V8 still works this way). The appearance of the Ignition Interpreter changed V8's core execution logic. So why use interpreted execution?
This is mainly due to the following considerations:
- Ignition bytecode occupies less memory (25~50% of baseline machine code)
- Ignition bytecode translation is faster (faster than translating to machine code anyway)
- Ignition bytecode has lower complexity, thereby simplifying the compilation pipeline
Under construction.
Reference¶
What Are Rendering Engines: An In-Depth Guide
RenderingNG deep-dive: BlinkNG
How Does the Browser Render HTML?
Inside look at modern web browser (part 1)
JavaScript engine fundamentals: Shapes and Inline Caches
Winty's blog - Modern Browser Architecture Overview
Firing up the Ignition interpreter
Ignition: Jump-starting an Interpreter for V8