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

Одна из кажущихся волшебными вещей под капотом Интернета, которая меня заинтересовала, — это движок JavaScript.

Движок JavaScript — это программное обеспечение (я знаю, я тоже был разочарован, я определенно представлял себе какое-то оборудование в стиле стимпанк с поршнями), которое переводит ваши великолепные строки кода JavaScript в двоичный код, исполняемый нашими машинами.

Все основные браузеры разрабатывают свои собственные механизмы JavaScript. У Chrome есть V8, у Firefox работает SpiderMonkey (эволюционный продукт первого движка JavaScript, разработанный Бренданом Эйхом в 90-х годах для Netscape Navigator), у Microsoft Edge есть Chakra, у Safari есть Nitro. Node.js построен на движке Chrome V8. Устройство IoT также может иметь механизм JavaScript. Вы можете увидеть полный список движков JavaScript здесь.

Каждый движок JavaScript отвечает за использование правил и стандартов ECMAScript, установленных TC39 Ecma International.

Почему современные движки JavaScript выполняют компиляцию Just-In-Time

JavaScript — это язык с динамической типизацией.

let x = 8
let y = "Henlo fren"

Это означает, что всякий раз, когда вы объявляете переменную в JavaScript, вам не нужно явно указывать, какой тип информации хранит переменная x. Движок JavaScript проверяет тип при выполнении исходного кода.

При объявлении переменных в языке со статической типизацией, таком как C++, вы должны явно указать тип значения переменной.

int x = 8 
string y = "Henlo fren"

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

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

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

Но не бойтесь, здесь на помощь приходит компиляция Just-In-Time!

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

Когда Chrome был запущен в 2008 году, Google также представил свой движок V8, первый из современных движков JavaScript. Одной из основных особенностей V8 была компиляция Just-In-Time.

При компиляции с опережением процесс компиляции должен завершиться до того, как система запустит исполняемый машинный код. Благодаря этой новой функции движок V8 компилирует исходный код по мере необходимости, собирая информацию о типах по мере выполнения машинного кода, сгенерированного в процессе компиляции, а затем повторно компилирует исходный код на основе информации, собранной в процессе выполнения. . Обмен данными между двумя процессами ускоряет выполнение процесса выполнения.

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