Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

13.3 Атрибуты выполнения и представления

Значения некоторых характеристик, зависящих от реализации, можно получить, обратившись к соответствующим атрибутам выполнения или представления. Некоторые из этих атрибутов могут быть указаны с помощью описания_атрибута.

Синтаксис

описание_атрибута ::=
for локальное_имя'имя_атрибута use выражение;
| for локальное_имя'имя_атрибута use имя;

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

Для описания_атрибута, указывающего атрибут, обозначающий значение, следует использовать форму с выражением. В противном случае следует использовать форму с именем.
Для описания_атрибута, указывающего атрибут, обозначающий значение или объект, ожидаемый тип для выражения или имени — тип атрибута. Для описания_атрибута, указывающего атрибут, обозначающий подпрограмму, ожидаемый профиль для имени — профиль, требуемый для атрибута. Для описания_атрибута, указывающего атрибут, обозначающий какой-либо другой тип сущности, имя должно ссылаться на сущность соответствующего типа.

Правила допустимости

Имя_атрибута разрешается использовать в описании_атрибута только если это разрешено в данном Руководстве, или для атрибута, определяемого реализацией, если это разрешено реализацией. Каждый указываемый атрибут представляет собой операционный или аспект представления; имя аспекта — это имя атрибута.
Этот абзац был удален.

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

Определение размера — это описание_атрибута, в котором имя_атрибута равно Size. Аналогичные определения применяются к другим указываемым атрибутам.
Элемент памяти — это адресуемый элемент памяти в машине. Слово — это максимальный объём памяти, который удобно и эффективно может обрабатывать оборудование с учетом модели выполнения реализации. Слово состоит из целого числа элементов памяти.
Машинный скаляр — это объём памяти, который удобно и эффективно может загружаться, сохраняться или обрабатываться оборудованием. Машинные скаляры состоят из целого числа элементов памяти. Множество машинно-ориентированных скаляров определено реализацией, но включает, по меньшей мере, элемент памяти и слово. Машинно-ориентированные скаляры используются для интерпретации описаний_компонентов, когда используется нестандартное битовое упорядочение.
Определены следующие атрибуты представления: Адрес, Выравнивание, Размер, Размер_объекта, Размер_хранения, Размер_компонента, Имеет_то_же_хранение и Перекрывается_хранение.
Для префикса X, обозначающего объект, программную единицу или метку:
X'Адрес
Обозначает адрес первого из элементов памяти, выделенных для X. Для программной единицы или метки это значение относится к машинному коду, связанному с соответствующим телом или оператором. Значение этого атрибута имеет тип System.Address.
Префикс X'Адрес не должен статически обозначать подпрограмму с соглашением Intrinsic. X'Адрес вызывает Program_Error, если X обозначает подпрограмму с соглашением Intrinsic.
Адрес может быть задан для автономных объектов и для программных единиц с помощью описания_атрибута.

Ошибка выполнения

Если задан адрес, программист обязан убедиться, что адрес является корректным и подходящим для сущности и её использования; в противном случае выполнение программы является ошибочным.

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

Для массива X, X'Адрес должен указывать на первый элемент массива, а не на границы массива.
Рекомендуемый уровень поддержки атрибута Адрес:
  • X'Адрес должен давать полезный результат, если X — это объект, который является псевдонимом или имеет тип по ссылке, или является сущностью, для которой был задан адрес.
  • Реализация должна поддерживать инструкции Address для импортированных подпрограмм.
  • Этот абзац был удален.
  • Если адрес объекта задан или он импортирован или экспортирован, то реализация не должна выполнять оптимизации, основанные на предположениях об отсутствии псевдонимов.
ПРИМЕЧАНИЕ 1 Задание имени ссылки с аспектом Link_Name (см. B.1) для подпрограммы или объекта является альтернативой явному заданию адреса на этапе компоновки, что позволяет директиве компоновки разместить подпрограмму или объект в памяти.
ПРИМЕЧАНИЕ 2 Правила для атрибута Size подразумевают, что для алиасированного объекта X, если X'Size = Storage_Unit, то X'Address указывает на элемент памяти, содержащий все биты X, и только биты X.

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

