Компиляция 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 для запуска фактической компиляции функции.
Во-вторых, он имеет двухступенчатый конвейер компилятора, как описано выше, с использованием либо полного кода + коленчатого вала, либо зажигания + турбовентилятора.
Когда компиляция запускается, она сначала генерирует неоптимизированный код или байт-код зажигания (что он может сделать очень быстро), а затем, если код горячий, запускает оптимизированную повторную компиляцию (которая намного медленнее, но генерирует гораздо лучший код).