Общеизвестно, что современные веб-приложения запускают намного больше кода JavaScript чем несколько лет назад. Хотя компиляторы быстро последовали тенденции и сделали JavaScript эффективным, для Mozilla необходимо реализовать решение, которое еще лучше справляется с этой нагрузкой.
Для этого Mozilla разработала и добавила новый интерпретатор байт-кода. JavaScript к его движку рендеринга JavaScript, встроенному в Firefox 70. С выходом Firefox 70 в октябре следующего года Mozilla объявляет об улучшении управления кодом JavaScript с помощью нового интерпретатора кода, добавленного в его движок JavaScript.
Чтобы достичь этой цели, Mozilla объясняет, что В современных движках JavaScript каждая функция изначально выполняется в интерпретаторе кода.
Часто вызываемые функции компилируются в машинный код. Это называется JIT-компиляцией или компиляцией на лету. Относительно Firefox также включает интерпретатор кода JavaScript, написанный на C ++, и различные уровни JIT-компиляции.
Во-первых, у нас есть базовый JIT-компилятор, который компилирует каждый оператор байт-кода непосредственно в небольшой фрагмент машинного кода, используя встроенное кэширование как для производительности, так и для сбора информации для JIT-компилятора под названием IonMonkey или Ion.
В свою очередь, компилятор IonMonkey использует расширенную оптимизацию для генерации быстрого кода для критических параметров.
Следует отметить, что когда функция, которая уже компилируется, вызывается с новым типом аргумента, код функции может быть «деоптимизирован» и отброшен. В этом случае выполнение продолжается в базовом коде до следующей сборки Ion.
Хотя этот процесс интерпретации кода JavaScript до сих пор работал достаточно хорошо, команда Firefox объясняет, что столкнулся с некоторыми проблемами с первым часть состоит из интерпретатора C ++ и базового JIT-компилятора.
В самом деле, некоторые современные веб-приложения например, Google Docs или Gmail запустить столько JavaScript, что компилятор база и даже JIT-компилятор они могли потратить много времени, пытаясь скомпилировать тысячи функций.
Кроме того, интерпретатор C ++ работает очень медленно и не собирает информацию о типах, что задерживает базовую компиляцию. Одним из решений было бы вытащить его из потока, но это было бы риском для производительности.
Чтобы решить эти проблемы, специалисты Mozilla комментируют, что:
Базовый интерпретатор находится между интерпретатором C ++ и базовым JIT-компилятором и содержит элементы обоих уровней.
Выполняет все операторы байт-кода с фиксированным циклом интерпретатора (например, интерпретатор C ++) и использует методы встроенного кэширования для повышения производительности и сбора информации о типах (как это делает базовый JIT).
Создание переводчика - не новая идея. Но команда Firefox указывает здесь, что они нашли новый способ сделать это, повторно используя большую часть базового кода JIT-компилятора. Базовый JIT-компилятор - это модель JIT, что означает, что каждая инструкция промежуточного кода компилируется в практически фиксированную последовательность машинных инструкций, которые затем предлагаются в цикле интерпретации.
Кроме того, поскольку Разработчики Firefox хотели, чтобы базовый интерпретатор использовал точно такие же онлайн-кеши. и та же информация, что и JIT, была добавлена новая структура данных под названием JitScript.
JitScript содержит всю информацию о типах и встроенные структуры данных кэширования, используемые базовыми интерпретаторами и JIT-компилятором.
В этих новых реализациях основные данные компилятора функции теперь находятся только в машинном коде. Оттуда вся кэшированная информация и данные профилирования были перемещены в JitScript.
С другой стороны, поскольку базовый интерпретатор и JIT-компилятор идентичны, большая часть сгенерированного кода также может использоваться совместно.
Для этого был создан базовый класс BaselineCodeGen с двумя другими производными классами. Базовый компилятор использует первый класс BalineCompiler для компиляции байт-кода скрипта в машинный код.
Второй класс BaselineInterpreterGenerator используется для генерации кода для базового интерпретатора. А с помощью класса BaselineInterpreterGenerator команде Firefox удалось создать базовый интерпретатор.
источник: https://hacks.mozilla.org/