2017-02-13 24 views
0

В (двигатель JavaScript в Google), V8 home мы читаем это:JavaScript компиляции в V8

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

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

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


Edit: Существует еще один existing question, который уже решать мой первый вопрос, но не второй.

+1

Из [wiki] (https://github.com/v8/v8/wiki/Design%20Elements#dynamic-machine-code-generation): * «V8 ​​компилирует исходный код JavaScript непосредственно в машинный код, когда он 1). – UnholySheep

+1

@UnholySheep: вики устарели: https://v8project.blogspot.co.uk/2017/02/help-us-test-future- of-v8.html –

+0

«Означает ли это, что JavaScript не является интерпретированным языком в V8?» - Нет такого понятия, как «интерпретируемый язык». Язык - это язык. Период. Интерпретация и компиляция являются чертами интерпретатора или компилятора (duh!), А не языка. –

ответ

5

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

Ответ на этот вопрос «это зависит».

Исторически V8 была составлено непосредственно в машинный код, используя свой «полную» CodeGen компилятор, который производит неоптимизированный код, который использует inline caching для выполнения большинства операций, таких как арифметические операции, нагрузка и сохраняют переменные и свойства, и т.д.

Код, созданный full-codegen, отслеживает, как «горячая» каждая функция, путем настройки счетчика при вызове функции и при переходе к вершине циклов.

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

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

Однако разработчики V8 активно работают над переходом в другую систему, где они начинают с интерпретатора под названием «Ignition», а затем используют компилятор под названием «Turbofan» для создания оптимизированного кода для горячих функций.

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

ли V8 использовать сборник подход только в срок для JavaScript ?

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

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

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

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

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

+0

Ничего себе. Сегодня я зашел в блог V8, увидел, что я тестировал Ignition, вспомнил ответ на этот вопрос, пришел и обновил свой ответ - и опубликовал редактирование, увидел, что вы включили эту информацию вчера. Неплохо! Ваш ответ устарел. Желательно, чтобы я заметил, что * до * обновления. :-) –