Ignition vs TurboFan
Два пласта рантайма V8: Ignition — интерпретатор байт-кода (JIT первого уровня), TurboFan — оптимизирующий компилятор. Понимать их обязательно — без этого нельзя писать перформантный JS.
Что это / Механика
- Ignition — стековая виртуальная машина. Берёт JS-код, превращает в байт-код, интерпретирует команду за командой.
- TurboFan — оптимизирующий компилятор. Превращает байт-код в машинный код для горячих функций.
- Ignition по ходу выполнения собирает статистику (type feedback) и решает, какие функции «горячие».
- Когда функция признана горячей — Ignition отдаёт команду TurboFan: «компилируй».
- Раньше был Crankshaft (полная компиляция всего кода сразу) — заменён парой Ignition+TurboFan ради ленивости.
Жизненный цикл функции
JS-source → Parser → AST → Ignition (байт-код)
↓ интерпретация
↓ сбор type feedback
↓ функция стала "hot"
TurboFan (машинный код)
↓ feedback не подтвердился
deopt → откат в Ignition
Подводные камни
- TurboFan может деоптимизировать функцию обратно в байт-код, если предположения о типах не сбылись.
- «Деоптимизировать» функцию проще, чем оптимизировать заново — пиши стабильный по типам код.
- Слишком много форм объектов / типов аргументов → функция остаётся в Ignition и не получит ускорения.
- Понимание Ignition важнее, чем кажется: 80% кода в современных приложениях исполняется именно в нём.
Источники
- Разбираемся с Мурой JavaScript толчек, эпизод 5, Ignition vs TuroFan · AsForJS · 2021-11-17
- Цитата: «Рантайм V8 имеет два очень важных пласта... Ignition, это JIT, Just-in-Time, та фигня, которая берет наш JavaScript код, преобразовывает его к внутреннему представлению байт-коду.»
- Цитата: «Когда происходит эта команда? Тогда, когда он [Ignition] собирает определенную статистику относительно работы нашего кода.»
- Этапы интерпретации JS кода (sobes 12) · AsForJS · 2023-10-27
- Настя Котова — как компилирует V8 · AsForJS · 2026-03-17