Skip to content

Instantly share code, notes, and snippets.

@dSalieri
Last active February 21, 2024 06:21
Show Gist options
  • Save dSalieri/5d33e93f700e3609da4e58e44fdcb286 to your computer and use it in GitHub Desktop.
Save dSalieri/5d33e93f700e3609da4e58e44fdcb286 to your computer and use it in GitHub Desktop.
Исполнительные контексты в ECMAScript

Автор: dSalieri

Версия ECMAScript, используемая в объяснении: Draft ECMA-262 / February 19, 2024

Последнее изменение документа: 20.02.2024


Important

Раздел посвященный устройству спецификации execution contexts. Так как спецификация сама отлично описывает данный механизм, то решено было просто перевести с внедрением некоторых пояснительных сносок.


Execution Contexts (Исполнительные Контексты)

Итак execution context (исполнительный контекст) - это устройство спецификации, которое используется для отслеживания оценки кода во время выполнения реализацией ECMAScript.

Реализация ECMAScript - это любой движок реализующий данную спецификацию, например V8.

В любой момент времени существует не более одного execution context на agent, который фактически выполняет код. Это известно как running execution context (выполняемый исполнительный контекст) принадлежащий agent. Все ссылки к running execution context в спецификации ECMAScript расшифровываются как running execution context принадлежащие surrounding agent.

Agent - это другая абстракция/устройство ECMAScript, которая содержит в себе: набор ECMAScript execution contexts, execution context stack, running execution context, Agent Record и executing thread.

Итак последний компонент executing thread и занимается исполнением execution contexts. О том как executing thread запускается - внe компетенций данной спецификации, вы лишь должны знать, что есть устройство agent, владеющее другими абстракциями/механизмами, среди которых есть компоненты связанные с execution contexts и executing thread, которые в свою очередь подвластны управляющему ими agent.

Конечно это не все подробности об agent, но они нам и не нужны, данное пояснение нужно было для того чтобы понять откуда идут execution contexts; подробнее об agent в спецификации ECMAScript.

Execution context stack (стек исполнительного контекста) - используется для отслеживания execution contexts. Тот execution context, который находится на вершине стека именуется running execution context. Новый execution context создается всякий раз, когда управление передается от исполняемого кода, связанного с текущим running execution context, к исполняемому коду, который не связан с этим execution context.

Например: Переход от execution context скрипта к execution context функции или же, когда идет рекурсивный вызов функции, тогда происходит множество переходов новосозданных execution context созданных в результате рекурсии.

Вновь созданный execution context помещается в стек и становится running execution context.

Execution context содержит любое состояние конкретной реализации для отслеживания исполнительного прогресса связанного с ним кода. Каждый execution context имеет как минимум компоненты состояний, перечисленные в таблице ниже:

Компонент Цель
code evaluation state Любое состояние необходимое для выполнения, приостановки и возобновления оценки кода связанного с этим execution context
Function Если этот execution context оценивает код function object, тогда значение этого компонента является этот же function object. Если execution context оценивает код Script или Module, тогда значение компонента null
Realm Realm Record из которой связанный код получает доступ к ресурсам ECMAScript
ScriptOrModule Module Record или Script Record из которого исходит связанный код. Если нет исходного скрипта или модуля, как в случае с исходным execution context, созданным в InitializeHostDefinedRealm, то значение равно null

Оценка кода с помощью running execution context может быть приостановлена в различных точках определенных в рамках спецификации ECMAScript. Как только running execution context приостановлен, другой execution context может стать running execution context и начать оценивание собственного кода. Позже в другой момент времени приостановленный execution context может снова стать running execution context и продолжить оценивание его кода в том месте где в прошлый раз произошла приостановка. Переход статуса running execution context между execution contexts обычно происходит в стек-подобной манере last-in/first-out (последний зашел/первый вышел). Однако, некоторые возможности ECMAScript требуют переходов running execution context, которые не соответствуют LIFO (перевод и расшифровка предложением ранее).

Когда LIFO не соблюдается это означает, что ранее в использовании execution context вновь помещается в стек. Такое возможно в функциях-генераторах и асинхронных функциях.

Значение компонента Realm относящегося к running execution context обычно называют current Realm Record.

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

Значение компонента Function относящегося к running execution context обычно называют active function object.

Function object - это объект, у которого есть внутреннее поле [[Call]]. По сути когда вы в программе оперируете функциями это и есть function object.

ECMAScript code execution contexts имеют дополнительные компоненты состояний:

Execution contexts имеют дополнительные поля если созданы кодом ECMAScript. Например исходный execution context (исходный это тот, что создан операцией InitializeHostDefinedRealm) их не имеет, так как его создает окружающая среда программы, которая выполняет код ECMAScript.

Компонент Цель
LexicalEnvironment Идентифицирует Environment Record, которая используется для разрешения ссылок на идентификаторы сделаных кодом в этом execution context
VariableEnvironment Идентифицирует Environment Record, которая хранит привязки созданные VariableStatements в этом execution context
PrivateEnvironment Идентифицирует PrivateEnvironment Record, которая хранит Private Names созданные ClassElements в ближайшем содержащем классе. null если не существует никакого ближайшего класса

Компоненты LexicalEnvironment и VariableEnvironment принадлежащие к execution context - всегда являются Environment Records.

Environment Record - это тип спецификации, используемый для определения связи идентификаторов с конкретными переменными и функциями на основе лексической структуры вложенности кода ECMAScript.

Execution context представляющий оценку Generators (т.е функция такого типа) имеет следующие дополнительные компоненты:

Компонент Цель
Generator Generator, который оценивает этот execution context

В большинстве ситуаций только running execution context (это верх execution context stack) напрямую управляется алгоритмами в спецификации ECMAScript. Следовательно когда термины "LexicalEnvironment" и "VariableEnvironment" используются без уточнения, они ссылаются на компоненты running execution context.

Execution context - это чисто механизм спецификации и не обязательно нужно соответствовать какому-либо конкретному артефакту реализации ECMAScript. Код ECMAScript не может напрямую получить доступ или наблюдение за execution context.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment