Справочник Ada 95
13.3 Операционные и представительные атрибуты
Значения некоторых характеристик, зависящих от реализации, можно получить, запросив соответствующие операционные или представительные атрибуты. Некоторые из этих атрибутов можно указать с помощью описания_атрибута.
Синтаксис
описание_атрибута ::=
for локальное_имя'идентификатор_атрибута use выражение;
| for локальное_имя'идентификатор_атрибута use имя;
for локальное_имя'идентификатор_атрибута use выражение;
| for локальное_имя'идентификатор_атрибута use имя;
Правила разрешения имен
Для описания_атрибута, указывающего атрибут, обозначающий значение, следует использовать форму с выражением. В противном случае следует использовать форму с именем.
Для описания_атрибута, указывающего атрибут, обозначающий значение или объект, ожидаемый тип для выражения или имя — тип атрибута. Для описания_атрибута, указывающего атрибут, обозначающий подпрограмму, ожидаемый профиль для имя — профиль, требуемый для атрибута. Для описания_атрибута, указывающего атрибут, обозначающий какой-либо другой тип сущности, имя должно разрешаться как обозначение сущности соответствующего типа.
Правила законности
Идентификатор_атрибута допускается в описании_атрибута только если это разрешено этим международным стандартом, или для атрибута, определяемого реализацией, если это разрешено реализацией. Каждый указываемый атрибут представляет собой операционный или представительный аспект.
Для описания_атрибута, указывающего атрибут, обозначающий подпрограмму, профиль должен быть согласован по режиму с требуемым для атрибута, а соглашение должно быть Ada. Дополнительные требования определены для конкретных атрибутов.
Статическая семантика
Определение размера — это описание_атрибута, у которого идентификатор_атрибута — Size. Аналогичные определения применяются к другим указываемым атрибутам.
Элемент хранения — это адресуемый элемент памяти в машине. Слово — это наибольший объем памяти, который можно удобно и эффективно обрабатывать аппаратурой, учитывая модель выполнения реализации. Слово состоит из целого числа элементов памяти.
Определены следующие атрибуты представления: Address, Alignment, Size, Storage_Size и Component_Size.
Для префикса X, обозначающего объект, программный модуль или метку:
- X'Address
- Обозначает адрес первого из элементов памяти, выделенных для X. Для программного модуля или метки это значение относится к машинный код, связанный с соответствующим телом или выражением. Значение этого атрибута имеет тип System.Address.
- Адрес может быть указан для автономных объектов и программных модулей с помощью описания_атрибута.
Ошибка выполнения
Если указан адрес, программист несет ответственность за обеспечение того, что адрес действителен; в противном случае выполнение программы является ошибочным.
Рекомендации по реализации
Для массива X, X'Address должен указывать на первый элемент массива, а не на границы массива.
Рекомендуемый уровень поддержки атрибута Address:
- X'Address должен давать полезный результат, если X — это объект, на который есть ссылка или тип по ссылке, или это сущность, для которой был указан адрес.
- Реализация должна поддерживать инструкции Address для импортированных подпрограмм.
- Объекты (включая подкомпоненты), на которые есть ссылки или тип по ссылке, должны быть выделены на границах элементов хранения.
- Если адрес объекта указан, или он импортирован или экспортирован, то реализация не должна выполнять оптимизации, основанные на предположении об отсутствии ссылок.
ПРИМЕЧАНИЯ
1 Указание имени ссылки в псевдониме Export (см. B.1) для подпрограммы или объекта — это альтернатива явному указанию ее адреса на этапе компоновки, позволяющая директиве компоновки разместить подпрограмму или объект в памяти.
2 Правила для атрибута Size подразумевают, что для алиасированного объекта X, если X'Size = Storage_Unit, то X'Address указывает на элемент хранения, содержащий все биты X, и только биты X.
Статическая семантика
Для префикса X, обозначающего тип или объект:
- X'Alignment
- Адрес объекта, который выделяется под управлением реализации, является целым кратным выравнивания объекта (то есть, адрес по модулю выравнивания равен нулю). Смещение компонента записи — кратное выравниванию компонента. Для объекта, который не выделяется под управлением реализации (то есть, который импортирован, выделен пользовательским выделетелем, для которого указан адрес или обозначен значением доступа, возвращаемым экземпляром Unchecked_Conversion), реализация может предположить, что адрес является целым кратным его выравнивания. Реализация не должна предполагать более строгое выравнивание.
- Значение этого атрибута имеет тип universal_integer и неотрицательно; ноль означает, что объект не обязательно выровнен на границе элемента хранения.
- Выравнивание может быть указано для базовых типов и автономных объектов с помощью описания_атрибута; выражение такого описания должно быть статическим и его значение неотрицательным. Если выравнивание типа указано, то выравнивание объекта типа не менее строгое, если выравнивание объекта также не указано. Выравнивание объекта, созданного выделетелем, — это выравнивание обозначенного типа.
- Если выравнивание указано для составного типа или объекта, это выравнивание должно быть равно наименьшему общему кратному любых указанных выравниваний подтипов компонентов или целому кратному этого значения.
Ошибка выполнения
Выполнение программы является ошибочным, если указан фрагмент Address, который противоречит выравниванию.
Если выравнивание указано для объекта, который не выделяется под управлением реализации, выполнение является ошибочным, если объект не выровнен в соответствии с выравниванием.
Рекомендации по реализации
Рекомендуемый уровень поддержки атрибута Alignment для типов:
- Реализация должна поддерживать указанные выравнивания, которые являются множителями и кратными числу элементов памяти на слово, с учетом следующего:
- Реализация не обязана поддерживать указанные выравнивания для комбинаций размеров и выравниваний, которые не могут быть легко загружены и сохранены доступными машинными инструкциями.
- Реализация не обязана поддерживать указанные выравнивания, которые больше максимального выравнивания, которое реализация возвращает по умолчанию.
Рекомендуемый уровень поддержки атрибута Alignment для объектов:
- То же, что и выше, для типов, но дополнительно:
- Для автономных объектов библиотечного уровня статически ограниченных типов реализация должна поддерживать все выравнивания, поддерживаемые целевым компонователем. Например, выравнивание по страницам, вероятно, будет поддерживаться для таких объектов, но не для типов.
ПРИМЕЧАНИЯ
3 Выравнивание — атрибут, специфичный для типа.
4 Выравнивание составного объекта всегда равно наименьшему общему кратному выравниваний его компонентов или кратному этому значению.
5 описание_компонента, фрагмент Component_Size или псевдоним Pack могут переопределять указанное выравнивание.
Статическая семантика
Для префикса X, обозначающего объект:
- X'Size
- Обозначает размер в битах представления объекта. Значение этого атрибута имеет тип universal_integer.
- Размер может быть указан для автономных объектов с помощью описания_атрибута; выражение такого описания должно быть статическим и его значение неотрицательным.
Рекомендации по реализации
Рекомендуемый уровень поддержки атрибута Size для объектов:
- Для объекта должно поддерживаться условие размера, если указанный Размер не меньше размера его подтипа и соответствует размеру в элементах хранения, кратному Выравниванию объекта (если Выравнивание не равно нулю).
Статическая семантика
Для каждого подтипа S:
- S'Размер
- Если S определен, обозначает размер (в битах), который реализация выберет для следующих объектов подтипа S:
- Компонента записи подтипа S, когда тип записи упакован.
- Формальный параметр экземпляра Unchecked_Conversion, который преобразует из подтипа S в какой-либо другой подтип.
- Если S неопределен, значение определяется реализацией. Значение этого атрибута имеет тип universal_integer. Размер объекта не меньше, чем размер его подтипа, если размер объекта не определяется условием размера, условием компонента или условием размера компонента. Размер может быть указан для первых подтипов через условие определения атрибута; выражение такого условия должно быть статическим и его значение неотрицательным.
Требования к реализации
В реализации Boolean'Размер должен быть равен 1.
Рекомендации по реализации
Если размер подтипа указан и позволяет эффективную независимую адресацию (см. 9.10) на целевой архитектуре, то размер следующих объектов подтипа должен быть равен размеру подтипа:
- Объекты с алиасами (включая компоненты).
- Компоненты без алиасов, если размер компонента не определяется условием компонента или условием размера компонента.
Условие размера на составном подтипе не должно влиять на внутреннюю структуру компонентов.
Рекомендуемый уровень поддержки атрибута Размер подтипов:
- Размер (если не указан) статического дискретного или фиксированного подтипа должен быть равен количеству битов, необходимых для представления каждого значения, принадлежащего подтипу, с помощью непристрастного представления, оставляя место для бита знака только в том случае, если подтип содержит отрицательные значения. Если такой подтип является первым подтипом, то реализация должна поддерживать указанный размер для него, который отражает это представление.
- Для подтипа, реализованного с уровнями косвенности, размер должен включать размер указателей, но не размер того, на что они указывают.
ПРИМЕЧАНИЯ
6 Размер - это атрибут, специфичный для подтипа.
7 Условие компонента или условие размера компонента могут переопределять указанный размер. Предикат Pack не может.
Статическая семантика
Для префикса T, обозначающего объект задачи (после любого неявного разыменования):
- T'Размер_Хранения
- Обозначает количество элементов хранения, зарезервированных для задачи. Значение этого атрибута имеет тип universal_integer. Размер_Хранения включает размер стека задачи, если таковой имеется. Язык не определяет, включает ли он другой связанный с задачей объем памяти (например, «блок управления задачей», используемый некоторыми реализациями). Если предоставлен предикат Storage_Size, значение атрибута Size_Storage не меньше указанного в предикате значения.
Предикат Storage_Size определяет объем памяти, который должен быть зарезервирован для выполнения задачи.
Синтаксис
Форма предиката Storage_Size следующая:
pragma Storage_Size(выражение);
Предикат Storage_Size разрешен только непосредственно внутри определения_задачи.
Правила разрешения имен
Ожидается, что выражение предиката Storage_Size будет любого целочисленного типа.
Динамическая семантика
Предикат Storage_Size обрабатывается при создании объекта типа, определенного непосредственно вложенным определении_задачи. При обработке предиката Storage_Size значение выражения оценивается; атрибут Размер_Хранения вновь созданного объекта задачи не меньше значения выражения.
В момент создания объекта задачи или при активации задачи возникает ошибка Storage_Error, если свободной памяти недостаточно для размещения требуемого Размер_Хранения.
Статическая семантика
Для префикса X, обозначающего подтип массива или массивный объект (после любого неявного разыменования):
- X'Размер_Компоненты
- Обозначает размер в битах компонентов типа X. Значение этого атрибута имеет тип universal_integer.
- Размер_Компоненты может быть указан для типов массивов через условие_определения_атрибута; выражение такого условия должно быть статическим и его значение неотрицательным.
Рекомендации по реализации
Рекомендуемый уровень поддержки атрибута Размер_Компоненты:
- Реализация не обязана поддерживать указанные размеры компонентов, которые меньше размера подтипа компонента.
- Реализация должна поддерживать указанные размеры компонентов, которые являются кратными или делителями размера слова. Для таких размеров компонентов массив не должен содержать пробелы между компонентами. Для других размеров компонентов (если поддерживаются) массив не должен содержать пробелов между компонентами, когда также указано уплотнение; реализация должна запретить это сочетание в случаях, когда она не может поддерживать представление без пробелов.
Статическая семантика
Определяется следующий операционный атрибут: External_Tag.
Для каждого подтипа S помеченного типа T (специфического или класса):
- S'External_Tag
- S'External_Tag обозначает внешнее строковое представление для S'Tag; оно имеет предопределенный тип String. External_Tag может быть указан для конкретного помеченного типа через условие определения атрибута; выражение такого условия должно быть статическим. По умолчанию внешнее представление тега определяется реализацией. См. 3.9.2 и 13.13.2. Значение External_Tag никогда не наследуется; значение по умолчанию всегда используется, если не указано новое значение непосредственно для типа.
Требования к реализации
В реализации значение по умолчанию внешнего тега для каждого специфического помеченного типа, объявленного в разбиении, должно быть различным, пока тип объявлен вне экземпляра тела генерика. Если единица компиляции, в которой объявлен данный помеченный тип, и все единицы компиляции, от которых он семантически зависит, одинаковы в двух разных разбиениях, то внешний тег типа должен быть одинаковым в двух разбиениях. Что означает, что единица компиляции одинакова в двух разных разбиениях, определяется реализацией. Как минимум, если единица компиляции не перекомпилируется между построением двух разных разбиений, которые ее включают, то единица компиляции считается одинаковой в двух разбиениях.
ПРИМЕЧАНИЯ
8 Следующие определенные языком атрибуты могут быть указаны, по крайней мере, для некоторых видов сущностей, к которым они применяются: Адрес, Размер, Размер_Компоненты, Выравнивание, External_Tag, Small, Порядок_Битов, Storage_Pool, Размер_Хранения, Write, Output, Read, Input и Machine_Radix.
9 Из общих правил в 13.1 следует, что если написать «for X'Размер use Y;», то ссылка на атрибут X'Размер вернет Y (предполагая, что реализация позволяет условие размера). То же самое справедливо для всех указываемых атрибутов, кроме Размер_Хранения.
Примеры
Примеры условий определения атрибутов:
Байт : константа := 8;
Страница : константа := 2**12;
Страница : константа := 2**12;
тип Среднее является диапазоном 0 .. 65_000;
для Среднее'Размер используется 2*Байт;
для Среднее'Выравнивание используется 2;
Регистр_Устройства : Среднее;
для Регистр_Устройства'Размер используется Среднее'Размер;
для Регистр_Устройства'Адрес используется System.Storage_Elements.To_Address(16#FFFF_0020#);
для Среднее'Размер используется 2*Байт;
для Среднее'Выравнивание используется 2;
Регистр_Устройства : Среднее;
для Регистр_Устройства'Размер используется Среднее'Размер;
для Регистр_Устройства'Адрес используется System.Storage_Elements.To_Address(16#FFFF_0020#);
тип Короткий является дельта 0.01 диапазоном -100.0 .. 100.0;
для Короткий'Размер используется 15;
для Короткий'Размер используется 15;
для Car_Name'Размер_Хранения используется -- указать размер пула хранения типа доступа
2000*((Car'Размер/System.Storage_Unit) +1); -- приблизительно 2000 автомобилей
2000*((Car'Размер/System.Storage_Unit) +1); -- приблизительно 2000 автомобилей
функция My_Read(Поток : доступ Ada.Streams.Root_Stream_Type'Class)
возвращает T;
для T'Read используется My_Read; -- см. 13.13.2
возвращает T;
для T'Read используется My_Read; -- см. 13.13.2
ПРИМЕЧАНИЯ
10 Примечания к примерам: В разделе «Размер» для типа Short 15 бит является минимально необходимым значением, так как определение типа требует Short'Small <= 2**(-7).