Spec-Zone.ru › Ada 2005
Справочник Ada 2005

13.1 Операционные и представленные элементы

Элементы представления и операций могут использоваться для указания аспектов сущностей. Можно указать два вида аспектов сущностей: аспекты представления и операционные аспекты. Элементы представления определяют, как типы и другие сущности языка отображаются на базовую машину. Операционные элементы определяют другие свойства сущностей.
Существует шесть видов элементов представления: attribute_definition_clause для атрибутов представления, enumeration_representation_clause, record_representation_clause, at_clause, component_clause и предварительные операторы представления. Они могут быть предоставлены для обеспечения более эффективного представления или для взаимодействия с функциями, которые находятся за пределами области языка (например, периферийным оборудованием).
Операционный элемент — это attribute_definition_clause для операционного атрибута.
Операционный элемент или элемент представления применяется к сущности, идентифицированной local_name, который обозначает сущность, объявленную локально в текущей области объявления, или единицу библиотеки, объявленную непосредственно перед оператором представления в compilation.

Синтаксис

aspect_clause ::= attribute_definition_clause
| enumeration_representation_clause
| record_representation_clause
| at_clause
local_name ::= direct_name
| direct_name'attribute_designator
| единица_библиотеки_name
Оператор представления разрешается только в местах, где разрешен оператор aspect_clause или compilation_unit.

Правила разрешения имен

В операционном элементе или элементе представления, если local_name является direct_name, то он должен разрешаться для обозначения объявления (или, в случае pragma, одного или нескольких объявлений), которое происходит непосредственно в той же области объявления, что и элемент. Если у local_name есть attribute_designator, то он должен разрешаться для обозначения компонента, определенного реализацией (см. 13.5.1) или типа класса, неявно объявленного непосредственно в той же области объявления, что и элемент. local_name, который является именем единицы_библиотеки_ (разрешается только в операторе представления), должен разрешаться для обозначения library_item, который непосредственно предшествует (за исключением других предварительных операторов) оператору представления.

Правила законности

