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