JavaScript-движок

Прямо сейчас мы работаем с JavaScript каждый день. Мы пишем код и выполняем его на наших компьютерах. Мы считаем само собой разумеющимся, что наши компьютерыпросто«знают», как его выполнять. Ну, конечно, компьютер сам не знает, что это такое и как это исполнить. Именно благодаря движку JavaScript компьютеры могут распознавать и переводить эти коды.

Что такое JavaScript-движок?

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

Существуют разные движки JavaScript (JS):

1. Chakra: движок JavaScript, используемый в Microsoft Edge.

2. SpiderMonkey: Движок JavaScript в приложениях Mozilla Gecko, включая Firefox.

3. JavaScriptCore: интерпретатор JavaScript и JIT, первоначально производные от KJS. Он используется в проекте WebKit и таких приложениях, как Safari. Также известен как Nitro, SquirrelFish и SquirrelFish Extreme.

4. V8: движок JavaScript, используемый в Google Chrome, Node.js и V8.NET (наиболее широко используемый).

…… и многое другое

Chrome V8

V8 был создан Google для Chrome. Сам движок написан на C++. Он может работать автономно или может быть встроен в любое приложение C++, такое как Node JS (со встроенным V8).

Оперативная компиляция

Все современные JS-движки реализуют JIT-компиляцию. Это означает, что мы не сначала компилируем заранее, завершаем компиляцию и запускаем код, а смешиваем два шага вместе, используя информацию для запуска кода и повторной компиляции кода. Мы компилируем исходный код по мере необходимости, собираем информацию при запуске, а затем перекомпилируем код. В C++ эти два шага разделены, но в JavaScript компиляция и выполнение выполняются одновременно, и для ускорения выполнения существует обратная связь, идущая туда и обратно.

Что происходит внутри…

Оптимизация компилятора

Современные современные движки имеют как минимум два компилятора — один из них является оптимизирующим компилятором, а другой — базовым компилятором. V8 использует Ignition в качестве базового компилятора и Turbofan в качестве оптимизирующего компилятора.

Оптимизированный компиляторповторно компилирует HOT FUNCTION с информацией о типе из предыдущего выполнения. Это означает, что часто используемые вами функции будут считаться "горячими" и повторно компилироваться компилятором. что ускоряет выполнение. Компилятор запускает код несколько раз и собирает информацию о типах, чтобы проверить, «горячий» он или нет. Когда мы оптимизируем, повторная компиляция предполагает, что она увидит тот же тип, что и раньше. Он предполагает определенные условия, невыполнение которых приводит к тому, что код возвращается к базовому коду.

Поскольку JavaScript имеет динамический тип, когда вы меняете входные данные для своих функций, ваша оптимизированная функция не будет работать с другими типами объектов. В результате вам придется деоптимизировать его, что приведет к тому, что код вернется к базовому компилятору. Давайте разберемся в этом на примере:

Эта простая функция просто возвращает свойство «x» объекта. Хотя это просто доступ к свойству, на самом деле компилятору требуется много работы для этого. Это связано с тем, что компилятор ничего не знает об объекте, поэтому ему необходимо выяснить, имеет ли этот объект свойство «x», где «x» находится в цепочке прототипов и где находится память для хранения значения « х' есть.

Чтобы понять это, нам сначала нужно знать, как объект внутренне представлен:

Компилятор постоянно проверяет тип объектов. Если вы определите «y» перед «x», это будет другой тип. В нашей функции #obj мы запускаем эту функцию несколько раз. Хотя каждый раз значения свойств разные — внутренне все они соответствуют одному и тому же типу объекта.

Вот как это оптимизируется за экраном:

Выводы

Надеюсь, это поможет вам лучше понять, как работает JavaScript и почему он быстрый. В этом блоге мы рассмотрели:

  • Что такое JS-движок
  • Как коды JS оптимизируются внутри (не меняйте свой тип, если хотите всегда оптимизировать свой код!)

Ресурсы:

Учебное пособие по Node JS https://www.youtube.com/watch?v=86tgU7UaJmU

JavaScript-движок V8 https://v8.dev/

Движок JavaScript https://www.youtube.com/watch?v=p-iiEDtpy6I

Список движков ECMAScript https://en.wikipedia.org/wiki/List_of_ECMAScript_engines