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-кода полезно использовать (...) обёртки.

Источники

См. также