Байт-код V8

Внутреннее представление JS-кода в Ignition. Стековые команды виртуальной машины. На нём собирается type feedback, и из него TurboFan строит машинный код.

Что это

  • Промежуточное представление между JS-исходником и машинным кодом.
  • Команды для стековой виртуальной машины (Ignition).
  • Не привязан к архитектуре CPU — единый для x64/arm/etc.
  • Кэшируется (code caching) — повторный запуск страницы быстрее.

Как посмотреть

# d8 (standalone V8)
d8 --print-bytecode --no-lazy script.js

# Node
node --print-bytecode script.js

Типичные опкоды

  • Ldar / Star — load/store accumulator
  • LdaSmi — load small integer
  • LdaNamedProperty — доступ по имени (с привязкой к IC slot)
  • CallProperty / CallUndefinedReceiver — вызовы
  • JumpIfFalse / Jump — переходы
  • Return

Кэширование байт-кода

V8 умеет сохранять байт-код между запусками — это критично для скорости загрузки.

Цитата: «Lazy Compilation касается только той части кода, которая проходит какой-то процесс выполнения. Не выполняется → не парсится в байт-код.»

Подводные камни

  • Огромный JS-файл с кучей неиспользуемого кода — деньги в холодный старт.
  • Иногда нужны скобки вокруг функции (function{}) — подсказка пре-парсеру: «это IIFE, парси сразу».
  • Без скобок V8 может неправильно «лениво» отложить компиляцию.

Источники

См. также