Для префикса X, обозначающего объект:
X'Выравнивание
Значение этого атрибута имеет тип universal_integer и неотрицательно; ноль означает, что объект не обязательно выровнен по границе элемента памяти. Если X'Alignment не равен нулю, то X выровнен по границе блока памяти, и X'Address является целым кратным X'Alignment (то есть, остаток от деления Address на Alignment равен нулю).
Этот абзац был удален.
Выравнивание может быть задано для автономных объектов с помощью описания_атрибута; выражение такого описания должно быть статическим и его значение неотрицательным.
Этот абзац был удален.
Для каждого подтипа S:
S'Выравнивание
Значение этого атрибута имеет тип universal_integer и неотрицательно.
Для объекта X подтипа S, если S'Alignment не равен нулю, то X'Alignment является ненулевым кратным S'Alignment, если не указано иное пунктом представления.
Выравнивание может быть задано для подтипов с помощью описания_атрибута; выражение такого описания должно быть статическим и его значение неотрицательным.

Ошибка выполнения

Выполнение программы ошибочно, если заданный адрес конфликтует с выравниванием.
Для объекта, не выделенного под управлением реализации, выполнение программы ошибочно, если объект не выровнен в соответствии с его выравниванием.

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

Для любого помеченного подтипа S, S'Class'Alignment должен быть равен S'Alignment.
Рекомендуемый уровень поддержки атрибута Выравнивание для подтипов:
  • Реализация должна поддерживать инструкцию Alignment для целочисленного, дробного, записываемого или массивно-ориентированного типов, задавая значение Alignment, равное нулю или степени двойки, с учетом следующего:
  • Реализация не обязана поддерживать инструкцию Alignment для знакового целочисленного типа, задавая значение Alignment, большее наибольшего значения Alignment, которое когда-либо выбирается по умолчанию реализацией для любого знакового целочисленного типа. Соответствующее ограничение может быть наложено для модульных целых чисел, дробных типов, перечислимых типов, записываемых типов и массивно-ориентированных типов.
  • Реализация не обязана поддерживать несоответствующее описание Alignment, которое может привести к созданию объекта элементарного типа, который не может быть легко загружен и сохранен доступными машинными инструкциями.
  • Реализация не обязана поддерживать заданное выравнивание для производного помеченного типа, которое не является кратным выравниванию родительского типа. Реализация не обязана поддерживать несоответствующее выравнивание, заданное для производного немаркированного типа по ссылке.
Рекомендуемый уровень поддержки атрибута Выравнивание для объектов:
  • Этот абзац был удален.
END_OF_DOCUMENT_MARKER
  • Для автономных объектов библиотечного уровня статически ограниченных подтипов реализация должна поддерживать все выравнивания, поддерживаемые целевым компоновщиком. Например, выравнивание страниц, вероятно, будет поддерживаться для таких объектов, но не для подтипов.
  • Для других объектов реализация должна, по меньшей мере, поддерживать выравнивания, поддерживаемые для их подтипа, с учетом следующих ограничений:
  • Реализация не обязана поддерживать выравнивания, указанные для объектов типа по ссылке или для объектов типов, содержащих алиасированные подкомпоненты, если указанное выравнивание не кратно выравниванию подтипа объекта.
ПРИМЕЧАНИЕ 3 Выравнивание — это атрибут, специфичный для подтипа.
Этот абзац был удален.
ПРИМЕЧАНИЕ 4 component_clause, клаузула Component_Size или указание аспекта Pack как True может переопределить заданное выравнивание.

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

Для префикса X, обозначающего объект:
X'Size
Обозначает размер представления объекта в битах. Значение этого атрибута имеет тип universal_integer.
Размер может быть задан для автономных объектов с помощью attribute_definition_clause; выражение такой клаузы должно быть статическим и его значение неотрицательным.

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

Размер массива объекта не должен включать его границы.
Рекомендуемый уровень поддержки атрибута Size для объектов такой же, как для подтипов (см. ниже), за исключением того, что для алиасированного элементарного объекта требуется только подтверждающая клауза Size.
  • Этот абзац был удален.

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

Для каждого подтипа S:
S'Size
Если S определен, обозначает размер (в битах), который реализация выберет для следующих объектов подтипа S:
Компоненты записи подтипа S, когда тип записи упакован.
Формальный параметр экземпляра Unchecked_Conversion, преобразующего из подтипа S в какой-либо другой подтип.
Если S неопределен, значение определяется реализацией. Значение этого атрибута имеет тип universal_integer. Размер объекта не меньше размера его подтипа, если размер объекта не определяется клаузой Size, component_clause или клаузой Component_Size. Размер может быть указан для первых подтипов через attribute_definition_clause; выражение такой клаузы должно быть статическим и его значение неотрицательным.

Требования к реализации

В реализации Boolean'Size должен быть равен 1.

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

Если размер подтипа не подтверждающий и допускает эффективную независимую адресацию (см. 9.10) на целевой архитектуре, то Object_Size подтипа должен иметь то же значение при отсутствии явного указания другого значения.
Абзацы 51 и 52 были перемещены в раздел "Рекомендации по реализации" для атрибута Object_Size.
Клауза Size для составного подтипа не должна влиять на внутреннюю структуру компонентов.
Рекомендуемый уровень поддержки атрибута Size для подтипов:
  • Размер (если не указан) статического дискретного или фиксированного подтипа должен быть равен количеству битов, необходимых для представления каждого значения, принадлежащего подтипу, с помощью несмещенного представления, оставляя место для знака только в том случае, если подтип содержит отрицательные значения. Если такой подтип является первым подтипом, то реализация должна поддерживать заданный размер для него, отражающий это представление.
  • Для подтипа, реализованного с уровнями косвенности, размер должен включать размер указателей, но не размер того, на что они указывают.
  • Реализация должна поддерживать клаузу Size для дискретного типа, фиксированного типа, типа записи или типа массива, с учетом следующих ограничений:
Реализация не обязана поддерживать клаузу Size для типа целых со знаком, задающую размер, превышающий размер наибольшего типа целых со знаком, поддерживаемого реализацией при отсутствии клаузы размера (то есть, когда размер выбирается по умолчанию). Соответствующее ограничение может быть применено к типам модульных целых чисел, фиксированным типам, типам перечислений, типам записей и типам массивов.
Клауза размера, не подтверждающая для первого подтипа производного неупакованного типа по ссылке, не обязана поддерживаться.
ПРИМЕЧАНИЕ 5 Размер — это атрибут, специфичный для подтипа.
ПРИМЕЧАНИЕ 6 component_clause или клауза Component_Size могут переопределить указанный размер. Аспект Pack не может.

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

Для каждого подтипа S:
S'Object_Size

Если S определен, обозначает размер (в битах) автономного алиасированного объекта или компонента подтипа S в отсутствие aspect_specification или элемента представления, определяющего размер объекта или компонента. Если S неопределен, значение определяется реализацией. Значение этого атрибута имеет тип universal_integer. Если не указано иное, Object_Size подтипа не меньше Size подтипа. Object_Size может быть задан с помощью attribute_definition_clause; выражение такой клаузы должно быть статическим и его значение неотрицательным. Все алиасированные объекты с номинальным подтипом S имеют размер S'Object_Size. При отсутствии явного указания Object_Size подтипа S, определенного с помощью subtype_indication без ограничений, соответствует значению Object_Size подтипа, обозначенного subtype_mark указанного subtype_indication, в момент этого определения.

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

Если S — определённый первый подтип и S'Object_Size не указан, S'Object_Size должен быть наименьшим кратным размеру элемента хранения, большим или равным S'Size, который согласуется с выравниванием S.
Если X обозначает объект (включая компонент) подтипа S, X'Size должен быть равен S'Object_Size, за исключением следующих случаев:
  • X'Size указан;
  • X — это автономный неалиасированный объект;
  • Размер X определяется component_clause или клаузой Component_Size;
  • Тип, содержащий компонент X, упакован.
