Справочное руководство по Ada 95
13.1 Операционные и представленные элементы
Элементы представления и операционные элементы могут использоваться для указания аспектов сущностей. Можно указать два вида аспектов сущностей: аспекты представления и операционные аспекты. Элементы представления определяют, как типы и другие сущности языка отображаются на базовой машине. Операционные элементы задают другие свойства сущностей.
Существует шесть видов элементов представления: attribute_definition_clause для атрибутов представления, enumeration_representation_clause, record_representation_clause, at_clause, component_clause и пragmas представления. Они могут быть предоставлены для более эффективного представления или для взаимодействия с функциями, которые находятся вне области языка (например, периферийным оборудованием).
Операционный элемент — это attribute_definition_clause для операционного атрибута.
Операционный элемент или элемент представления применяется к сущности, идентифицированной local_name, которая обозначает сущность, объявленную локально в текущей области объявления, или библиотечный модуль, объявленный непосредственно перед пragma представления в compilation.
Синтаксис
aspect_clause ::= attribute_definition_clause
| enumeration_representation_clause
| record_representation_clause
| at_clause
| enumeration_representation_clause
| record_representation_clause
| at_clause
local_name ::= direct_name
| direct_name'attribute_designator
| имя_библиотечного_модуляname
| direct_name'attribute_designator
| имя_библиотечного_модуляname
Pragma представления разрешено только в тех местах, где разрешены aspect_clause или compilation_unit.
Правила разрешения имен
В операционном элементе или элементе представления, если local_name является direct_name, то он должен ссылаться на объявление (или, в случае pragma, на одно или несколько объявлений), которое происходит непосредственно внутри той же declarative_region, что и элемент. Если local_name имеет attribute_designator, то он должен ссылаться на определяемый реализацией компонент (см. 13.5.1) или на тип класса, неявно объявленный непосредственно внутри той же declarative_region, что и элемент. local_name, являющийся именем_библиотечного_модуля (разрешено только в pragma представления), должен ссылаться на library_item, который непосредственно предшествует (за исключением других pragmas) pragma представления.
Правила законности
local_name aspect_clause или pragmas представления должен статически обозначать сущность (или, в случае pragma, одну или несколько сущностей), объявленную непосредственно перед ней в compilation или в той же declarative_part, package_specification, task_definition, protected_definition или record_definition, что и элемент представления или операционный элемент. Если local_name обозначает локальную вызываемую сущность, то это может быть сделано через локальное subprogram_renaming_declaration (как способ разрешения неоднозначности при наличии перегрузки); в противном случае, local_name не должен обозначать renaming_declaration.
Представление объекта состоит из определенного числа битов (размера объекта). Это биты, которые обычно читаются или обновляются машинным кодом при загрузке, сохранении или работе с значением объекта. Это включает некоторые биты заполнения, когда размер объекта больше размера его подтипа. Такие биты заполнения считаются частью представления объекта, а не пробелами между объектами, если эти биты обычно читаются и обновляются.
Элемент представления непосредственно задает аспект представления сущности, обозначенной local_name, за исключением случая элемента представления, связанного с типом, чья local_name должна обозначать первый подтип, и который непосредственно задает аспект типа подтипа. Элемент представления, который называет подтип, является подтип-специфичным (пункты Size и Alignment) или тип-связанным (все остальные). Подтип-специфичные аспекты могут отличаться для различных подтипов одного и того же типа.
Операционный элемент непосредственно задает операционный аспект типа подтипа, обозначенного local_name. local_name операционного элемента должен обозначать первый подтип. Операционный элемент, который называет подтип, является тип-связанным.
Элемент представления, который непосредственно задает аспект подтипа или типа, должен появиться после полного определения типа (см. 3.11.1) и до заморозки подтипа или типа (см. 13.14). Если задан элемент представления, который непосредственно задает аспект сущности, то нельзя задавать другой элемент представления, который непосредственно задает тот же аспект сущности.
Операционный элемент, непосредственно задающий аспект типа, должен появиться до заморозки типа (см. 13.14). Если задан операционный элемент, непосредственно задающий аспект типа, то нельзя задавать другой операционный элемент, который непосредственно задает тот же аспект типа.
Для немеченых производных типов не допускаются элементы представления, связанные с типом, если родительский тип является типом по ссылке или имеет какие-либо пользовательские примитивные подпрограммы.
Операционные и представленные аспекты формального параметра обобщения такие же, как и у фактического. Операционные и представленные аспекты частичного представления такие же, как у полного представления. Элемент представления, связанный с типом, не допускается для потомка формального немеченого типа обобщения.
Элемент представления, который задает Размер для данного подтипа или размер или место хранения объекта (включая компонент) данного подтипа, должен обеспечивать достаточно места для хранения любого значения подтипа.
Элемент представления или операционный элемент, который не поддерживается реализацией, является недопустимым или вызывает исключение во время выполнения.
Статическая семантика
Если два подтипа статически совпадают, то их подтип-специфичные аспекты (Размер и Выравнивание) одинаковы.
Производный тип наследует каждый аспект представления, связанный с типом родительского типа, который был задан непосредственно перед объявлением производного типа, или (в случае, если родительский тип является производным) был унаследован родительским типом от родительского родительского типа. Производный подтип наследует каждый подтип-специфичный аспект представления своего родительского подтипа, который был задан непосредственно перед объявлением производного типа, или (в случае, если родительский тип является производным) был унаследован родительским подтипом от родительского родительского подтипа, но только если родительский подтип статически совпадает с первым подтипом родительского типа. Наследуемый аспект представления перекрывается последующим элементом представления, который задает тот же аспект типа или подтипа.
Напротив, наследуются ли операционные аспекты производным типом, зависит от каждого конкретного аспекта. Когда операционные аспекты наследуются производным типом, аспекты, которые были заданы непосредственно перед объявлением производного типа, или (в случае, если родительский тип является производным) которые были унаследованы родительским типом от родительского родительского типа, наследуются. Наследуемый операционный аспект перекрывается последующим операционным элементом, который задает тот же аспект типа.
Каждый аспект представления сущности выглядит следующим образом:
- Если аспект задан для сущности, то есть он задан непосредственно или унаследован, то этот аспект сущности задан, за исключением случая Storage_Size, который задает минимум.
- Если аспект представления сущности не задан, он выбирается по умолчанию неопределенным способом.
Если операционный аспект задан для сущности (то есть он задан непосредственно или унаследован), то этот аспект сущности задан. В противном случае аспект сущности имеет значение по умолчанию для этого аспекта.
Динамическая семантика
При разработке aspect_clause вычисляются любые вычислимые конструкции внутри него.
Разрешения для реализации
Реализация может интерпретировать аспекты представления определенным реализацией способом. Реализация может установить определенные реализацией ограничения на элементы представления. Для элементов представления и связанных функций в каждом подпункте указан рекомендуемый уровень поддержки. Эти рекомендации изменяются на требования для реализаций, поддерживающих приложение системного программирования (см. C.2, ``Требуемая поддержка представления'').
Рекомендации по реализации
Рекомендуемый уровень поддержки всех элементов представления квалифицируется следующим образом:
- Реализация не обязана поддерживать элементы представления, содержащие нестатические выражения, за исключением того, что реализация должна поддерживать элемент представления для данного сущности, если каждое нестатическое выражение в элементе представления является именем, статически обозначающим константу, объявленную перед сущностью.
- Реализация не обязана поддерживать спецификацию размера для данного составного подтипа, а также размера или места хранения объекта (включая компонент) данного составного подтипа, если ограничения на подтип и его составные подкомпоненты (если таковые имеются) не являются статическими ограничениями.
- Компонент с алиасом или компонент, тип которого определяется ссылкой, всегда должен выделяться по адресу.