Lazy Compilation в V8
V8 не компилирует JS целиком при загрузке. Парсит и приводит к байт-коду только тот код, который реально выполняется. Раньше (Crankshaft) компилировался весь файл сразу — было дорого.
Эволюция
| Эпоха | Что делал V8 |
|---|---|
| До 2017 (Crankshaft + full-codegen) | Весь JS-текст сразу в машинный код |
| Сейчас (Ignition + TurboFan) | Pre-parser сканирует, реальный parser+байт-код по требованию |
«Появляется другой шаг, называется он Lazy Compilation. Приведение к байт-коду касается только той части, которая проходит какой-то процесс выполнения.»
Pre-parser
Pre-parser быстро проходит весь файл и понимает, где функции — не парся их полностью, просто запомнить границы.
Полноценный парсинг включается только при первом вызове функции.
Костыль со скобками
// Pre-parser НЕ знает, что это IIFE → парсит лениво
function { ... }
// Скобки = подсказка "парси сейчас полностью"
(function { ... })
Это рабочий приём с 2017 года для быстрого старта IIFE.
Подводные камни
- Pre-parser может ошибиться → ленивая компиляция включится там, где не надо (Яндекс ловил подобные баги, разбор в видео).
- Большие бандлы с грудой кода, который вызывается один раз при старте — это плохой кейс для lazy compilation, всё парсится дважды.
- Для starter-кода полезно использовать
(...)обёртки.
Источники
- Производительность JS V8 lazy Compilation или как Яндекс ногтей набросал · AsForJS · 2024-07-28
- Цитата: «Как работал кранкшафт? Он получал наш JavaScript код в текстовом представлении. После чего он проводил полную его компиляцию к машинному представлению. Всего вашего кода.»
- Как JavaScript-код, на этапе его подготовки к выполнению, влияет на производительность · AsForJS · 2023-06-11
- JSON как приём оптимизации холодного старта · AsForJS · 2023-05-17