Значения некоторых зависящих от реализации характеристик могут быть получены с помощью соответствующих атрибутов представления. Эти атрибуты описаны ниже.
Для любого объекта, программного модуля, метки или входа X:
X'ADDRESS Вырабатывает адрес первого кванта памяти, отведенной под X. Для подпрограммы, пакета, задачного модуля или метки это значение ссылается на машинный код, связанный с соответствующим телом или оператором. Для входа, для которого задан спецификатор адреса, это значение ссылается на соответствующее аппаратное прерывание. Значение этого атрибута принадлежит типу ADDRESS, определенному в пакете SYSTEM.
Для любого типа или подтипа X или для любого объекта X:
X’SIZE Примененный к объекту вырабатывает число битов, отводимых в памяти для размещения объекта. Примененный к типу или подтипу вырабатывает минимальное число битов, необходимое реализации для размещения любого возможного объекта этого типа или подтипа. Значение этого атрибута имеет типуниверсальный_целый.
Если префиксом атрибута является функция, то атрибут понимается как атрибут функции (а не результата вызова функции). Если тип префикса — ссылочный тип, то атрибут понимается как атрибут префикса (а не указанного объекта: атрибуты этого объекта могут быть записаны с префиксом, оканчивающимся зарезервированным словом all).
Для любого компонента К записи 3:
3 .IMPOSITION Вырабатывает величину смещения первого кванта памяти, занятого полем К, относительно начала первого кванта памяти, занятого записью 3. Величина смещения измеряется числом квантов памяти. Значение этого атрибута принадлежит универсальному_целому типу.
3.K'FIRST_BIT Вырабатывает величину смещения первого бита, занятого полем К, относительно начала первого кванта памяти, занятого К. Величина смещения измеряется числом битов. Значение этого атрибута имеет универсальный—целый тип.
3.K'LAST_BIT Вырабатывает величину смещения последнего бита, занятого полем К, относительно начала первого кванта памяти, занятого К. Величина смещения измеряется числом битов. Значение этого атрибута имеет универсальный _целый тип.
Для любого ссылочного типа или подтипа Т:
T'STORAGE_SIZE Вырабатывает общее число квантов памяти, выделенных для набора, связанного с базовым типом Т. Значение атрибута имеет универсальный _целый тип.
Для любого заданного типа или объекта заданного типа Т:
T'STORAGE—SIZE Вырабатывает число квантов памяти, выделенных для каждой активизации задачи типа Т или для активизации объекта Т заданного типа. Значение этого атрибута имеет универсальный_целый тип.
Примечание. Для объекта X заданного типа атрибут X'SIZE вырабатывает число разрядов, используемых для размещения объекта X; атрибут X'STORAGE_SIZE вырабатывает число квантов памяти, выделенных для активизации задачи, указанной X. Для формального параметра X в случае передачи параметра копированием X'ADDRESS вырабатывает адрес локальной копии; в случае передачи параметра ссылкой X'ADDRESS вырабатывает адрес фактического параметра.
. А т р и б у т ы представления вещественных типов
Для каждого вещественного типа или подтипа Т определены нижеследующие машинно-зависимые атрибуты, не связанные с модельными числами. Использующие эти атрибуты программы могут получить некоторую дополнительную информацию о характеристиках числового типа (см. разд. 4.5.7 о правилах определения точности операций с вещественными операндами). Для обеспечения переносимости программ должна быть обеспечена известная осторожность в использовании таких машинно-зависимых атрибутов.
Атрибуты, применимые к плавающим и фиксированным типам:
T'MACHINE_ROUNDS Вырабатывает значение TRUE, если каждая предопределенная арифметическая операция над значениями базового типа Т либо возвращает точный результат, либо осуществляет округление. В противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN.
T’MACHINE_OVERFLOWS Вырабатывает значение TRUE, если каждая предопределенная операция над значениями базового типа Т либо возвращает точный результат, либо возбуждает исключение NUMERIC_ERROR при переполнении (см. разд. 4.5.7); в противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN.
Следующие атрибуты дают характеристики машинного представления значений плавающего типа в терминах канонической формы, определенной в разд. 3.5.7:
T'MACHINE_RADIX Вырабатывает значение основания системы счисления, используемого в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный _целый тип.
T'MACHINE_MANTISSA Вырабатывает число цифр в мантиссе машинного представления базового типа Т. (Цифра — это расширенная цифра из диапазона от 0 до T'MACHINE_RADIX-1.) Значение этого атрибута имеет универсальный „целый тип.
T'MACHINE—ЕМАХ Вырабатывает наибольшее значение порядка в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный_ целый тип.
T'MACHINE_EMIN Вырабатывает наименьшее (наибольшее по модулю отрицательное) значение порядка в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный ..целый тип.
Примечание. В большинстве машин наибольшее представимое в машине число типа Т равно
(T'MACHINE_RADIX) ** (Т MACHINE_EMAX), а наименьшее положительное представимое число в машине равно
(TfaACHINE-RADIX) ** (T'MACHINE_EMIN-1).
Вставки машинных кодов
Машинные коды могут быть включены в программу с помощью вызова процедуры, последовательность операторов которой состоит из операторов кода.
оператор—кода : : = обозначение_типа агрегат_записи;
Оператор кода допустим только в последовательности операторов тела процедуры. Если в теле процедуры содержатся операторы кода, то в нем недопустимы никакие формы операторов, кроме операторов кода (помеченных или нет); из описаний допустимы только спецификаторы использования; недопустимы обработчики исключения (комментарии и прагмы допустимы как обычно).
Каждая машинная команда записывается как агрегат именуемого типа, - агрегат определяет эту команду. Базовый тип обозначения типа в операторе кода должен быть описан в предопределенном пакете MACEIINE_CODE; этот пакет должен упоминаться в спецификаторе контекста, применяемом к компилируемому модулю, в который входит оператор кода. Реализация не обязана обеспечивать такой пакет.
В реализации допустимо наложение дополнительных ограничений на допустимые в операторах кода агрегаты записи. Например, можно требовать, чтобы выражения в агрегатах были статическими.
Реализация может определить машинно-зависимые прагмы, указывающие соглашения об использовании регистров и вызовов. Такие соглашения и прагмы должны быть описаны в руководстве по реализации в соответствии с обязательным приложением 4.
Пример:
М: МАСКА;
procedure УСТАНОВИТЬ_МАСКУ;
pragma INLINE (УСТАНОВИТЬ_МАСКУ);
procedure УСТАНОВИТЬ_МАСКУ is
use MACHINE_CODE;
begin
ФОРМАТ_СИ' (КОД => SSM, Б = > М'БАЗОВЫЙ_РЕГ, CM => М'СМЕЩ);
- - М'Б АЗОВЫЙ _РЕГ и М'СМЕЩ - это заданные реализацией предопределенные - - атрибуты!
end;
Связь с другими языками
Из программы, написанной на языке Ада, может быть вызвана подпрограмма, написанная на другом языке; все связи с этими подпрограммами обеспечиваются через параметры и результаты функций. Для каждой такой подпрограммы должна быть задана следующая прагма:
pragma INTERFACE (имя_языка, имя_подпрограммы);
Допустимо использование совмещенных имен подпрограмм. Эта прагма допустима на месте элемента описания и должна применяться к подпрограмме, описанной ранее в этом же разделе описаний или спецификации пакета. Прагма также допустима и для библиотечного модуля; в этом случае прагма должна помещаться после описания подпрограммы, но до любого следующего компилируемого модуля. Прагма задает другой язык (и тем самым соглашения о вызовах) и сообщает компилятору, что для такой подпрограммы будет задан объектный модуль. Для таких подпрограмм недопустимо задание тела (даже в форме следа тела), так как его команды написаны на другом языке.
Эту возможность не обязательно обеспечивают все реализации. Реализация может наложить ограничения на допускаемые формы и места параметров и вызовов.
Пример:
package БИБЛ_ФОРТ is
function SQRT (X: FLOAT) return FLOAT;
function EXP (X: FLOAT) return FLOAT;
private
pragma INTERFACE (ФОРТРАН, SQRT);
pragma INTERFACE (ФОРТРАН, EXP);
end БИБЛ_ФОРТ;
Примечание. Соглашения, использованные в других языковых процессорах, которые вызывают Ада-программы, не являются частью определения языка Ада. Эти соглашения должны быть определены в описании других языковых процессоров.
Прагма INTERFACE не определена для настраиваемых подпрограмм.
Неконтролируемое программирование
Для неконтролируемого освобождения памяти и для неконтролируемого преобразования типов используются предопределенные настраиваемые библиотечные подпрограммы: UNCHECKED—DEALLOCATION и UNCHECKED-CONVERSION.
generic
type OBJECT is limited private;
type NAME is access OBJECT;
procedure UNCHECKED _DEALLOCATION (X: in out NAME);
generic
type SOURCE is limited private;
type TARGET is limited private;
function UNCHECKED-CONVERSION (S: SOURCE) return TARGET;
Неконтролируемое освобождение памяти
В результате вызова процедуры, полученной конкретизацией настраиваемой процедуры UNCHECKED-DEALLOCATION, производится неконтролируемое освобождение памяти, занимаемой объектом, указанным значением ссылочного типа. Например:
procedure СВОБОДНО is new UNCHECKED DEALLOCATION
(имя _типа_объекта, имя ^ссылочного _типа);
Такая процедура СВОБОДНО дает следующий результат:
после выполнения СВОБОДНО (X) значением X является null;
если X уже равно null, то СВОБОДНО (X) не имеет другого результата;
если X не равно null, то СВОБОДНО (X) обозначает, что указанный значением X объект не требуется, и поэтому занимаемая им память может использоваться для других целей.
Если X и Y указывают на один и тот же объект, тсГ после вызова СВОБОДНО (X) доступ к этому объекту (или попытка доступа к нему) через Y ошибочен; язык не определяет, что происходит в результате такого доступа.
Примечание. Согласно правилам видимости настраиваемая процедура UNCHECKED -DEALLOCATION не видима в компилируемом модуле, если только ее имя не указано в спецификаторе совместности этого компилируемого модуля.
Если X указывает на объект задачного типа, то вызов СВОБОДНО (X) никак не влияет на задачу, указанную значением этого объекта. Это же относится и к любому подкомпоненту задачного типа объекта X.
Н е к о н т р о л и р у е м о е преобразование типов Неконтролируемое преобразование типа можно осуществить вызовом функции, полученной конкретизацией настраиваемой функции UNCHECKED-CONVERSION.
Неконтролируемое преобразование типа состоит в возврате значения параметра в качестве значения целевого типа, т. е. поразрядное изображение, определяющее исходное значение, возвращается неизменным, как поразрядное изображение значения целевого типа. Реализация может наложить ограничения на неконтролируемое преобразование типа, например, ограничения, зависящие от предполагаемых размеров объектов исходного и целевого типов. Такие ограничения должны быть отражены в руководстве по реализации в соответствии с обязательным приложением 4.
При использовании неконтролируемых преобразований типов сам программист несет ответственность за сохранность свойств, гарантируемых языком для объектов целевого типа. Программы, нарушающие их свойства при неконтролируемых преобразованиях, являются ошибочными.
Примечание. Согласно правилам видимости настраиваемая функция UNCHECKED-CONVERSION не видима в компилируемом модуле, если она ие упомянута в спецификаторе совместности этого компилируемого модуля.
14. ВВОД-ВЫВОД
Ввод-вывод в языке обеспечивается предопределенными пакетами. Настраиваемые пакеты SEQUENTIAL-IO и D1RECT-IO определяют операции ввода-вывода, которые применимы для файлов с элементами данного типа. В пакете ТЕХТ_Ю даны дополнительные операции ввода-вывода текстов. В пакете IO-EXCEPTIONS определены исключения, необходимые для трех указанных пакетов. Наконец, пакет LOW_LEVEL_IO позволяет осуществлять непосредственное управление периферийными устройствами.
Внешние файлы и файловые объекты
Значения, вводимые из внешнего для программы окружения или выводимые в это окружение, размещаются во внешних файлах. Внешним файлом может быть нечто внешнее по отношению к программе, которая может произвести читаемое значение или получить записываемое. Внешний файл идентифицируется строкой (именем). Вторая строка (форма) задает дополнительные системо-зависимые характеристики, которые могут быть сопоставлены с файлом, например, физическая организация или права доступа. Соглашения об интерпретации таких строк должны быть приведены в руководстве по реализации в соответствии с обязательным приложением 4.
Операции ввода и вывода выражены операциями над объектами некоторого файлового типа, а не непосредственно в терминах внешних файлов. Далее в этой главе термин файл будет всегда использоваться для ссылки на объект файлового типа; в остальных случаях будет использоваться термин внешний файл. Значения, передаваемые данному файлу, должны быть все одного и того же типа.
Ввод и вывод для последовательных файлов из элементов некоторого типа определены настраиваемым пакетом SEQUENTIAL_IO. Общая структура этого пакета дана ниже.
with IO-EXCEPTIONS;
generic
type ELEMENT_TYPE is private;
package SEQUENTIAL_IO is
type FILE-TYPE is limited private;
type FILE! MODE is (IN_FILE, OUT-FILE);
procedure OPEN (FILE: in out FILE TYPE;. . .);
procedure READ (FILE: in FILETYPE; ITEM: out ELEMENT-TYPE) ;
procedure WRITE (FILE: in FILE TYPE; ITEM: in ELEMENT-TYPE);