Байт-код 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 accumulatorLdaSmi— load small integerLdaNamedProperty— доступ по имени (с привязкой к IC slot)CallProperty/CallUndefinedReceiver— вызовыJumpIfFalse/Jump— переходыReturn
Кэширование байт-кода
V8 умеет сохранять байт-код между запусками — это критично для скорости загрузки.
Цитата: «Lazy Compilation касается только той части кода, которая проходит какой-то процесс выполнения. Не выполняется → не парсится в байт-код.»
Подводные камни
- Огромный JS-файл с кучей неиспользуемого кода — деньги в холодный старт.
- Иногда нужны скобки вокруг функции
(function{})— подсказка пре-парсеру: «это IIFE, парси сразу». - Без скобок V8 может неправильно «лениво» отложить компиляцию.
Источники
- JavaScript Толчек 8, кеширование байт-кода · AsForJS · 2021-11-19
- Этапы интерпретации JS кода (sobes 12) · AsForJS · 2023-10-27
- JavaScript инструменты Байт-код V8 · AsForJS · 2023-12-01
- JavaScript инструменты Байт-код V8 часть 2 · AsForJS · 2023-12-02
- Как запускать сборку V8 · AsForJS · 2023-12-01