Что на самом деле делает зажигание V8? - PullRequest
0 голосов
/ 02 марта 2019

На https://v8.dev/docs/ignition мы можем видеть, что:

Ignition - это быстрый низкоуровневый интерпретатор на основе регистров, написанный с использованием бэкэнда TurboFan

on https://docs.google.com/document/d/11T2CRex9hXxoJwbYqVQ32yIPMh0uouUZLdyrtmMoL44/edit?ts=56f27d9d#

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

Сам интерпретатор состоит из набора фрагментов кода обработчика байт-кода, каждый из которых обрабатывает определенный байт-код и отправляет обработчику следующий байт-код.Эти обработчики байт-кода

Чтобы скомпилировать функцию в байт-код, код JavaScript анализируется для генерации его AST (абстрактного синтаксического дерева).BytecodeGenerator обходит этот AST и генерирует байт-код для каждого из узлов AST соответствующим образом.

После создания графика для обработчика байт-кода он пропускается через упрощенную версию конвейера Turbofan и присваивается соответствующей записи втаблица интерпретатора.

Так что, похоже, задание Ignition заключается в том, чтобы взять байт-код, сгенерированный BytecodeGenerator , преобразовать его в обработчики байт-кода и выполнить его через Turbofan.

Но здесь: enter image description here

и здесь: enter image description here

Вы можете видеть, что это зажигание производит байт-код.

Более того, в этом видео https://youtu.be/p-iiEDtpy6I?t=722 Зажигание называется базовым компилятором.

Так что это?Базовый компилятор?Интерпретатор байт-кода?Преобразователь AST в байт-код?

Это изображение кажется наиболее подходящим: enter image description here

, где зажигание - просто интерпретатор, а все до нет.имя генератор байт-кода / оптимизатор вещь.

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Разработчик V8 здесь.

На https://v8.dev/docs/ignition мы можем видеть, что:

Ignition - это быстрый низкоуровневый интерпретатор на основе регистров, написанный с использованиембэкэнд TurboFan

Да, это подводит итог.Чтобы добавить немного больше деталей:

  • Название «Зажигание» относится как к Генератору байт-кода, так и к интерпретатору байт-кода.Часто все это также рассматривается как один большой черный ящик и случайно называется «интерпретатором», что иногда может привести к некоторой путанице вокруг терминов.
  • Генератор байт-кода берет AST, созданный Parserдля данной функции JavaScript и генерирует из нее байт-код.
  • Интерпретатор байт-кода берет байт-код, сгенерированный генератором байт-кода, и выполняет его, интерпретируя его, отправляя его в набор обработчиков байт-кода.
  • Обработчики байт-кода, которые составляют интерпретатор байт-кода, генерируются с использованием частей конвейера Turbofan.Это происходит во время компиляции V8, а не во время выполнения.Другими словами, вам нужен Turbofan для построения (частей) зажигания, но не для запуска зажигания.
  • анализатора (и синтаксического дерева AST / Abstract it)Производимые продукты не являются частью Ignition.

После создания графика для обработчика байт-кода он пропускается через упрощенную версию конвейера Turbofan и присваивается соответствующей записи в интерпретаторе.таблица.

Итак, похоже, что задание Ignition состоит в том, чтобы взять байт-код, сгенерированный BytecodeGenerator, преобразовать его в обработчики байт-кода и выполнить его через Turbofan

В этом разделе документа разработки говоритсяо генерации обработчиков байт-кода, что происходит «раньше времени» (т. е. при компиляции V8) с использованием частей Turbofan. Во время выполнения байт-код не преобразуется в обработчики, он «обрабатывается» (= run,выполняется, интерпретируется) существующим фиксированным набором обработчиков, и Turbofan не участвует.

Более того, в этом видео https://youtu.be/p-iiEDtpy6I?t=722 Зажигание называется базовым компилятором.

В этот момент речь идет об общей идее, что все современные движки JavaScript имеют «базовый компилятор» (в очень общем, концептуальномсмысл - я согласен, что слайд мог бы сделать это более понятным).Обратите внимание, что слайд ничего не говорит о зажигании.На следующем слайде next сказано, что Ignition выполняет эту роль в V8.Поэтому точнее было бы сказать «Ignition заменяет базовый компилятор» или «Ignition - базовый механизм выполнения ».Или вы могли бы немного переопределить свои термины и сказать: «Ignition - это компилятор, который создает байт-код, а затем интерпретирует его».

ignition - просто интерпретатор, а все, что раньше, - это генератор именных оптимизаторов / оптимизаторов без имен1058 *

На этом слайде показано поле «Интерпретатор» как часть «Конвейера байт-кода зажигания».Генератор / оптимизатор байт-кода также является частью Ignition.

0 голосов
/ 02 марта 2019

Как я уже упоминал в комментарии, к сожалению, некоторые документы устарели, в том числе тот, на котором вы видите первый рисунок выше.Full-codegen и Crankshaft больше не используются , это просто анализ и Ignition + TurboFan. (вы удалили изображение из устаревших документов, которые, к сожалению, по-прежнему связаны некоторымииз документов V8)

Ignition - это высокоскоростной интерпретатор байт-кода.

Анализатор V8 создает байт-код Ignition.Этот байт-код выполняется (интерпретируется) зажиганием.Код, который выполняется только один раз (код запуска и т. Д.) Или не выполняется, часто остается на уровне байт-кода и продолжает выполняться Ignition.

«Горячий» код переходит ко второй фазе, когда TurboFan запускается: Ввод TurboFan - это тот же байт-код, который интерпретирует Ignition (а не исходный код, как это было с Crankshaft), который затем агрессивно компилируется в высокооптимизированный машинный код, который выполняется напрямую (а не интерпретируется).

Связанная статья посвящена мотивации для перехода с Full-codegen и Crankshaft (экономия памяти в первом случае, трудности с реализацией и, в частности, оптимизация языковых возможностей во втором).Конструкция TurboFan также помогает авторам V8 минимизировать объем кода, специфичного для платформы, который они должны написать (имея промежуточное представление, которое, помимо прочего, они также могут использовать для написания обработчиков байт-кода Ignition).

...