Компиляция JavaScript в V8

В V8 home (движок JavaScript от Google) мы читаем это:

V8 компилирует и выполняет исходный код JavaScript

  • Означает ли это, что JavaScript не является интерпретируемым языком в V8?

  • Использует ли V8 подход компиляции точно в срок для JavaScript?


Изменить: есть еще один существующий вопрос, который уже касается моего первого вопроса, но не второй.

1 ответ

Решение

Означает ли это, что JavaScript не является интерпретируемым языком в V8?

Ответ на это "это зависит".

Исторически V8 компилировался непосредственно в машинный код с помощью своего компилятора "full-codegen", который создает неоптимизированный код, который использует встроенное кэширование для реализации большинства операций, таких как арифметические операции, загрузка и сохранение переменных и свойств и т. Д.

Код, сгенерированный full-codegen, отслеживает, насколько "горячей" каждая функция, настраивая счетчик, когда функция вызывается и когда она возвращается к вершине циклов.

Он также отслеживает типы переменных, используемых в каждом выражении.

Если он определяет, что функция (или часть функции) является очень горячей, и он собрал достаточно информации о типе, он запускает компилятор "Crankshaft", который генерирует намного лучший код.

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

Вот пара сообщений из блога разработчиков V8, описывающих это:

Использует ли V8 подход компиляции точно в срок для JavaScript?

Да, несколькими способами.

Во-первых, он имеет ленивый синтаксический анализ и ленивый механизм компиляции. Это означает, что когда он анализирует исходный файл Javascript, он с энтузиазмом анализирует внешнюю область, генерируя полный кодовый код немедленно.

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

Во-вторых, он имеет двухступенчатый конвейер компилятора, как описано выше, с использованием либо полного кода + коленчатого вала, либо зажигания + турбовентилятора.

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

Другие вопросы по тегам