local_name оператора aspect_clause или оператора представления должен статически обозначать сущность (или, в случае оператора 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 должен обозначать первый подтип, и который непосредственно задает аспект типа подтипа. Элемент представления, называющий подтип, либо специфичный для подтипа (разделы Размер и Выравнивание), либо связанный с типом (все остальные). Аспекты, специфичные для подтипа, могут отличаться для различных подтипов одного и того же типа.
Операционный элемент непосредственно задаёт операционный аспект типа подтипа, обозначенного local_name. local_name операционного элемента должен обозначать первый подтип. Операционный элемент, называющий подтип, связан с типом.
Элемент представления, который непосредственно задаёт аспект подтипа или типа, должен появиться после того, как тип будет полностью определён (см. 3.11.1), и до того, как подтип или тип будут заморожены (см. 13.14). Если задан элемент представления, который непосредственно задаёт аспект сущности, то нельзя задать другой элемент представления, который непосредственно задаёт тот же аспект сущности.
Операционный элемент, который непосредственно задает аспект типа, должен появиться до того, как тип будет заморожен (см. 13.14). Если задан операционный элемент, который непосредственно задаёт аспект типа, то нельзя задать другой операционный элемент, который непосредственно задаёт тот же аспект типа.
Для немаркированного типа-потомка не разрешены элементы представления, связанные с типом, если родительский тип — тип по ссылке или имеет пользовательские примитивные подпрограммы.
Операционные и представленные аспекты формального параметра обобщения совпадают с аспектами фактического. Операционные и представленные аспекты одинаковы для всех представлений типа. Элемент представления, связанный с типом, не допускается для потомка формального немаркированного типа обобщения.
Элемент представления, который задаёт Размер для данного подтипа или размер или место хранения для объекта (включая компонент) данного подтипа, должен обеспечивать достаточно места для хранения любого значения подтипа.
Элемент представления или операции, который не поддерживается реализацией, является недопустимым или вызывает исключение во время выполнения.
type_declaration является недопустимым, если у него есть один или несколько предков, и элемент представления относится к предку, и этот элемент представления конфликтует с представлением другого предка. Случаи, которые вызывают конфликты, определяются реализацией.

Статические семантики

Если два подтипа статически совпадают, то их аспекты, специфичные для подтипа (Размер и Выравнивание), одинаковы.
Тип-потомок наследует каждый аспект представления, связанный с типом родительского типа, который был непосредственно задан до объявления типа-потомка, или (в случае, когда родительский тип — потомок) который был унаследован родительским типом от родительского типа. Подтип-потомок наследует каждый аспект представления, специфичный для подтипа родительского подтипа, который был непосредственно задан до объявления типа-потомка, или (в случае, когда родительский тип — потомок) который был унаследован родительским подтипом от родительского подтипа, но только если родительский подтип статически соответствует первому подтипу родительского типа. Наследуемый аспект представления переопределяется последующим элементом представления, который задаёт тот же аспект типа или подтипа.
В отличие от этого, наследуются ли операционные аспекты производным типом без тегов, зависит от каждого конкретного аспекта. Операционные аспекты никогда не наследуются для именованного типа. Когда операционные аспекты наследуются производным типом без тегов, аспекты, которые были непосредственно указаны операционными элементами, видимыми в момент объявления производного типа, или (в случае, когда родительский тип производен) которые были унаследованы родительским типом от родительского типа, наследуются. Наследуемый операционный аспект переопределяется последующим операционным элементом, который указывает тот же аспект типа.
Когда аспект, являющийся подпрограммой, наследуется, производный тип наследует аспект таким же образом, как производный тип наследует определяемую пользователем примитивную подпрограмму от своего родителя (см. 3.4).
Каждый аспект представления сущности следующий:
  • Если аспект указан для сущности, что означает, что он либо непосредственно указан, либо унаследован, то этот аспект сущности определяется как указанный, за исключением случая Storage_Size, который указывает минимум.
  • Если аспект представления сущности не указан, он выбирается по умолчанию не определённым образом.
Если операционный аспект указан для сущности (что означает, что он либо непосредственно указан, либо унаследован), то этот аспект сущности определяется как указанный. В противном случае аспект сущности имеет значение по умолчанию для этого аспекта.
Представление элемента, указывающего аспект представления, который был бы выбран в отсутствие элемента представления, называется подтверждающим.

Динамическая семантика

Для разработки aspect_clause любые вычисляемые конструкции в нём вычисляются.

Разрешения реализации

Реализация может интерпретировать аспекты представления способом, определённым реализацией. Реализация может установить определённые реализацией ограничения на элементы представления. Для элементов представления и связанных функций в каждом подразделе указан рекомендуемый уровень поддержки. Эти рекомендации изменяются на требования для реализаций, поддерживающих Приложение к программированию систем (см. C.2, «Требуемая поддержка представления»).

Рекомендации для реализации

Рекомендуемый уровень поддержки для всех элементов представления квалифицируется следующим образом:
  • Должен поддерживаться подтверждающий элемент представления.
  • Реализация не обязана поддерживать элементы представления, содержащие нестатические выражения, за исключением того, что реализация должна поддерживать элемент представления для данной сущности, если каждое нестатическое выражение в элементе представления является именем, статически обозначающим константу, объявленную перед сущностью.
  • Реализация не обязана поддерживать спецификацию размера для данного составного подтипа, а также размера или места хранения для объекта (включая компонент) данного составного подтипа, если все ограничения на подтип и его составные подкомпоненты (если таковые имеются) являются статическими ограничениями.
  • Реализация не обязана поддерживать элемент представления, не подтверждающий, если он может привести к тому, что связанный объект или объект типа по ссылке будет выделен по неадресуемому месту или, когда атрибут выравнивания подтипа такого объекта не равен нулю, по адресу, который не является целым кратным этого выравнивания.
  • Реализация не обязана поддерживать элемент представления, не подтверждающий, если он может привести к тому, что связанный объект элементарного типа будет иметь размер, отличный от того, который был бы выбран по умолчанию.
  • Реализация не обязана поддерживать элемент представления, не подтверждающий, если он может привести к тому, что связанный объект составного типа или объект, тип которого является по ссылке, будет иметь размер меньше, чем тот, который был бы выбран по умолчанию.
  • Реализация не обязана поддерживать элемент представления, специфичный для подтипа, не подтверждающий, и указывающий аспект представления неопределённого или абстрактного подтипа.
В целях этих правил определение того, может ли элемент представления, применённый к типу, привести к тому, что объект будет иметь некоторое свойство, основано исключительно на свойствах самого типа, а не на любой доступной информации о том, как тип используется. В частности, это предполагает, что объекты с минимальным выравниванием этого типа могут быть объявлены в какой-то момент.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API