Перейти к основному содержимому
Chapter content StyleChapter Difficulty? min

Глава 3.3: Типы языка спецификации

warning

Глава находится в разработке!

Когда основные грамматические правила языка спецификации нам стали известны, стоит обратить внимание на то, что и как они описывают. Если мы хотим правильно понять спецификацию, на данном этапе справедливым будет задать вопрос: что помогает грамматике языка спецификации более точно и детально описывать внутреннюю машинерию языка ECMAScript? При чём тут типы языка спецификации, как они связаны с грамматикой и как реализованы на страницах стандарта? Это мы и разберём в нашей главе.

Теория типов данных

Для начала хочется определить, с чем мы имеем дело, когда говорим о чём-то, что имеет какой-то тип. Попробуем понять, а какую роль вообще в программировании имеют типы и для чего они нужны, как реализованы.

In computer science and computer programming, a data type (or simply type) is a collection or grouping of data values, usually specified by a set of possible values, a set of allowed operations on these values, and/or a representation of these values as machine types. A data type specification in a program constrains the possible values that an expression, such as a variable or a function call, might take.

~ wiki

Очевидно, типы в языках программирования помогают разработчкам описывать значения (данные), с которыми они вынуждены работать на своём поприще. Особенно важно, что типы существуют не только для удобства разработчика при создании им некоторого продукта, но и для гарантирования в самом языке выполнения правил, регулирующих поведение типов данных.

В контексте условного общего программирования не стоит воспринимать типы только лишь относительно так называемых втроенных примитивов (built-in primitive data type). В разных языках существуют конструкции, определение которых требует сопоставления нескольких встроенных типов — композитный тип данных (сomposite data type).

И вообще, типы данных могут быть просто вспомогательной иллюзией, например, как в TypeScript, который впоследствии компилируется в JavaScript, где указания таких типов и интерфейсов попросту нет, а сами типы проверяются ещё на этапе написания программы, до его компиляции, но это уже больше прерогатива современных редакторов кода.

Ну и стоит помнить, что есть типы, лишь косвенно связанные с языком, например, типы языков спецификации. Зачастую, с точки зрения грамматики самого языка, они являются вспомогательными, но для правильной работы языка в какой-то системе, например, в хост-среде (host environment), без таких типов не обойтись. Но не у каждого языка спецификации есть свои типы, ровно как и не у каждой спецификации есть её язык.

Про типы в ECMAScript

В спецификации существует разделение типов на две системы1: система типов языка ECMAScript и типов языка спецификации. Получилось это так, потому что грамматика языка спецификации в совокупности с цепочками алгоритмов порождает необходимость подробного указания, с какими данными или сущностями работает тот или иной алгоритм в рамках своей отдельной грамматики. Иначе благодаря избыточной сложности большинства алгоритмов они не получили бы точного описания, что повлекло бы за собой ещё большее усложнение.

Итак, на уровне внутренних алгоритмов языка ECMAScript мы вынуждены работать как с одной системой типов, так и с другой. Проблема в том, что они пересекаются на уровне стандарта, поэтому в них можно легко запутаться. Вполне вероятно, что одна абстрактная операция может вернуть в качестве результата нечто, соответствующее типу языка ECMAScript, другая — вернёт сущность, принадлежащую типу языка спецификации, хотя внутри самой операции алгоритмы будут оперировать обеими системами типов.

Глава нацелена на развитие умения дифференциировать обе системы типов на уровне алгоритмов языка без тесного контакта с самими алгоритмами (следующая глава). Мы подробно разберём только систему типов языка спецификации, а другую — уже в соответствующей главе про сам язык ECMAScript.

Типы спецификации

Начнём разговор более предметно. Типы языка спецификации ECMAScript, согласно стандарту, представляют из себя метаинформацию внутри каждого отдельного алгоритма, которая призвана описывать семантику конструкций языка ECMAScript и даже его типы.

Значение

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

Вдобавок ко всему сказанному значения типов могут описывать только промежуточные результаты операции оценки (Evaluation), и не могут хранить свои значения в сущностях языка ECMAScript, например, в свойствах (property) объектов. То есть, по сути, типы спецификации — это вообще отдельные от языка ECMAScript сущности, инкапсулированно-имплементированные в отдельную систему типов, помогающую при описании языка и принимающую участие в работе host environment.

Виды

Давайте детально рассмотрим доступные на сегодняшний день типы спецификации. В ней во многих её местах описание типов имеет интересное выражение — "for notational convenience". Скорее всего, это подразумевает определённый принцип написания, при котором редакторы попытались упростить типы для в пользу их восприятия.

Получилось у них или нет, но на страницах стандарта нам явно представлено немало разных типов:

1. Enum Type

Это внутренний тип спецификации, введённый для описания значений некоторых других типов. Обозначается как normal, return или любое другое слово, отличаясь от всех остальных sans-serif шрифтом в верхнем регистре при написании.

Так установлено, что значение типа само по себе и даже в каком-либо контексте ничего не характеризует, кроме самого себя, как бы это ни было странным. Значение типу необходимо таким, каким оно является, только для дефференциирования среди других значений этого же типа.

Если говорить более детально, в данном случае мы имеем дело с типом, от изменения значения которого ничего не зависит. Тип замкнут на самом себе, и тут важно понять, что единственное необходимое и достаточное утверждение, чтобы тип вообще имел какой-то смысл — все эти значения должны быть разными. Не имеет накакого смысла само значение, важно лишь его отличие от других.

Значение типа не несёт никакой информации, но несёт мета-информацию — флаг (индикатор) различия.

В спецификации он выглядит так:

Completion Record Fields table
Completion Record Fields table
An interesting fact...

В стандарте ES2023 значения типа были представлены в нижнем регистре того же шрифта, что путало разработчиков из-за схожести со значениями типов самого языка ECMAScript. Благодаря тому что спецификация в какой-то степени совершенствуется, сейчас такой проблемы нет.

2. List type

Данный тип спецификации используется во всех алгоритмах, где необходим простой упорядоченный список. List подчинён array-like структуре и представляет из себя неограниченную упорядоченную последовательность элементов, имеющих свои индивидуальные значения.

При работе с типом List разрешено обращаться к его элементам по индексам, как в массиве (Array). Их нумерация начинается с нуля, а значение индекса растёт в арифметической прогресси с шагом 1. Также можно добавлять в List и удалять из него значения. В алгоритмах это явным образом прописано, как "Append something to List", "Insert something as the first element of List" и так далее.

А вот пример применения подобного типа:

Abstruct operation — GlobalDeclarationInstantiation()
Abstruct operation — GlobalDeclarationInstantiation()

3. Record type

Record является общим типом для многих частных его реализаций, например, как в первом приложении — Completion Record. Согласно спецификации, этот тип нужен для описания "data aggregations", что интуитивно понятнее будет назвать кластерами данных, в алгоритмах.

В разработке

Продолжение следует...

Footnotes

  1. Авторский термин. В спецификации нет такого понятия, как "система типов". Под этим выражением я подразумеваю совокупность самих типов и их реализации в рамках спецификации.