В разных браузерах используются разные движки Javascript (SpiderMonkey в Firefox, JavaScriptCore в Safari, Chakra в Edge и т. д.), и все эти движки реализуют стандарт ECMA ES-262, также называемый ECMAScript, стандарт, используемый JavaScript. Но движок V8, разработанный Google на C++, остается самым мощным и используется в Google Chrome и Node.js. Этот движок — это инструмент, который берет наш JavaScript и выполняет его во время просмотра в Chrome. Поскольку движок JavaScript не зависит от браузера, в котором он размещен, он способствовал росту Node.js, предоставляя невероятное количество кода на стороне сервера.

Процесс движка JS

Парсер

После того, как мы загрузим исходный код, нам нужно изменить его так, чтобы компилятор мог его понять. Этот процесс называется парсингом и состоит из двух частей: сканера и самого парсера. Анализатор HTML обнаруживает тег script с источником. Исходный код внутри этого сценария загружается в виде потока байтов UTF-16 в декодер потока байтов. Затем этот декодер потока байтов декодирует байты в токен, который отправляется парсеру. Движок старается избегать парсинга кода, который не нужен сразу, чтобы сэкономить время.

АСТ

В следующем процессе создается абстрактное синтаксическое дерево (AST) с узлами, которые парсер создает на основе полученных им токенов.

Переводчик

Этот шаг проходит через AST и в конце генерирует байт-код. Код читается построчно. AST удаляется в процессе генерации байт-кода при очистке памяти. V8 использует интерпретатор под названием Ignition. У него есть нечто, называемое аккумулятором — место, где вы можете хранить/считывать значения.

Профилировщик

Profiler отслеживает и наблюдает за кодом, чтобы оптимизировать его. Код, который можно оптимизировать, передается компилятору Just-In-Time (JIT), поэтому его можно компилировать и запускать быстрее.

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

Зажигание и профилировщик не уводят нас так далеко. Когда функция становится достаточно горячей, компилятор оптимизирует ее, чтобы сделать и работать быстрее. Компилятор создает перевод кода, который был написан до профиля, и создает более машиночитаемый язык более низкого уровня. Современные примеры компиляторов включают Babel и TypeScript (строгий синтаксический надмножество JavaScript и добавление в язык необязательных статических типов).

Оптимизированный код

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

Основные выводы из этого процесса должны заключаться в том, что движок V8 является основой Google Chrome и других веб-браузеров на основе Chromium и отличается от других движков JS, поскольку он напрямую преобразует сценарии в машинный код без создания промежуточного кода.