Last active
February 21, 2024 06:21
-
-
Save dSalieri/5d33e93f700e3609da4e58e44fdcb286 to your computer and use it in GitHub Desktop.
Revisions
-
dSalieri revised this gist
Feb 21, 2024 . 1 changed file with 23 additions and 20 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -13,7 +13,10 @@ _**Последнее изменение документа**: 20.02.2024_ ### [Execution Contexts][execution-contexts] (Исполнительные Контексты) Итак [_execution context_][execution-context] (исполнительный контекст) - это устройство спецификации, которое используется для отслеживания оценки кода во время выполнения реализацией ECMAScript. > Реализация ECMAScript - это любой движок реализующий данную спецификацию, например V8. В любой момент времени существует не более одного [execution context][execution-context] на [agent][agent], который фактически выполняет код. Это известно как [_running execution context_][running-execution-context] (выполняемый исполнительный контекст) принадлежащий [agent][agent]. Все ссылки к [running execution context][running-execution-context] в спецификации ECMAScript расшифровываются как [running execution context][running-execution-context] принадлежащие [surrounding agent][surrounding-agent]. > [Agent][agent] - это другая абстракция/устройство ECMAScript, которая содержит в себе: `набор ECMAScript execution contexts`, [execution context stack][execution-context-stack], [running execution context][running-execution-context], `Agent Record` и `executing thread`. > > Итак последний компонент `executing thread` и занимается исполнением [execution contexts][execution-contexts]. О том как `executing thread` запускается - внe компетенций данной спецификации, вы лишь должны знать, что есть устройство [agent][agent], владеющее другими абстракциями/механизмами, среди которых есть компоненты связанные с [execution contexts][execution-contexts] и `executing thread`, которые в свою очередь подвластны управляющему ими [agent][agent]. @@ -65,22 +68,22 @@ _ECMAScript code execution contexts_ имеют дополнительные к [Execution context][execution-context] - это чисто механизм спецификации и не обязательно нужно соответствовать какому-либо конкретному артефакту реализации ECMAScript. Код ECMAScript не может напрямую получить доступ или наблюдение за [execution context][execution-context]. [execution-contexts]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-execution-contexts "Execution Contexts" [execution-context]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-execution-contexts "execution context" [execution-context-stack]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#execution-context-stack "execution context stack" [running-execution-context]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#running-execution-context "running execution context" [realm]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#realm "Realm" [realm-record]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#realm-record "Realm Record" [initialize-host-defined-realm]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-initializehostdefinedrealm "InitializeHostDefinedRealm" [agent]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#agent "agent" [surrounding-agent]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#surrounding-agent "surrounding agent" [module-record]: https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sec-abstract-module-records "Module Record" [script-record]: https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#script-record "Script Record" [function-object]: https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#function-object "function object" [environment-record]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-environment-records "Environment Record" [private-environment-record]: https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#privateenvironment-record "PrivateEnvironment Record" [private-names]: https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-private-names "Private Names" [prod-script]: https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#prod-Script "production Script" [prod-module]: https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#prod-Module "production Module" [prod-variablestatement]: https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#prod-VariableStatement "production VariableStatement" [prod-classelement]: https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#prod-ClassElement "production ClassElement" -
dSalieri revised this gist
Feb 21, 2024 . 1 changed file with 1 addition and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -41,6 +41,7 @@ _**Последнее изменение документа**: 20.02.2024_ > Концептуально, [Realm][realm] представляет из себя набор ресурсов необходимых для выполнения кода ECMAScript. В качестве примера, [Realm][realm] содержит в себе глобальный объект, в котором присутствуют многие известные вам объекты, функции и методы. Значение компонента Function относящегося к [running execution context][running-execution-context] обычно называют _active function object_. > [Function object][function-object] - это объект, у которого есть внутреннее поле `[[Call]]`. По сути когда вы в программе оперируете функциями это и есть [function object][function-object]. _ECMAScript code execution contexts_ имеют дополнительные компоненты состояний: > [Execution contexts][execution-contexts] имеют дополнительные поля если созданы кодом ECMAScript. Например исходный [execution context][execution-context] (исходный это тот, что создан операцией [InitializeHostDefinedRealm][initialize-host-defined-realm]) их не имеет, так как его создает окружающая среда программы, которая выполняет код ECMAScript. -
dSalieri revised this gist
Feb 20, 2024 . 1 changed file with 8 additions and 8 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -11,17 +11,17 @@ _**Последнее изменение документа**: 20.02.2024_ --- ### [Execution Contexts][execution-contexts] (Исполнительные Контексты) Итак [_execution context_][execution-context] (исполнительный контекст) - это устройство спецификации, которое используется для отслеживания оценки кода времени выполнения с помощью реализации ECMAScript. В любой момент времени существует не более одного [execution context][execution-context] на [agent][agent], который фактически выполняет код. Это известно как [_running execution context_][running-execution-context] (выполняемый исполнительный контекст) принадлежащий [agent][agent]. Все ссылки к [running execution context][running-execution-context] в спецификации ECMAScript расшифровываются как [running execution context][running-execution-context] принадлежащие [surrounding agent][surrounding-agent]. > [Agent][agent] - это другая абстракция/устройство ECMAScript, которая содержит в себе: `набор ECMAScript execution contexts`, [execution context stack][execution-context-stack], [running execution context][running-execution-context], `Agent Record` и `executing thread`. > > Итак последний компонент `executing thread` и занимается исполнением [execution contexts][execution-contexts]. О том как `executing thread` запускается - внe компетенций данной спецификации, вы лишь должны знать, что есть устройство [agent][agent], владеющее другими абстракциями/механизмами, среди которых есть компоненты связанные с [execution contexts][execution-contexts] и `executing thread`, которые в свою очередь подвластны управляющему ими [agent][agent]. > > Конечно это не все подробности об [agent][agent], но они нам и не нужны, данное пояснение нужно было для того чтобы понять откуда идут [execution contexts][execution-contexts]; подробнее об [agent][agent] в спецификации ECMAScript. [_Execution context stack_][execution-context-stack] (стек исполнительного контекста) - используется для отслеживания [execution contexts][execution-contexts]. Тот [execution context][execution-context], который находится на вершине стека именуется [running execution context][running-execution-context]. Новый [execution context][execution-context] создается всякий раз, когда управление передается от исполняемого кода, связанного с текущим [running execution context][running-execution-context], к исполняемому коду, который не связан с этим [execution context][execution-context]. > Например: Переход от [execution context][execution-context] скрипта к [execution context][execution-context] функции или же, когда идет рекурсивный вызов функции, тогда происходит множество переходов новосозданных [execution context][execution-context] созданных в результате рекурсии. Вновь созданный [execution context][execution-context] помещается в стек и становится [running execution context][running-execution-context]. @@ -30,15 +30,15 @@ _**Последнее изменение документа**: 20.02.2024_ |Компонент |Цель| |---------------------|----| |code evaluation state|Любое состояние необходимое для выполнения, приостановки и возобновления оценки кода связанного с этим [execution context][execution-context]| |Function |Если этот [execution context][execution-context] оценивает код [function object][function-object], тогда значение этого компонента является этот же [function object][function-object]. Если [execution context][execution-context] оценивает код [_Script_][prod-script] или [_Module_][prod-module], тогда значение компонента **null**| |[Realm][realm] |[Realm Record][realm-record] из которой связанный код получает доступ к ресурсам ECMAScript| |ScriptOrModule |[Module Record][module-record] или [Script Record][script-record] из которого исходит связанный код. Если нет исходного скрипта или модуля, как в случае с исходным [execution context][execution-context], созданным в [InitializeHostDefinedRealm][initialize-host-defined-realm], то значение равно **null**| Оценка кода с помощью [running execution context][running-execution-context] может быть приостановлена в различных точках определенных в рамках спецификации ECMAScript. Как только [running execution context][running-execution-context] приостановлен, другой [execution context][execution-context] может стать [running execution context][running-execution-context] и начать оценивание собственного кода. Позже в другой момент времени приостановленный [execution context][execution-context] может снова стать [running execution context][running-execution-context] и продолжить оценивание его кода в том месте где в прошлый раз произошла приостановка. Переход статуса [running execution context][running-execution-context] между [execution contexts][execution-contexts] обычно происходит в стек-подобной манере last-in/first-out (последний зашел/первый вышел). Однако, некоторые возможности ECMAScript требуют переходов [running execution context][running-execution-context], которые не соответствуют LIFO (перевод и расшифровка предложением ранее). > Когда LIFO не соблюдается это означает, что ранее в использовании [execution context][execution-context] вновь помещается в стек. Такое возможно в функциях-генераторах и асинхронных функциях. Значение компонента [Realm][realm] относящегося к [running execution context][running-execution-context] обычно называют _current Realm Record_. > Концептуально, [Realm][realm] представляет из себя набор ресурсов необходимых для выполнения кода ECMAScript. В качестве примера, [Realm][realm] содержит в себе глобальный объект, в котором присутствуют многие известные вам объекты, функции и методы. Значение компонента Function относящегося к [running execution context][running-execution-context] обычно называют _active function object_. @@ -52,7 +52,7 @@ _ECMAScript code execution contexts_ имеют дополнительные к |PrivateEnvironment |Идентифицирует [PrivateEnvironment Record][private-environment-record], которая хранит [Private Names][private-names] созданные [_ClassElements_][prod-classelement] в ближайшем содержащем классе. **null** если не существует никакого ближайшего класса| Компоненты _LexicalEnvironment_ и _VariableEnvironment_ принадлежащие к [execution context][execution-context] - всегда являются [Environment Records][environment-record]. > [Environment Record][environment-record] - это тип спецификации, используемый для определения связи идентификаторов с конкретными переменными и функциями на основе лексической структуры вложенности кода ECMAScript. [Execution context][execution-context] представляющий оценку Generators (т.е функция такого типа) имеет следующие дополнительные компоненты: -
dSalieri created this gist
Feb 20, 2024 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,85 @@ _**Автор**: [dSalieri](https://t.me/d_Salieri)_ _**Версия ECMAScript, используемая в объяснении**: Draft ECMA-262 / February 19, 2024_ _**Последнее изменение документа**: 20.02.2024_ --- > [!important] > Раздел посвященный устройству спецификации [_**execution contexts**_][execution-contexts]. Так как спецификация сама отлично описывает данный механизм, то решено было просто перевести с внедрением некоторых пояснительных сносок. --- ### [Execution Contexts (Исполнительные контексты)][execution-contexts] Итак [_execution context_][execution-context] (исполнительный контекст) - это устройство спецификации, которое используется для отслеживания оценки кода времени выполнения с помощью реализации ECMAScript. В любой момент времени существует не более одного [execution context][execution-context] на [agent][agent], который фактически выполняет код. Это известно как [_running execution context_][running-execution-context] (работающий исполнительный контекст) принадлежащий [agent][agent]. Все ссылки к [running execution context][running-execution-context] в спецификации ECMAScript расшифровываются как [running execution context][running-execution-context] принадлежащие [surrounding agent][surrounding-agent]. > [Agent][agent] - это другая абстракция/устройство ECMAScript, которая содержит в себе: `набор ECMAScript execution contexts`, [execution context stack][execution-context-stack], [running execution context][running-execution-context], `Agent Record` и `executing thread`. > > Итак последний компонент `executing thread` и занимается исполнением [execution contexts][execution-contexts]. О том как `executing thread` запускается - внe компетенций данной спецификации, вы лишь должны знать, что есть устройство [agent][agent], владеющее другими абстракциями/механизмами, среди которых есть компоненты связанные с [execution contexts][execution-contexts] и `executing thread`, которые в свою очередь подвластны управляющему ими [agent][agent]. > > Конечно это не все подробности об [agent][agent], но они нам и не нужны, данное углубление нужно было для того чтобы понять откуда идут [execution contexts][execution-contexts]; подробнее об [agent][agent] в спецификации ECMAScript. [_Execution context stack_][execution-context-stack] (стек исполнительного контекста) - используется для отслеживания [execution contexts][execution-contexts]. Тот [execution context][execution-context], который находится на вершине стека именуется [running execution context][running-execution-context]. Новый [execution context][execution-context] создается всякий раз, когда управление передается от исполняемого кода, связанного с текущим [running execution context][running-execution-context], к исполняемому коду, который не связан с этим [execution context][execution-context]. > Например: Переход от [execution context][execution-context] скрипта к [execution context][execution-context] функции или же когда идет рекурсивный вызов функции, тогда происходит от одного к другому множество переходов новосозданных [execution context][execution-context]. Вновь созданный [execution context][execution-context] помещается в стек и становится [running execution context][running-execution-context]. [Execution context][execution-context] содержит любое состояние конкретной реализации для отслеживания исполнительного прогресса связанного с ним кода. Каждый [execution context][execution-context] имеет как минимум компоненты состояний, перечисленные в таблице ниже: |Компонент |Цель| |---------------------|----| |code evaluation state|Любое состояние необходимое для выполнения, приостановки и возобновления оценки кода связанного с этим [execution context][execution-context]| |Function |Если этот [execution context][execution-context] оценивает код [функционального объекта][function-object], тогда значение этого компонента является этот же [функциональный объект][function-object]. Если [execution context][execution-context] оценивает код [_Script_][prod-script] или [_Module_][prod-module], тогда значение компонента **null**| |[Realm][realm] |[Realm Record][realm-record] из которой связанный код получает доступ к ресурсам ECMAScript| |ScriptOrModule |[Module Record][module-record] или [Script Record][script-record] из которого исходит связанный код. Если нет исходного скрипта или модуля, как в случае с исходным [execution context][execution-context], созданным в [InitializeHostDefinedRealm][initialize-host-defined-realm], то значение равно **null**| Оценка кода с помощью [running execution context][running-execution-context] может быть приостановлена в различных точках определенных в рамках спецификации ECMAScript. Как только [running execution context][running-execution-context] приостановлен, другой [execution context][execution-context] может стать [running execution context][running-execution-context] и начать оценивание его кода. Позже в другой момент времени приостановленный [execution context][execution-context] может снова стать [running execution context][running-execution-context] и продолжить оценивание его кода в том месте где в прошлый раз произошла приостановка. Переход статуса [running execution context][running-execution-context] между [execution contexts][execution-contexts] обычно происходит в стек-подобной манере last-in/first-out (последний зашел/первый вышел). Однако, некоторые возможности ECMAScript требуют переходов [running execution context][running-execution-context], которые не соответствуют LIFO (перевод и расшифровка предложением ранее). > Когда LIFO не соблюдается это означает, что ранее в использовании [execution context][execution-context] вновь помещается в стек. Такое возможно в функциях-генераторах и асинхронных функциях. Значение компонента [Realm][realm] относящегося к [running execution context][running-execution-context] обычно называют _current Realm Record_. > Концептуально, [Realm][realm] представляет из себя набор ресурсов необходимых для выполнения кода ECMAScript. В качестве примера, [Realm][realm] содержит в себе глобальный объект, в котором присутствуют многие известные вам функции и методы. Значение компонента Function относящегося к [running execution context][running-execution-context] обычно называют _active function object_. _ECMAScript code execution contexts_ имеют дополнительные компоненты состояний: > [Execution contexts][execution-contexts] имеют дополнительные поля если созданы кодом ECMAScript. Например исходный [execution context][execution-context] (исходный это тот, что создан операцией [InitializeHostDefinedRealm][initialize-host-defined-realm]) их не имеет, так как его создает окружающая среда программы, которая выполняет код ECMAScript. |Компонент |Цель| |-------------------|----| |LexicalEnvironment |Идентифицирует [Environment Record][environment-record], которая используется для разрешения ссылок на идентификаторы сделаных кодом в этом [execution context][execution-context]| |VariableEnvironment|Идентифицирует [Environment Record][environment-record], которая хранит привязки созданные [_VariableStatements_][prod-variablestatement] в этом [execution context][execution-context]| |PrivateEnvironment |Идентифицирует [PrivateEnvironment Record][private-environment-record], которая хранит [Private Names][private-names] созданные [_ClassElements_][prod-classelement] в ближайшем содержащем классе. **null** если не существует никакого ближайшего класса| Компоненты _LexicalEnvironment_ и _VariableEnvironment_ принадлежащие к [execution context][execution-context] - всегда являются [Environment Records][environment-record]. > [Environment Records][environment-record] - это тип спецификации, используемый для определения связи идентификаторов с конкретными переменными и функциями на основе лексической структуры вложенности кода ECMAScript. [Execution context][execution-context] представляющий оценку Generators (т.е функция такого типа) имеет следующие дополнительные компоненты: |Компонент|Цель| |---------|----| |Generator|Generator, который оценивает этот [execution context][execution-context]| В большинстве ситуаций только [running execution context][running-execution-context] (это верх [execution context stack][execution-context-stack]) напрямую управляется алгоритмами в спецификации ECMAScript. Следовательно когда термины "LexicalEnvironment" и "VariableEnvironment" используются без уточнения, они ссылаются на компоненты [running execution context][running-execution-context]. [Execution context][execution-context] - это чисто механизм спецификации и не обязательно нужно соответствовать какому-либо конкретному артефакту реализации ECMAScript. Код ECMAScript не может напрямую получить доступ или наблюдение за [execution context][execution-context]. [execution-contexts]: https://tc39.es/ecma262/#sec-execution-contexts "Execution Contexts" [execution-context]: https://tc39.es/ecma262/#sec-execution-contexts "execution context" [execution-context-stack]: https://tc39.es/ecma262/#execution-context-stack "execution context stack" [running-execution-context]: https://tc39.es/ecma262/#running-execution-context "running execution context" [realm]: https://tc39.es/ecma262/#realm "Realm" [realm-record]: https://tc39.es/ecma262/#realm-record "Realm Record" [initialize-host-defined-realm]: https://tc39.es/ecma262/#sec-initializehostdefinedrealm "InitializeHostDefinedRealm" [agent]: https://tc39.es/ecma262/#agent "agent" [surrounding-agent]: https://tc39.es/ecma262/#surrounding-agent "surrounding agent" [module-record]: https://tc39.es/ecma262/#sec-abstract-module-records "Module Record" [script-record]: https://tc39.es/ecma262/#script-record "Script Record" [function-object]: https://tc39.es/ecma262/#function-object "function object" [environment-record]: https://tc39.es/ecma262/#sec-environment-records "Environment Record" [private-environment-record]: https://tc39.es/ecma262/#privateenvironment-record "PrivateEnvironment Record" [private-names]: https://tc39.es/ecma262/#sec-private-names "Private Names" [prod-script]: https://tc39.es/ecma262/#prod-Script "production Script" [prod-module]: https://tc39.es/ecma262/#prod-Module "production Module" [prod-variablestatement]: https://tc39.es/ecma262/#prod-VariableStatement "production VariableStatement" [prod-classelement]: https://tc39.es/ecma262/#prod-ClassElement "production ClassElement"