Фактическая реализация стека выполнения JS версии 8

#v8 #executioncontext

#v8 #executioncontext

Вопрос:

Мне просто любопытно. Как именно движки JavaScript внутренне реализуют инструкции стека выполнения EMCAScript.

Если вы посмотрите на приведенный ниже код, ECMAScript ожидает, что мы создадим глобальный контекст выполнения с записью среды, которая будет содержать переменные fun1, res и c. Затем, когда вызывается функция fun1, мы создадим новый контекст выполнения функции, который будет иметь запись среды, которая будет содержать переменные a и b и связанные значения.

В этом сообщении в блоге от команды V8 Blazingly fast parsing, часть 2: ленивый синтаксический анализ, ясно, что внутренне они используют стек памяти для управления вызовами функций, если на переменные не влияет закрытие.

Мне любопытно, будут ли переменные res и c в приведенном ниже коде также помещены в стек? Будут ли на самом деле созданы записи среды для глобального контекста и контекста выполнения функций для простого кода, подобного приведенному в примере.

Любые ответы будут оценены с полным пониманием того, что ответ в этом случае в конечном счете не имеет значения, насколько это касается использования JS.

 let fun1 = function(a){
let b = 2;
return a b;
}
let res = fun1(4);
let c = ”done";

  

Ответ №1:

(Разработчик версии 8 здесь.)

Как именно

Точные детали сложны. Прочитайте исходный код, если вы действительно заботитесь о них.

являются ли движки JavaScript внутренней реализацией

Ответ будет разным для каждого движка. Это также будет меняться со временем. Даже если вы увеличите масштаб одной версии одного движка, ответ, скорее всего, будет «это зависит».

Мне любопытно, будут ли переменные res and c в приведенном ниже коде также помещены в стек?

Глобальные переменные — это свойства глобального объекта. Значения этих переменных могут или не могут быть кратковременно сохранены в стеке перед сохранением в качестве глобальных свойств объекта.

Будут ли на самом деле созданы записи среды для глобального контекста и контекста выполнения функций для простого кода, подобного приведенному в примере.

Да — так или иначе. Наличие глобального объекта и сохранение в нем свойств является одним из способов создания «записи среды» для глобального контекста.

Эта абстракция является ключевым моментом. Не ожидайте, что класс EnvironmentalRecord или что-то в этом роде. Это абстрактная концепция, описывающая представление о том, что движок должен иметь какой-то способ хранения переменных для функции. Это может быть слот во фрейме стека, или объект «context», или (в оптимизирующем компиляторе) некоторый «живой диапазон» некоторого регистра, или любое количество других вариантов внутренней реализации. Также стоит отметить, что существует различие между разрешением области во время компиляции и фактическим хранением значений во время выполнения: для первого движку, возможно, придется хранить больше метаданных и использовать другую внутреннюю реализацию, чем для последнего.