Справочник Ada 2012
3.2 Типы и подтипы
Статическая семантика
Тип характеризуется набором значений и набором примитивных операций, реализующих основные аспекты его семантики. Объект заданного типа — это сущность во время выполнения, которая содержит (имеет) значение типа.
Типы группируются в категории типов. Существуют несколько определенных языком категорий типов (см. ПРИМЕЧАНИЯ ниже), отражающих сходство их значений и примитивных операций. Большинство категорий типов образуют классы типов. Элементарные типы — это те, значения которых логически неделимы; составные типы — это те, значения которых состоят из компонентных значений.
Элементарные типы — это скалярные типы (дискретные и вещественные) и типы доступа (значения которых предоставляют доступ к объектам или подпрограммам). Дискретные типы — это либо целочисленные типы, либо определяются перечислением своих значений (типы перечисления). Вещественные типы — это либо типы с плавающей запятой, либо типы с фиксированной запятой.
Составные типы — это типы записей, расширения записей, типы массивов, типы интерфейсов, типы задач и защищённые типы.
Может быть несколько представлений типа с различными наборами операций. Неполный тип представляет неполное представление (см. 3.10.1) типа с очень ограниченным использованием, обеспечивая поддержку рекурсивных структур данных. Приватный тип или расширение приватного типа представляет частичное представление (см. 7.3) типа, обеспечивая поддержку абстракции данных. Полное представление (см. 3.2.1) типа представляет его полное определение. Неполное или частичное представление считается составным типом, даже если полное представление не является таковым.
Некоторые составные типы (и их представления) имеют специальные компоненты, называемые дискриминантами, значения которых влияют на наличие, ограничения или инициализацию других компонентов. Дискриминанты можно рассматривать как параметры типа.
В данном международном стандарте термин подкомпонент используется вместо компонента для обозначения компонента или компонента другого подкомпонента. В случаях, когда другие подкомпоненты исключены, вместо этого используется термин компонент. Аналогично, часть объекта или значения используется для обозначения всего объекта или значения или любого набора его подкомпонентов. Термины компонент, подкомпонент и часть также применяются к типу, означая компонент, подкомпонент или часть объектов и значений типа.
Набор возможных значений объекта заданного типа может быть подвергнут условию, которое называется ограничением (включается случай нулевого ограничения, которое не задаёт никаких ограничений); правила, определяющие, какие значения удовлетворяют заданному виду ограничения, приведены в 3.5 для range_constraints, 3.6.1 для index_constraints и 3.7.1 для discriminant_constraints. Набор возможных значений объекта типа доступа также может быть подвергнут условию, исключающему нулевое значение (см. 3.10).
Подтип заданного типа — это комбинация типа, ограничения значений типа и определённых атрибутов, специфичных для подтипа. Заданный тип называется типом подтипа. Аналогично, связанное ограничение называется ограничением подтипа. Набор значений подтипа состоит из значений его типа, которые удовлетворяют его ограничению, и любого исключения нулевого значения. Такие значения принадлежат подтипу.
Подтип называется неограниченным, если его тип имеет неизвестные дискриминанты или если его тип допускает ограничения диапазона, индекса или дискриминанта, но подтип не накладывает такого ограничения; в противном случае подтип называется ограниченным подтипом (поскольку у него нет неограниченных характеристик).
ПРИМЕЧАНИЯ
2 Любой набор типов может быть назван «категорией» типов, и любой набор типов, замкнутый относительно вывода (см. 3.4), может быть назван «классом» типов. Однако в описании правил языка используются только определённые категории и классы — в основном те, которые имеют свой собственный набор примитивных операций (см. 3.2.3) или которые соответствуют набору типов, сопоставимых с заданным видом формального типа-параметра (см. 12.5). Примеры «интересных» определённых языком классов: элементарные, скалярные, дискретные, перечисления, символьные, булевы, целые, знакомые целые, модулярные, вещественные, с плавающей запятой, с фиксированной запятой, обычные с фиксированной запятой, десятичные с фиксированной запятой, числовые, доступа, доступа к объекту, доступа к подпрограмме, составные, массивы, строки, (немеченные) записи, помеченные, задачи, защищённые, неограниченные. Специальный синтаксис предусмотрен для определения типов в каждом из этих классов. В дополнение к этим классам, примеры «интересных» определённых языком категорий: абстрактные, неполные, интерфейсы, ограниченные, приватные, записи.
Эти категории, определённые языком, организованы следующим образом:
все типы
элементарные
скалярные
дискретные
перечисления
символьные
булевы
другие перечисления
целые
знакомые целые
модулярные целые
вещественные
с плавающей запятой
с фиксированной запятой
обычные с фиксированной запятой
десятичные с фиксированной запятой
доступа
доступа к объекту
доступа к подпрограмме
составные
немеченные
массивы
строки
другие массивы
записи
задачи
защищённые
помеченные (включая интерфейсы)
неограниченные помеченные записи
ограниченные помеченные
ограниченные помеченные записи
синхронизированные помеченные
помеченные задачи
помеченные защищённые
элементарные
скалярные
дискретные
перечисления
символьные
булевы
другие перечисления
целые
знакомые целые
модулярные целые
вещественные
с плавающей запятой
с фиксированной запятой
обычные с фиксированной запятой
десятичные с фиксированной запятой
доступа
доступа к объекту
доступа к подпрограмме
составные
немеченные
массивы
строки
другие массивы
записи
задачи
защищённые
помеченные (включая интерфейсы)
неограниченные помеченные записи
ограниченные помеченные
ограниченные помеченные записи
синхронизированные помеченные
помеченные задачи
помеченные защищённые
Существуют и другие категории, такие как «числовые» и «с дискриминантами», которые представляют другие аспекты категоризации, но не укладываются в вышеупомянутую строго иерархическую схему.