Как компилирует V8
Полный пайплайн от текста JS до машинного кода: Scanner → Parser → AST → BytecodeGenerator → Ignition → TurboFan → MachineCode. И всё это с пре-парсером, кэшем байт-кода и фоновыми потоками.
Конвейер
JS source
↓
Scanner (Lexer) → токены
↓
PreParser (быстро, неточно) — границы функций
↓
Parser (по требованию, lazy) → AST
↓
BytecodeGenerator (Ignition) → Bytecode
↓
Ignition VM — интерпретация + сбор type feedback
↓ функция стала горячей
TurboFan
↓ оптимизатор: inline, escape analysis, type spec, redundancy
Machine Code
↓ feedback не сбылся → deopt → откат в Ignition
Что делает TurboFan на каждой фазе
- Graph building — строит sea-of-nodes IR из байт-кода + type feedback.
- Typer — выводит типы для каждого узла.
- Specialization — заменяет общие операции типизированными (
add→int32_add). - Inlining — вставляет тела горячих коллбэков.
- Escape analysis — устраняет аллокации, если объект не утекает.
- Lowering — спуск к машинному IR.
- Code generation — машинный код под архитектуру.
Background compilation
- Парсинг и компиляция идут в отдельных потоках.
- Main thread не блокируется парсингом большого JS.
- В Chrome — Streaming Compilation поверх сети: парсит, пока скачивается.
Подводные камни
- TurboFan не оптимизирует функцию, если она вызывается редко.
- Code caching сохраняет байт-код, но не машинный (для V8 < 9, после — может).
- Парсер до Ignition нужен дважды: один раз pre-parser, второй — full.
Источники
- Смотрим вместе YT Настя Котова — как компилирует V8 · AsForJS · 2026-03-17
- Вечірня казка для маленьких ДжаваСкриптерів. V8, оптимізації та інше · AsForJS · 2022-08-14
- Этапы интерпретации JS кода (sobes 12) · AsForJS · 2023-10-27