Клауза Object_Size для составного типа не должна влиять на внутреннюю структуру компонентов.
Рекомендуемый уровень поддержки атрибута Object_Size для подтипов:
  • Если S — статический подтип целых со знаком, реализация должна поддерживать задание S'Object_Size, соответствующее размеру любого подтипа целых со знаком, предоставляемого реализацией, который не меньше S'Size. Соответствующая поддержка ожидается для подтипов модульных целых чисел, фиксированных типов и типов перечислений.
  • Если S — подтип массива или записи со статическими ограничениями и S не является первым подтипом производного неупакованного типа по ссылке, реализация должна поддерживать задание S'Object_Size, являющееся кратным размеру элемента хранения, согласованным с выравниванием S, не меньшим S'Size и не большим, чем размер наибольшего составного подтипа, поддерживаемого реализацией.
  • Если S — любой другой подтип, поддержка подтверждающих заданий Object_Size является обязательной.

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

Для префикса T, обозначающего объект задачи (после любого неявного разыменования):
T'Storage_Size

Обозначает количество элементов хранения, зарезервированных для задачи. Значение этого атрибута имеет тип universal_integer. Storage_Size включает размер стека задачи, если таковой имеется. Язык не определяет, включает ли он другое хранилище, связанное с задачей (например, «блок управления задачей», используемый некоторыми реализациями).
Если аспект Storage_Size указан для типа объекта, значение атрибута Storage_Size не меньше значения, определённого аспектом.
Аспект Storage_Size определяет количество памяти, которое необходимо зарезервировать для выполнения задачи.
Абзацы с 62 по 65 были перемещены в Приложение J, «Устаревшие возможности»

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

Для типа задачи (включая анонимный тип single_task_declaration), может быть указан следующий аспект представления:
Storage_Size

Аспект Storage_Size — это выражение, которое должно быть любого целочисленного типа.

Правила легальности

Аспект Storage_Size не может быть указан для интерфейсного типа задачи.

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

При создании объекта задачи вычисляется (если есть) выражение, связанное с аспектом Storage_Size его типа; атрибут Storage_Size вновь созданного объекта задачи будет, по крайней мере, равен значению выражения.
В момент создания объекта задачи или при его активации, Storage_Error генерируется, если свободного места недостаточно для размещения запрошенного Storage_Size.

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

Для префикса X, обозначающего подтип массива или объект массива (после любого неявного разыменования):
X'Component_Size

Обозначает размер в битах компонентов типа X. Значение этого атрибута имеет тип universal_integer.
Component_Size может быть указан для типов массивов с помощью описания_атрибута; выражение такого описания должно быть статическим и его значение неотрицательным.

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

Рекомендуемый уровень поддержки атрибута Component_Size:
  • Реализация не обязана поддерживать указанные Component_Sizes, которые меньше размера подтипа компонента.
  • Реализация должна поддерживать указанные Component_Sizes, которые являются множителями и кратными размера слова. Для таких Component_Sizes массив не должен содержать пробелов между компонентами. Для других Component_Sizes (если поддерживаются), массив не должен содержать пробелов между компонентами, когда также указан параметр Pack; реализация должна запрещать такое сочетание в случаях, когда она не может поддерживать представление без пробелов.

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

Для префикса X, обозначающего объект:
X'Has_Same_Storage

X'Has_Same_Storage обозначает функцию со следующим описанием:
function X'Has_Same_Storage (Arg : any_type)
return Boolean
Фактический параметр должен быть именем, обозначающим объект. Объект, обозначаемый фактическим параметром, может быть любого типа. Эта функция вычисляет имена вовлеченных объектов. Она возвращает True, если представление объекта, обозначаемого фактическим параметром, занимает ровно те же биты, что и представление объекта, обозначаемого X, и объекты занимают, по крайней мере, один бит; в противном случае она возвращает False.
Для префикса X, обозначающего объект:
X'Overlaps_Storage

