Байткод → машинный код08 / 19

JIT: зачем движку V8 несколько компиляторов

Почему V8 использует интерпретатор и несколько компиляторов.

В предыдущем уроке мы рассмотрели, как Ignition выполняет байткод: читает инструкцию, выбирает обработчик и переходит дальше. Чтобы сократить расходы на эти действия, V8 может создать машинную версию функции. При её выполнении уже не требуется выбирать обработчик каждой инструкции байткода.

Если функцию вызовут один раз, длительная оптимизация может не окупиться. Для функции, которая регулярно выполняет много работы, затраты на компиляцию могут окупиться ускорением последующих вызовов. Поэтому в V8 есть несколько компиляторов с разными задачами.

Ignition — интерпретатор. Sparkplug, Maglev и TurboFan — компиляторы в составе того же V8. Сравним их роли:

ИнтерпретаторIgnition
Выполняет байткод через обработчики. Отдельная машинная версия функции для этого не нужна.
Позволяет начать выполнение без JIT-компиляции функции.
Быстрый компиляторSparkplug
Быстро переводит байткод в машинный код без сложной оптимизации.
Сокращает расходы интерпретации при небольших затратах на компиляцию.
Оптимизирующий компиляторMaglev
Учитывает наблюдения о работе функции, например о типах значений, чтобы создать более быстрый машинный код.
Тратит больше усилий на оптимизацию, чем Sparkplug, но рассчитан на более быструю компиляцию, чем TurboFan.
Оптимизирующий компиляторTurboFan
Применяет более сложные оптимизации, стремясь получить быстрый код для функций, на выполнение которых программа тратит много времени.
Более дорогая компиляция может окупиться при длительном выполнении функции или её повторных вызовах.

V8 принимает решение для каждой функции отдельно. Функция не обязана проходить все перечисленные уровни. Конкретный выбор зависит от версии и настроек движка, а также от наблюдений за выполнением программы.

Основной вывод

JIT создаёт машинный код во время работы программы. Несколько компиляторов позволяют V8 выбирать между затратами на компиляцию и скоростью дальнейшего выполнения.

Проверить по первоисточнику ↗

V8 · Sparkplug↗Sparkplug быстро переводит байткод в машинный код, сокращая расходы на чтение и выбор инструкций интерпретатором.V8 · Maglev↗Почему между Sparkplug и TurboFan появился Maglev и как он использует наблюдения о выполнении функций.V8 · TurboFan↗Команда V8 о роли TurboFan как наиболее сложного оптимизирующего компилятора и развитии его внутренней архитектуры.