1. Как устроена спецификация ECMAScript и как её читать
Как устроена спецификация ECMAScript и как её читать
ECMAScript — это стандарт языка, который реализуют движки JavaScript (V8, SpiderMonkey, JavaScriptCore и другие). В этом курсе мы будем смотреть на JavaScript не как на набор «фич», а как на систему, описанную спецификацией: термины, модели выполнения, алгоритмы и формальные правила.
Ключевая идея: спецификация не пытается быть учебником. Она фиксирует наблюдаемое поведение и делает это максимально однозначно.
Где живёт спецификация и какую версию читать
Основные источники:
Практика:
Как спецификация устроена внутри
Спецификация — это большой документ, но он очень регулярный: почти всё описано одними и теми же строительными блоками.
!Карта разделов спецификации и то, как они связаны
Нормативный и пояснительный текст
В спецификации встречаются два типа материала:
При чтении всегда отделяйте «что должно быть» от «почему так сделано».
Термины: когда слово значит ровно одно
Спецификация вводит строгие термины. Если термин уже определён, далее он используется в одном и том же смысле.
Примеры важных терминов, с которыми вы будете встречаться постоянно:
Abstract Operation — абстрактная операция, то есть именованный алгоритм (например, “ToString”).internal slot — внутреннее поле объекта, не доступное напрямую из JavaScript.Completion Record — модель результата вычисления шага алгоритма (успех/ошибка/переход управления).Если встречаете незнакомый термин, лучшая стратегия — найти его определение в тексте спецификации и закрепить точное значение.
Как читать алгоритмы в спецификации
Большая часть ECMAScript описана псевдокодом. Этот псевдокод выглядит как «шаги», но это не просто комментарии — это формальная процедура, которую реализация должна воспроизвести по наблюдаемому поведению.
Что такое абстрактные операции
Абстрактные операции — это «подпрограммы» спецификации. Они часто начинаются с To..., Is..., Require... и т.п. Они:
Практический навык: когда вы читаете алгоритм и видите вызов абстрактной операции, не пытайтесь угадывать её смысл по названию — откройте определение и прочитайте шаги.
Completion Record: почему в тексте так много “Return ?”
Спецификация моделирует не только значения, но и «способ завершения» вычисления: нормальное завершение, выброс исключения, return, break, continue.
Поэтому в алгоритмах часто встречаются конструкции вида:
Return ? Foo(...)Let x be ? Bar(...)Интуитивное чтение:
? означает: если вызов завершился ошибкой, немедленно пробросить её наружу.? алгоритм мог бы «вручную» разбирать результат.Это один из ключей к чтению спецификации: вы начинаете видеть, где может возникнуть исключение и как оно распространяется.
Пример: чтение спецификации через поведение кода
Возьмём выражение:
Если смотреть «по спецификации», вас интересует не конкретная реализация, а цепочка норм, которые должны привести к результату:
String;Вывод для чтения: ваш путь почти всегда будет выглядеть как «раздел про встроенный объект» → «алгоритм» → «вызов абстрактной операции» → «переход в определение этой операции».
Типы в спецификации: не путать с тем, что видит JS
В ECMAScript есть понятие Type, но оно шире, чем typeof.
Важно различать:
Number, String, Boolean, BigInt, Symbol, Object, а также служебные типы вроде Reference и Completion Record);typeof, который возвращает строку и исторически имеет особенности.Спецификация часто говорит «If Type(x) is Number…» — это не вызов typeof, а обращение к внутренней классификации значения.
Внутренние слоты и внутренние методы объектов
Спецификация описывает объекты не как «хеш-таблицы», а как сущности с:
Promise есть слот, хранящий состояние;[[Get]] (как модель, а не как реально существующий метод JavaScript).Это нужно, чтобы стандартизировать поведение, которое нельзя выразить обычным JS-кодом.
Практическое чтение:
Грамматика: где заканчивается синтаксис и начинается смысл
Спецификация разделяет:
super, ограничения на await в не-async функциях);
- runtime semantics — что выполняется и в каком порядке.Практический приём:
Модель выполнения: контексты, Realm, Agent и очереди задач
Чтобы описывать Promise, модули, async/await и порядок выполнения, спецификация вводит модель окружения выполнения.
Базовые элементы:
Execution Context — контекст исполнения (например, при входе в функцию).Realm — «мир» со своим набором встроенных объектов (важно для изоляции, iframe, разные глобальные объекты).Agent — абстракция исполнителя (грубо: то, что выполняет код и управляет очередями задач в рамках модели спецификации).Job и очереди Job Queue — механизм для описания микрозадач (например, реакций Promise).Важно: спецификация ECMAScript описывает свои очереди работ (jobs). Интеграция с «событийным циклом» среды (браузер, Node.js) — это уже граница между ECMAScript и хост-средой.
Host-среда: где ECMAScript заканчивается
ECMAScript — это не весь JavaScript-опыт в реальном мире. Многие привычные вещи определяются не ECMA-262:
setTimeout, DOM, fetch — это не часть ECMAScript (в браузере это определяют спецификации Web API).При чтении ECMA-262 вы будете встречать формулировки вроде «host-defined» или «оставлено на усмотрение хоста». Это маркер того, что поведение зависит от среды.
Стратегия чтения спецификации
Чтобы не утонуть в объёме, используйте повторяемый маршрут.
Маршрут от вопроса к ответу
Promise.
Как не перепутать уровни описания
Частая ошибка: пытаться представить, что псевдокод спецификации «выполняется» как настоящий JavaScript.
Правильная рамка:
Мини-глоссарий чтения
Let x be ... — вводится локальное имя в псевдокоде.If ... — условная ветка алгоритма.Return ... — завершение алгоритма.Throw ... — моделирование выброса исключения.? — проброс ошибки (если операция завершилась неуспешно).! — утверждение «здесь ошибки быть не должно» (обычно потому, что это гарантировано ранее в алгоритме).Что дальше в курсе
Дальше мы будем постоянно опираться на навыки из этой статьи: искать нужный раздел, читать алгоритмы, распознавать абстрактные операции, понимать internal slots и модель выполнения. На следующем шаге логично углубиться в то, какие типы и значения существуют в спецификации и как они участвуют в выполнении алгоритмов.