X'Overlaps_Storage обозначает функцию со следующим описанием:
function X'Overlaps_Storage (Arg : any_type)
return Boolean
Фактический параметр должен быть именем, обозначающим объект. Объект, обозначаемый фактическим параметром, может быть любого типа. Эта функция вычисляет имена вовлеченных объектов и возвращает True, если представление объекта, обозначаемого фактическим параметром, совмещает, по крайней мере, один бит с представлением объекта, обозначаемого X; в противном случае она возвращает False.
ПРИМЕЧАНИЕ 7 X'Has_Same_Storage(Y) подразумевает X'Overlaps_Storage(Y).
ПРИМЕЧАНИЕ 8 X'Has_Same_Storage(Y) и X'Overlaps_Storage(Y) не считаются операциями чтения X и Y.

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

Определяется следующий операционный атрибут, относящийся к типу: External_Tag.
Для каждого подтипа S помеченного типа T (специфического или класса):
S'External_Tag

S'External_Tag обозначает внешнее строковое представление для S'Tag; оно имеет предопределённый тип String. External_Tag может быть задан для конкретного помеченного типа с помощью описания_атрибута; выражение такого описания должно быть статическим. По умолчанию внешнее представление тега определяется реализацией. См. 13.13.2. Значение External_Tag никогда не наследуется; значение по умолчанию всегда используется, если не задано новое значение напрямую для типа.

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

Если пользовательское внешнее обозначение S'External_Tag совпадает с T'External_Tag для некоторого другого помеченного типа, объявленного другим объявлением в разделе, Program_Error поднимается при разработке описания_атрибута.

Требования к реализации

В реализации значение по умолчанию внешнего тега для каждого конкретного помеченного типа, объявленного в разделе, должно быть различным, при условии, что тип объявлен вне экземпляра тела обобщения. Если единица компиляции, в которой объявлен данный помеченный тип, и все единицы компиляции, от которых он семантически зависит, одинаковы в двух разных разделах, то внешний тег для типа должен быть одинаковым в обоих разделах. Что означает, что единица компиляции одинаковая в двух разных разделах, определяется реализацией. Как минимум, если единица компиляции не перекомпилируется между построением двух разных разделов, которые её включают, единица компиляции считается одинаковой в двух разделах.

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

Если пользовательское внешнее обозначение S'External_Tag совпадает с T'External_Tag для некоторого другого помеченного типа, объявленного другим объявлением в разделе, раздел может быть отклонен.
ПРИМЕЧАНИЕ 9 Следующие определённые языком атрибуты могут быть заданы, по крайней мере, для некоторых видов сущностей, к которым они применяются: Address, Alignment, Bit_Order, Component_Size, External_Tag, Input, Machine_Radix, Output, Read, Size, Small, Storage_Pool, Storage_Size, Stream_Size и Write.
ПРИМЕЧАНИЕ 10 Из общих правил в 13.1 следует, что если написать «for X'Size use Y;», то X'Size ссылка_на_атрибут вернёт Y (предполагая, что реализация позволяет использовать предложение Size). То же самое верно для всех задаваемых атрибутов, за исключением Storage_Size.

Примеры

Примеры описаний атрибутов:
Byte : constant := 8;
Page : constant := 2**12;
type Medium is range 0 .. 65_000;
for Medium'Size use 2*Byte;
for Medium'Alignment use 2;
Device_Register : Medium;
for Device_Register'Size use Medium'Size;
for Device_Register'Address use
System.Storage_Elements.To_Address(16#FFFF_0020#);
type Short is delta 0.01 range -100.0 .. 100.0;
for Short'Size use 15;
for Car_Name'Storage_Size use -- указать размер пула хранения типа доступа
2000*((Car'Size/System.Storage_Unit) +1); -- приблизительно 2000 автомобилей
function My_Input(Stream : not null access Ada.Streams.Root_Stream_Type'Class)
return T;
for T'Input use My_Input; -- см. 13.13.2
В предложении Size для Short пятнадцать битов являются минимально необходимыми, так как определение типа требует Short'Small <= 2**(–7).


Spec-Zone.ru

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