Я немного смущен, может кто-нибудь помочь описать, Какая разница между JavaScript Engine и JavaScript Runtime Environment. BTW, Event Loop был реализован в Engine или Runtime?
В чем разница между JavaScript Engine и JavaScript Runtime Environment
Ответ 1
В отличие от C и других скомпилированных языков, Javascript запускается в контейнере - программе, которая считывает ваши js-коды и запускает их. Эта программа должна делать две вещи
- проанализируйте свой код и преобразуйте его в исполняемые команды
- предоставить некоторые объекты javascript, чтобы он мог взаимодействовать с внешним миром.
Первая часть называется Engine, вторая - Runtime.
Например, Chrome Browser и node.js используют тот же движок - V8, но их Runtimes разные: в Chrome у вас есть объекты window
, DOM и т.д., а node дает вам require
, Буферы и процессы.
Ответ 2
Предположим сначала представить компиляцию JavaScript с использованием Ahead-Of-Time.
Компилятор переведет код JavaScript, например, собственный машинный код x86, который вы можете запустить. Однако в JavaScript есть некоторые вещи, которые происходят во время выполнения, и поэтому их нельзя статически компилировать. Сбор мусора, например, или отражение. Таким образом, для того, чтобы программа запускалась, во время выполнения должны быть какие-то службы поддержки, такие как сборщик мусора и система отражения. Кроме того, JavaScript имеет eval
, что означает, что (в нашей гипотетической скомпилированной реализации) сам компилятор или какой-либо другой интерпретатор должны быть доступны во время выполнения.
Позвольте этим службам поддержки Runtime.
Вторая вещь, которая должна быть доступна для программы, - это такие объекты, как Array
, Function
, Object
и т.д. и такие функции, как forEach
. Этот набор объектов и функций, которые должны быть доступны программе из get-go, обычно называется базовой библиотекой или базовой библиотекой. Для языка, такого как JavaScript, который предназначен для встраивания, есть также дополнительные библиотеки, которые предполагается присутствовать в зависимости от контекста. Например, для JavaScript, встроенного в браузер, мы ожидаем, что объекты и функции DOM и глобальные объекты window
и document
и т.д. Будут существовать. Они также могут считаться частью основной библиотеки.
И, наконец, давайте теперь забудем о нашем гипотетическом компиляторе и посмотрим на интерпретатора (или JIT-компилятор или механизм смешанного режима или байт-код VM). Здесь интерпретатор (или JIT, или что-то еще) является третьим кусочком головоломки. Это то, что на самом деле выполняет программу JavaScript. (Ну, технически, JIT не выполняется, он компилируется, а затем выполняется другое.)
Терминология не на 100% понятна: иногда только службы поддержки Runtime называются средой выполнения, иногда также включена базовая библиотека.
Механизм выполнения ссылается либо на интерпретатор (JIT, VM,...), либо на комбинацию интерпретатора и среды выполнения. Компилятор никогда не называется механизмом выполнения (он ничего не выполняет, просто переводит на другой язык), а термин "Механизм выполнения" редко используется для ссылки на статически скомпилированную реализацию.
Цикл событий является частью среды хоста, а не реализацией JavaScript.
Ответ 3
Представьте, что робот играет музыку:
- Код JavaScript - это музыкальные заметки для робота.
- Механизм TheJavaScript был бы роботом, который мог бы понимать заметки и действовать на нем.
- Время выполнения JavaScript - это инструменты, которые робот может использовать для воспроизведения музыки.
Представьте, что робот выдает огонь:
- Код JavaScript будет инструкцией для робота, чтобы потушить огонь.
- Механизм JavaScript будет роботом, который может понять инструкции и действовать на нем.
- Время выполнения JavaScript - это пожарная машина и водяной пистолет.