Вы когда-нибудь задумывались, как работает JavaScript Engine «под капотом»? Что происходит в фоновом режиме при запуске кода JavaScript?

Что ж, изучение JavaScript - это не только изучение синтаксиса и семантики. Речь идет не только о том, чтобы понять, как все работает под капотом. Как все работает за кадром!

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

Прежде всего, давайте разберемся, что на самом деле представляет собой движок JavaScript?

Проще говоря, движок JavaScript - это не что иное, как программа, написанная на C ++. Каждый браузер имеет собственную реализацию JavaScript Engine. Например, движок JavaScript в Chrome называется V8 Engine, движок JavaScript в Firefox - SpiderMonkey и так далее. Механизм JavaScript считывает код JavaScript, который мы пишем, и преобразует его в исполняемые машиной инструкции для браузера. Механизм JavaScript состоит из двух основных частей, называемых кучей памяти и стеком вызовов.

Куча памяти - это место, где происходит выделение памяти.

CallStack - это место, где движок отслеживает, где находится наш код и его выполнение.

Давайте взглянем на движок Chrome JavaScript (движок V8)

Прежде всего, анализируется код в файле JavaScript. Затем он преобразуется в абстрактное синтаксическое дерево (AST), а затем этот код передается в интерпретатор (в движке V8 интерпретатор называется Ignition). Интерпретатор принимает этот AST и генерирует байт-код (помните, что байт-код - это код, который не такой низкий, как машинный код, но это код, который может быть интерпретирован JavaScript Engine для запуска наших программ). Затем у нас есть нечто, называемое Profiler, которое отслеживает наш код во время его выполнения и делает заметки о том, как мы можем оптимизировать этот код. Таким образом, в конечном итоге наш интерпретатор с помощью Profiler передает код JIT-компилятору для выполнения оптимизаций. Компилятор во время работы приложения принимает код, компилирует его или модифицирует, выполняя оптимизацию. Затем он заменяет разделы, в которых его можно улучшить с помощью оптимизированного кода. И с этого момента вместо более медленного байтового кода используется оптимизированный код.

Таким образом, мы увидели, как интерпретатор позволяет нам запускать код сразу, а компилятор и профилировщик позволяют нам оптимизировать этот код во время его выполнения!

Итак, вот как работает двигатель V8. По сути, все движки JavaScript работают одинаково, но тут и там есть несколько незначительных реализаций!