Справочное руководство по Ada 2012
13.1 Операционные и представленческие аспекты
Можно указать два вида аспектов сущностей: представленческие аспекты и операционные аспекты. Представленческие аспекты влияют на то, как типы и другие сущности языка должны быть отображены на базовую машину. Операционные аспекты определяют другие свойства сущностей.
Любой вид аспекта сущности может быть указан с помощью указателя_аспекта (см. 13.1.1), который является необязательным элементом большинства видов объявлений и применяется к объявляемой сущности или сущностям. Аспекты также могут быть указаны с помощью некоторых других конструкций, следующих за объявлением затронутой сущности: значение представленческого аспекта может быть указано с помощью элемента представления, а значение операционного аспекта — с помощью операционного элемента.
Существует шесть видов элементов представления: определение_атрибута для представленческих атрибутов, описание_представления_перечисления, описание_представления_записи, оператор_at, оператор_компонента и представленческие прагмы. Они могут быть предоставлены для получения более эффективного представления или для взаимодействия с функциями, которые находятся за пределами области языка (например, периферийного оборудования).
Операционный элемент — это определение_атрибута для операционного атрибута.
Операционный или представленческий элемент применяется к сущности, идентифицированной локальным_именем, которое обозначает сущность, объявленную локально для текущей области объявления, или единицу библиотеки, объявленную непосредственно перед прагмой представления в компиляции.
Синтаксис
указатель_аспекта ::= определение_атрибута
| описание_представления_перечисления
| описание_представления_записи
| оператор_at
| описание_представления_перечисления
| описание_представления_записи
| оператор_at
Прагма представления разрешена только в местах, где разрешен указатель_аспекта или единица_компиляции.
Правила разрешения имен
В операционном или представленческом элементе, если локальное_имя является прямым_именем, то оно должно разрешаться, обозначая объявление (или, в случае pragma, одно или несколько объявлений), которое находится непосредственно внутри той же области объявления, что и элемент. Если локальное_имя имеет идентификатор_атрибута, то оно должно разрешаться, обозначая компонент с определением реализации (см. 13.5.1) или тип всего класса, неявным образом объявленный непосредственно внутри той же области объявления, что и элемент. локальное_имя, которое является имя_единицы_библиотеки (разрешено только в прагме представления), должно разрешаться, обозначая элемент_библиотеки, который непосредственно предшествует (кроме других прагм) прагме представления.
Правила допустимости
локальное_имя указателя_аспекта или прагмы представления должно статически обозначать сущность (или, в случае pragma, одну или несколько сущностей), объявленную непосредственно перед ней в компиляции или внутри той же области_объявления, спецификации_пакета, определения_задачи, определения_защищенного_типа или определения_записи как элемента представления или операционного элемента. Если локальное_имя обозначает локальную вызываемую сущность, то это может быть сделано через локальное объявление_переименования_подпрограммы (как способ разрешения неоднозначности в случае перегрузки); в противном случае локальное_имя не должно обозначать объявление_переименования.
Представление объекта состоит из определенного количества битов (размер объекта). Для объекта элементарного типа это биты, которые обычно считываются или обновляются машинным кодом при загрузке, сохранении или выполнении операций с значением объекта. Для объекта составного типа это биты, зарезервированные для этого объекта, и включают биты, занимаемые подкомпонентами объекта. Если размер объекта больше размера его подтипа, дополнительные биты — это биты заполнения. Для элементарного объекта эти биты заполнения обычно считываются и обновляются вместе с другими. Для составного объекта биты заполнения могут не считываться или обновляться при любой составной операции, в зависимости от реализации.
Элемент представления непосредственно определяет представленческий аспект сущности, обозначаемой локальным_именем, за исключением случая типа, связанного с элементом представления, чье локальное_имя должно обозначать первый подтип, и который непосредственно определяет аспект типа подтипа. Элемент представления, называющий подтип, является либо подтип-специфическим (размер и выравнивание), либо тип-связанным (все остальные). Подтип-специфические аспекты могут отличаться для разных подтипов одного и того же типа.
Операционный элемент непосредственно определяет операционный аспект сущности, обозначаемой локальным_именем, за исключением случая типа, связанного с операционным элементом, чье локальное_имя должно обозначать первый подтип, и который непосредственно определяет аспект типа подтипа.
Элемент представления, непосредственно определяющий аспект подтипа или типа, должен появиться после полного определения типа (см. 3.11.1) и до того, как подтип или тип будут заморожены (см. 13.14).
Операционный элемент, непосредственно определяющий аспект сущности, должен появиться до того, как сущность будет заморожена (см. 13.14).
Если задан элемент представления, операционный элемент или указатель_аспекта, который непосредственно определяет аспект сущности, то недопустимо задавать другой элемент представления, операционный элемент или указатель_аспекта, который непосредственно определяет тот же аспект сущности.
Если не указано иное, недопустимо указывать операционный или представленческий аспект для формального параметра обобщения.
Для неразмеченного производного типа недопустимо указывать аспект представления, относящийся к типу, если родительский тип является типом по ссылке или имеет какие-либо пользовательские примитивные подпрограммы. Аналогично, недопустимо указывать несоответствующий тип-связанный аспект представления для неразмеченного типа по ссылке после того, как из него были получены один или несколько типов.
Представленческие и операционные аспекты формального параметра обобщения такие же, как у фактического. Представленческие и операционные аспекты одинаковы для всех представлений типа. Указание аспект представления, связанного с типом, не разрешено для потомка формального параметра неразмеченного типа обобщения.
Указание аспекта Размер для данного подтипа или размера или места хранения для объекта (включая компонент) данного подтипа должно обеспечивать достаточное пространство для хранения любого значения подтипа.
Если реализация не поддерживает указание аспекта представления или операционного аспекта, это недопустимо или вызовет исключение во время выполнения.
Объявление типа недопустимо, если оно имеет одного или нескольких предков, а для представленческого аспекта предка было указано несоответствующее значение, и это противоречит представлению другого предка. Случаи, которые вызывают конфликты, определены реализацией.
Статическая семантика
Если два подтипа статически совпадают, то их аспекты, специфичные для подтипа (Размер и Выравнивание), совпадают.
Производный тип наследует каждый аспект представления, связанный с типом родительского типа, который был непосредственно указан до объявления производного типа, или (в случае, если родительский тип является производным) который был унаследован родительским типом от родительского типа предка. Производный подтип наследует каждый аспект представления, специфичный для подтипа родительского подтипа, который был непосредственно указан до объявления производного типа, или (в случае, если родительский тип является производным) который был унаследован родительским подтипом от родительского подтипа предка, но только если родительский подтип статически совпадает с первым подтипом родительского типа. Унаследованный аспект представления переопределяется последующим aspect_specification или элементом представления, которые указывают другое значение для того же аспекта типа или подтипа.
Напротив, наследуются ли операционные аспекты производным типом, зависит от каждого конкретного аспекта; если не указано иное, операционный аспект не наследуется. Когда операционные аспекты наследуются производным типом, аспекты, которые были непосредственно указаны aspect_specification или операционными элементами, видимыми в момент объявления производного типа, или (в случае, если родительский тип является производным) которые были унаследованы родительским типом от родительского типа предка, наследуются. Унаследованный операционный аспект переопределяется последующим aspect_specification или операционным элементом, который указывает тот же аспект типа.
Когда аспект, являющийся подпрограммой, наследуется, производный тип наследует аспект таким же образом, как производный тип наследует пользовательскую определяемую примитивную подпрограмму от своего родителя (см. 3.4).
Каждый аспект представления сущности следующий:
- Если аспект указан для сущности, что означает, что он либо непосредственно указан, либо унаследован, то этот аспект сущности указан, за исключением случая Storage_Size, который указывает минимум.
- Если аспект представления сущности не указан, он выбирается по умолчанию неопределенным способом.
Если операционный аспект указан для сущности (что означает, что он либо непосредственно указан, либо унаследован), то этот аспект сущности указан. В противном случае аспект сущности имеет значение по умолчанию для этого аспекта.
aspect_specification или элемент представления, которые указывают аспект представления, который был бы выбран в отсутствие aspect_specification или элемента представления, считается подтверждающим. Значение аспекта, указанное в этом случае, считается подтверждающим значением аспекта представления. Другие значения аспекта называются неподтверждающими, как и aspect_specification и элементы представления, которые их указали.
Динамическая семантика
Для разработки aspect_clause вычисляются любые вычисляемые конструкции в нём.
Разрешения для реализации
Реализация может интерпретировать аспекты представления произвольным способом. Реализация может вводить произвольные ограничения на указание аспектов представления. Рекомендуемый уровень поддержки определяется для указания аспектов представления и связанных функций в каждом подразделе. Эти рекомендации изменяются на требования для реализаций, поддерживающих Приложение к программированию систем (см. C.2, «Требуемая поддержка представления»).
Рекомендации по реализации
Рекомендуемый уровень поддержки для указания всех аспектов представления квалифицируется следующим образом:
- Должна поддерживаться подтверждающая спецификация для аспекта представления.
- Реализация не обязана поддерживать указание аспекта представления, содержащего нестатические выражения, если каждое нестатическое выражение является именем, статически обозначающим константу, объявленную перед сущностью.
- Реализация не обязана поддерживать спецификацию Размер для данного составного подтипа, а также размер или местоположение хранения для объекта (включая компонент) данного составного подтипа, если все ограничения на подтип и его составные подкомпоненты (если таковые имеются) являются статическими ограничениями.
- Реализация не обязана поддерживать указание значения неподтверждающего аспекта представления, если это может привести к выделению алиасного объекта или объекта типа по ссылке в недоступном месте или, когда атрибут выравнивания подтипа такого объекта не равен нулю, по адресу, не являющемуся целым кратным этому выравниванию.
- Реализация не обязана поддерживать указание значения неподтверждающего аспекта представления, если это может привести к тому, что алиасный объект элементарного типа будет иметь размер, отличный от того, который был бы выбран по умолчанию.
- Реализация не обязана поддерживать указание значения неподтверждающего аспекта представления, если это может привести к тому, что размер алиасного объекта составного типа или объекта, тип которого является по ссылке, будет меньше размера, который был бы выбран по умолчанию.
- Реализация не обязана поддерживать указание значения неподтверждающего аспекта представления, специфичного для подтипа, для неопределенного или абстрактного подтипа.
В целях этих правил определение того, может ли указание значения аспекта представления для типа привести к тому, что объект будет иметь какое-либо свойство, основано только на свойствах самого типа, а не на любой доступной информации о том, как тип используется. В частности, предполагается, что объекты с минимальным выравниванием этого типа могут быть объявлены в какой-то момент.
ПРИМЕЧАНИЯ
1 Аспекты, которые могут быть указаны, определяются в этой Международной Стандарте и обобщены в K.1.