Спецификаторы представления и особенности, зависящие от реализации
Содержание
СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ СПЕЦИФИКАТОРЫ ДЛИНЫ СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ПЕРЕЧИСЛЕНИЯ СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ЗАПИСЕЙ СПЕЦИФИКАТОРЫ АДРЕСА ИЗМЕНЕНИЕ ПРЕДСТАВЛЕНИЯ СИСТЕМНЫЙ ПАКЕТ ВСТАВКИ МАШИННЫХ КОДОВ СВЯЗЬ С ДРУГИМИ ЯЗЫКАМИ НЕКОНТРОЛИРУЕМОЕ ПРОГРАММИРОВАНИЕВ этой главе описываются спецификаторы представления, зависящие от реализации особенности, а также некоторые возможности, используемые в системном программировании.
Изменение представления
Для данного типа и данного аспекта его представления допустимо не более одного спецификатора представления. Поэтому если желательно другое представление, то необходимо описать второй тип, производный от первого, и для него специфицировать другое представление.
Пример: PACKED_DESCRIPTOR and DESCRIPTOR -- это два различных -— типа с одинаковыми характеристиками, но различным представлениемtype DESCRIPTOR is record -- компоненты DESCRIPTOR end record;type PACKED_DESCRIPTOR is new DESCRIPTOR;for PACKED_DESCRIPTOR use record -— спецификаторы компонент для всех или некоторых компонент end record;
Изменение представления может быть теперь достигнуто присваиванием с явным преобразованием типа:
D : DESCRIPTOR; Р : PACKED_DESCRIPTOR;Р := PACKED_DESCRIPTOR(D); —- упаковка D D := DESCRIPTOR(P); -— распаковка РНеконтролируемое программирование
Для неконтролируемого освобождения памяти и неконтролируемого преобразования типов используются предопределенные настраиваемые библиотечные подпрограммы: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;1. НЕКОНТРОЛИРУЕМОЕ ОСВОБОЖДЕНИЕ ПАМЯТИ
В результате вызова процедуры, полученной конкретизацией настраиваемой процедуры UNCHECKED_DEALLOCATION, производится неконтролируемое освобождение памяти, занимаемой объектом, указанным значением ссылочного типа. Например:
procedure FREE is new UNCHECKED_DEALLOCATION(имя_типa_oбъeкra, имя_ссылочного_гипа);Такая процедура FREE дает следующий результат:
а) после выполнения FREE(X) значением Х является null;
б) если Х уже равно null, то FREE(X) не имеет другого результата; -
в) если Х не равно null, то FREE(X) обозначает, что указанный значением Х объект не требуется, и поэтому занимаемая им память может использоваться для других целей.
Если Х и Y указывают на один и тот же объект, то после вызова FREE(X) доступ к этому объекту (или попытка доступа к нему) через Y ошибочен; язык не определяет, что происходит в результате такого доступа.
Примечание. Согласно правилам видимости, настраиваемая процедура UNCHECKED_DEALLOCATION невидима в компилируемом модуле, если только ее имя не указано в спецификаторе совместности этого компилируемого модуля.
Если Х указывает на объект задачного типа, то вызов FREE(X) никак не влияет на задачу, указанную значением этого объекта. Это же относится и к любой подкомпоненте задачного типа объекта X.
Ссылки: библиотечный модуль 10.1, видимость 8.3, вызов процедуры 6.4, задача 9, задач-ный объект 9.2, значение ссылочного типа null 3.3, компилируемый модуль 10.1, конкретизация настройки 12.3, настраиваемый модуль 12, настраиваемая процедура 12.1, объект 3.2, ошибочно 1.6, подкомпонента 3.3, применим 1, процедура 6, спецификатор совместности 1, ссылочный тип 3.8, указывать 3.8,
2. НЕКОНТРОЛИРУЕМОЕ ПРЕОБРАЗОВАНИЕ ТИПА
Неконтролируемое преобразование типа можно осуществить вызовом функции, полученной конкретизацией настраиваемой функции UNCHECKED_CONVERSION.
Неконтролируемое преобразование типа состоит в возврате значения параметра в качестве значения целевого типа, т.е. поразрядное изображение, определяющее исходное значение, возвращается неизменным, как поразрядное изображение значения целевого типа. Реализация может наложить ограничения на неконтролирумое преобразование типа, например ограничения, зависящие от предполагаемых размеров объектов исходного и целевого типов. Такие ограничения должны быть отражены в приложении F.
При использовании неконтролируемых преобразований типов сам программист несет ответственность за сохранность свойств, гарантируемых языком для объектов целевого типа. Программы, нарушающие их свойства при неконтролируемых преобразованиях, являются ошибочными.
Примечание. Согласно правилам видимости, настраиваемая функция UNCHECKED_CONVERSION невидима в компилируемом модуле, если она не упомянута в спецификаторе совместности этого компилируемого модуля.
Ссылки: компилируемый модуль 10.1, конкретизация 12.3, настраиваемая функция 12.1, ошибочный 1.6, параметр подпрограммы 6.2, применим 1, спецификатор совместности 1, тип
В спецификаторе длины для SHORT
Примечание
-- предполагаемые описания:type MEDIUM is range 0 .. 65000; type SHORT is delta 0.01 range -100.0 .. 100.0; type DEGREE is delta 0.1 range -360.0 .. 360.0;BYTE : constant := 8; PAGE : constant := 2000;-- спецификаторы длины:for COLOR'SIZE use UBYTE; -— см. 1 for MEDIUM'SIZE use 2*BYTE; for SHORT'SIZE use 15;for CAR_NAME'STORAGE_SIZE use -- примерно 2000 машин 2000*((CAR'SIZE/SYSTEM.STORAGE_UNIT) +1);for KEYBOARD_DRIVER_STORAGE_SIZE use 1*PAGE;for DEGREE'SMALL use 360.0/2**(SYSTEM.STORAGE_UNIT - 1); Примечание к примерам. В спецификаторе длины для SHORT минимально необходимы пятнадцать разрядов, так как определение типа требует SHORT'SMALL = 2.0**(-7) и SHORT'MANTISSA = 14. Спецификатор длины для DEGREE вводит модельные числа, которые занимают в точности весь диапазон типа.
Ссылки: активизация задачи 9.3, атрибут 4, вещественный тип 5, выражение 4.4, вычисление 4.5, генератор 4.8, дельта фиксированного типа 9, должен 1.6, допустим 1.6, задача 9, задачный тип 9.1, именуемый тип 3.7, индексируемый тип 3.6, квант памяти 13.7, подкомпонента 3.3, набор 3.8, наименьшее фиксированного типа 10, неограниченный индексируемый тип 3.6, объект 3.2, ограничение 3.3, пакет SYSTEM 13.7, первый именованный подтип 13.1, подтип индекса 3.6, понятие 3.1, предвыполнение 3.9, производный тип 3.4, составной тип 3.3, спецификация задачи 9.1, ссылочный тип 3.8, статический подтип 4.9, статическое выражение 4.9, статическое ограничение 4.9, тип 3.3, указывать 3.8, фиксированный тип 9, целый тип 4, числовой тип
Системный пакет
Для каждой реализации имеется предопределенный библиотечный пакет SYSTEM, который включает определения некоторых характеристик, зависящих от конфигурации. Спецификация пакета зависит от реализации и должна быть приведена в приложении F. Видимый раздел этого пакета должен содержать по крайней мере следующие описания:
package SYSTEM is type ADDRESS is определен-реализацией; type NAME is определенный-реализацией-перечислимого-типа; SYSTEM-NAME : constant NAME := определен - реализацией; STORAGE-UNIT : constant := определен-реализацией; MEMORY-SIZE : constant := определен-реализацией; -- зависящие от системы именованные числа: MIN-INT : constant := определен-реализацией; МАХ-INT : constant := определен-реализацией; MAX-DIGITS : constant := определен-реализацией; MAX-MANTISSA : constant := определен-реализацией; FINE-DELTA : constant := определен-реализацией; TICK : constant := определен-реализацией; -- другие зависящие от системы описания: subtype PRIORITY is INTEGER range определен-реализацией; end SYSTEM;Тип ADDRESS — это тип адресов, задаваемых спецификаторами адреса; к этому же типу принадлежат значения, вырабатываемые атрибутом ADDRESS. Значения перечислимого типа NAME — это имена альтернативных машинных конфигураций, обрабатываемых реализацией;
одно из них — константа SYSTEM-NAME. Именованное число STORAGE-UNIT равно числу разрядов в кванте памяти, а именованное число MEMORY-SIZE — числу квантов памяти, доступных в конфигурации; эти именованные числа имеют универсальный-целый тип.
Альтернативная форма пакета SYSTEM с другими значениями SYSTEM-NAME, STORAGE-UNIT и MEMORY-SIZE может быть получена использованием соответствующих прагм. Эти прагмы допустимы только в начале компиляции до первого компилируемого модуля (если он есть) компиляции.
pragma SYSTEM-NAME (литерал-перечисления);
В результате выполнения этой прагмы заданный идентификатором литерал перечисления будет использован для определения константы SYSTEM-NAME. Эта прагма допустима, только если этот идентификатор соответствует одному из литералов типа NAME.
pragma STORAGE-UNIT (числовой-литерал);
В результате выполнения этой прагмы заданное числовым литералом значение будет использовано для определения именованного числа STORAGE-UNIT.
pragma MEMORY-SIZE (числовой-литерал);
В результате выполнения этой прагмы заданное числовым литералом значение будет использовано для определения именованного числа MEMORY-SIZE.
Компиляция любой из этих прагм вызовет неявную перекомпиляцию пакета SYSTEM. Следовательно, любой компилируемый модуль, в спецификаторе контекста которого упоминается пакет SYSTEM, становится устаревшим. Реализация может ввести дополнительные ограничения на использование этих прагм. Например, реализация может допустить их только в начале первой компиляции, когда создается новая программная библиотека.
Примечание. Согласно правилам видимости, описание из пакета SYSTEM видимо в компилируемом модуле только в том случае, если этот пакет упомянут в спецификаторе совместности, примененном (непосредственно или косвенно) к данному компилируемому модулю.
Ссылки: атрибут 4, библиотечный модуль 10.1, видимость 8.3, видимый раздел 7.2, должен 1.6, идентификатор 2.3, именованное число 3.2, компилируемый модуль 10.1, литерал перечисления 1, описание 3.1, описание числа 2, пакет 7, перечислимый тип 1, прагма 2.8, применим 1, программная библиотека 10.1, спецификатор адреса 13.5, спецификатор совместности 1, спецификация пакета 7.1, тип 3.3, числовой литерал
1. ЗАВИСЯЩИЕ ОТ СИСТЕМЫ ИМЕНОВАННЫЕ ЧИСЛА
Перечисленные ниже именованные числа описаны в пакете SYSTEM. Числа FINE-DELTA и TICK принадлежат универсальному-вещественному типу, остальные — универсальному-целому типу.
MIN-INT | Наименьшее (наибольшее по модулю отрицательное) значение из всех определенных целых типов. |
МАХ-I NT | Наибольшее (положительное) значение из всех предопределенных целых типов. |
MAX-DIGITS | Наибольшее допустимое значение числа значащих десятичных цифр в ограничении для плавающего типа. |
MAX-MANTISSA | Наибольшее возможное число двоичных цифр в мантиссе модельных чисел фиксированного подтипа. |
FINE-DELTA | Наименьшая дельта, допустимая в ограничении для фиксированного типа, которое имеет ограничение диапазона -. |
TICK | Базовый период времени, выраженный в секундах. |
Ссылки: дельта из ограничения фиксированного типа 9, допустим 1.6, именованное число 3.2, модельное число 6, ограничение диапазона 3.5, ограничение для плавающего типа 7, ограничение для фиксированного типа 9, пакет 7, пакет SYSTEM 13.7, тип 3.3, универсальный-вещественный тип 6, универсальный-целый тип 4, целый тип 4.
2. АТРИБУТЫ ПРЕДСТАВЛЕНИЯ
Значения некоторых зависящих от реализации характеристик могут быть определены с помощью соответствующих атрибутов представления. Эти атрибуты описаны ниже.
Для любого объекта, программного модуля, метки или входа X:
X'ADDRESS | Вырабатывает адрес первого кванта памяти, отведенной под X. Для подпрограммы, пакета, задачного модуля или метки это значение ссылается на машинный код, связанный с соответствующим телом или оператором. Для входа, для которого задан спецификатор адреса, это значение ссылается на соответствующее аппаратное прерывание. Значение этого атрибута принадлежит типу ADDRESS, определенному в пакете SYSTEM. |
Для любого типа или подтипа Х или для любого объекта X:
X'SIZE | Примененный к объекту вырабатывает число битов, отводимых в памяти для размещения объекта. Примененный к типу или подтипу вырабатывает минимальное число битов, необходимое реализации для размещения любого возможного объекта этого типа или подтипа. Значение этого атрибута имеет тип универсальный-целый. |
Если префиксом атрибута является функция, то атрибут понимается как атрибут функции (а не как результат вызова функции). Если тип префикса — ссылочный тип, то атрибут понимается как атрибут префикса (а не указанного объекта: атрибуты этого объекта могут быть записаны с префиксом, оканчивающимся зарезервированным словом all).
Для любого компонента С записи R:
R.C'POSITION | Вырабатывает величину смещения первого кванта памяти, занятого полем С, относительно первого кванта памяти, занятого записью R. Величина смещения измеряется числом квантов. Значение этого атрибута принадлежит универсальному-целому типу. |
R.C'FIRST_BIT | Вырабатывает величину смещения первого бита, занятого полем С, относительно первого кванта памяти. Величина смещения измеряется числом битов. Значение этого атрибута имеет универсальный-целый тип. |
R.C'LAST_BIT | Вырабатывает величину смещения последнего бита, занятого полем С, относительно первого кванта памяти, занятого С. Величина смещения измеряется числом битов. Значение этого атрибута имеет универсальный-целый тип. |
Для любого ссылочного типа или подтипа Т:
Т'STORAGE_SIZE | Вырабатывает общее число квантов памяти, выделенных для набора, связанного с базовым типом Т. Значение атрибута имеет универсальный-целый тип. |
Для любого задачного типа или объекта задачного типа Т:
Т'STORAGE_SIZE | Вырабатывает число квантов памяти, выделенных для каждой активизации задачи типа Т или активизации объекта Т задачного типа. Значение этого атрибута имеет универсальный-целый тип. |
Примечание. Для объекта Х задачного типа атрибут X'SIZE вырабатывает число разрядов, используемых для размещения объекта X; атрибут X'STORAGE_SIZE вырабатывает число квантов памяти, выделенных для активизации задачи, указанной X. Для формального параметра Х в случае передачи параметра копированием Х'ADDRESS вырабатывает адрес локальной копии; в случае передачи параметра ссылкой Х'ADDRESS вырабатывает адрес фактического параметра.
Ссылки: активизация 9.3, атрибут 4, базовый тип 3.3, вход 9.5, задача 9, задачный модуль 9, задачный объект 9.2, задачный тип 9.2, квант памяти 13.7, компонента 3.3, метка 5.1, набор 3.8, объект 3.2, объект именуемого типа 3.7, оператор 5, пакет 7, передача параметров 6.2, подпрограмма 6, подтип 3.3, предопределенный пакет SYSTEM 13.7, предопределенный тип ADDRESS 13.7, программный модуль 6, спецификатор адреса 13.5, ссылочный подтип 3.8, ссылочный тип 3.8, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, тип 3.3, универсальный-целый тип 4, фактический параметр 6.2, формальный параметр 6.1,
3. АТРИБУТЫ ПРЕДСТАВЛЕНИЯ ВЕЩЕСТВЕННЫХ ТИПОВ
Для каждого вещественного типа или подтипа Т определены нижеследующие машинно-зависимые атрибуты, не связанные с модельными числами. Использующие эти атрибуты программы могут получить некоторую дополнительную информацию о характеристиках числового типа (см. разд. 7 о правилах определения точности операций с вещественными операндами). Для обеспечения переносимости программ должна быть обеспечена известная осторожность в использовании таких машинно-зависимых атрибутов.
Атрибуты, применимые к плавающим и фиксированным типам:
T'MACHINE_ROUNDS | Вырабатывает значение TRUE, если каждая предопределенная арифметическая операция над значениями базового типа Т либо возвращает точный результат, либо осуществляет округление. В противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN. |
T'MACHINE_OVERFLOWS | Вырабатывает значение TRUE, если каждая предопределенная операция над значениями базового типа Т либо возвращает точный результат, либо возбуждает исключение NUMERIC_ERROR при перевыполнении (см. 7); в противном случае вырабатывает значение FALSE. Значение этого атрибута имеет предопределенный тип BOOLEAN. |
Следующие атрибуты дают характеристики машинного представления значений плавающего типа в терминах канонической формы, определенной в разд. 7:
T'MACHINE_RADIX | Вырабатывает значение основания системы счисления, используемого в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный-целый тип. |
T'MACHINE_MANTISSA | Вырабатывает число цифр в мантиссе машинного представления базового типа Т. (Цифра — это расширенная цифра из диапазона 0 .. Т'MACHINE_RADIX - 1.) Значение этого атрибута имеет универсальный-целый тип. |
T'MACHINE_EMAX | Вырабатывает наибольшее значение порядка в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный-целый тип. |
T'MACHINE_EMIN | Вырабатывает наименьшее (наибольшее по модулю отрицательное) значение порядка в машинном представлении базового типа Т. Значение этого атрибута имеет универсальный-целый тип. |
Примечание. В большинстве машин наибольшее представимое в машине число типа Т равно
F'MACHINE_RADIX..(F'MACHINE_EMIN - 1)
а наименьшее положительное представимое число в машине равно
F'MACHINE_RADIX ** (F'MACHINE_EMIN - 1)
Ссылки: арифметическая операция 4.5, атрибут 4, базовый тип 3.3, вещественный тип 6, исключение NUMERIC_ERROR 11.1, логическое значение TRUE 3, логическое значение FALSE 3, модельное число 6, основание системы счисления 7, плавающий тип 7, подтип 3.3, предопределенный логический тип 3, предопределенная операция 3, тип 3.3, универсальный-целый тип 4, фиксированный тип 9, числовой тип
Спецификаторы адреса
Спецификатор адреса задает адрес в памяти для понятия.
спецификатор - адреса :: = for простое-имя use at простое-выражение;Выражение после зарезервированного слова at должно быть типа ADDRESS, определенного в пакете SYSTEM (см. 13.7). Этот пакет должен быть именован в спецификаторе совместности компилируемого модуля, в котором помещается спецификатор адреса. Условия, определяющие интерпретацию значения типа ADDRESS как адреса, уровня прерывания или чего-либо другого, зависят от реализации. Ниже перечислены допустимые толкования простого имени и смысл соответствующего адреса:
а) имя объекта: требуемый адрес — адрес объекта (переменной или константы);
б) имя подпрограммы, пакета или задачного модуля: требуемый адрес — адрес машинного кода, связанного с телом программного модуля;
в) имя одиночного входа: адрес задает аппаратное прерывание, связанное с этим входом. Если простое имя — это имя одиночной задачи, то спецификатор адреса относится к задачному модулю, а не к задачному объекту. Во всех случаях спецификатор адреса является правильным только тогда, когда точно одно описание с этим идентификатором помещено раньше непосредственно в том же разделе описаний, спецификации пакета или спецификации задачи. В качестве простого имени недопустимо имя, введенное описанием переименования.
Спецификаторы адреса не могут быть использованы для задания перекрытия объектов или перекрытия программных модулей. Данное прерывание может быть связано не более чем с одним входом. Любая программа, использующая такой спецификатор адреса, ошибочна.
Пример:
for CONTROL use at 16#0020#; -— предполагается, что SYSTEM.ADDRESS -- это некоторый целый типПримечание. Из приведенных правил следует, что если в данной точке программы видимы две совмещенные подпрограммы, то спецификатор адреса для каждой из этих подпрограмм является неправильным в данной точке. Аналогично если в спецификации задачи описаны совмещенные друг с другом входы, то они не могут быть входами прерываний. Для библиотечного модуля синтаксис не допускает спецификатора адреса. Реализацией могут быть определены прагмы для обеспечения оверлейных перекрытий программ.
Ссылки: библиотечный модуль 10,1, вход 9.5, выражение 4.4, задачный модуль 9, задачный объект 9.2, зарезервированное слово 2.9, имя 4.1, компилируемый модуль 10.1, константа 1, объект 3.2, ошибочна 1.6, пакет 7, пакет SYSTEM 13.7, переменная 1, подпрограмма 6, понятие 3.1, прагма 2.8, предопределенный тип ADDRESS 13.7, применим 1, программный модуль 6, простое выражение 4.4, простое имя 4.1, спецификатор совместности 1, тело задачи 9.1, тело подпрограммы 6.3, тип
1. ПРЕРЫВАНИЯ
Спецификатор адреса для входа сопоставляет вход с некоторым устройством, которое может вызвать прерывание; такой вход в этом разделе называется входом по прерыванию. Если прерывание сопровождается управляющей информацией, то она передается соответствующему входу по прерыванию как один или несколько параметров входа вида in; допустимы параметры только такого вида.
Прерывание действует как вызов входа некоторой связанной с оборудованием задачи, приоритет которой выше приоритета главной программы и любых определенных пользователем задач (т.е. любой задачи, тип которой описан с помощью задачного модуля в программе). Вызов входа может быть обычным, временным или условным вызовом входа в зависимости от вида прерывания и от реализации.
Если оператор отбора содержит как альтернативу завершения, так и альтернативу принятия входа по прерыванию, то реализация может наложить некоторые дополнительные требования на отбор альтернативы завершения в дополнение к требованиям, сформулированным в разд.
Пример:
task INTERRUPT_HANDLER is entry DONE; for DONE use at 16#40#; -- предполагается, что SYSTEM. ADDRESS -— это некоторый целый тип end INTERRUPT_HANDLER;Примечание. Вызовы входа по прерыванию имеют только описанную выше семантику;они могут быть реализованы с помощью аппаратуры, непосредственно выполняющей соответствующие операторы принятия.
Выстраиваемые в очередь прерывания соответствуют обычным вызовам входа. Прерывания, которые теряются или немедленно не обрабатываются, соответствуют условным вызовам входов. Из правил приоритетов следует, что оператор принятия, выполняемый в ответ на прерывание, имеет более высокий приоритет, чем определенные пользователями обычные задачи, и может быть выполнен без задачи, выполняющей планировку.
Одним из возможных результатов указания спецификатора адреса для входа по прерыванию является спецификация (непосредственно или косвенно) приоритета прерывания. Допустимы прямые вызовы входов по прерыванию.
Ссылки: альтернатива завершения 1, альтернатива отбора 1, альтернатива принятия 1, вид 6.1, временной вызов входа 3, вход 9.5, выход входа 9.5, допустим 1.6, задача 9, оператор отбора 9.7, оператор принятия 9.5, пакет SYSTEM 13.7, параметр подпрограммы 6.2, предопределенный тип ADDRESS 12.7, приоритет задачи 9.8, условный вызов входа 2.
Спецификаторы длины
Спецификатор длины задает объем памяти:
спецификатор длины ::= for атрибут use простое-выражение;Выражение должно быть некоторого числового типа; оно вычисляется, при пред выполнении спецификатора длины (кроме случая, когда оно является статическим). Префикс атрибута должен обозначать либо тип, либо первый именованный подтип. Далее этот префикс обозначается буквой Т. В спецификаторе длины в качестве обозначений атрибутов допустимы только SIZE, STORAGE_SIZE и SMALL. Результат применения спецификатора длины зависит от обозначения атрибута.
а) Спецификация размера: Т'SIZE
Выражение должно быть статическим некоторого целого типа. Его значение определяет максимальное число битов, используемых для размещения в памяти объектов типа или первого именованного подтипа Т. Спецификация размера должна задавать объем памяти, достаточный для размещения любого допустимого значения таких объектов. Спецификация размера для составного типа может повлиять на размер промежутков между областями памяти, отводимыми под последовательные компоненты. С другой стороны, нет необходимости влиять на размер области памяти, отводимой для каждой компоненты.
Спецификация размера допустима, только если ограничения на Т и его компоненты (если они есть) являются статическими. Для неограниченного индексируемого типа статическими должны быть также подтипы индексов.
б) Спецификация размера набора: T'STORAGE_SIZE
Префикс Т должен обозначать ссылочный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для набора, т.е. объем памяти, необходимый для размещения всех объектов, указанных значениями ссылочного типа и значениями других типов, непосредственно или косвенно производных от ссылочного типа. Эта форма спецификатора длины недопустима для типа, производного от ссылочного типа.
в) Спецификация объема памяти для активизации задачи: T'STORAGE_SIZE
Префикс Т должен обозначать задачный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для активизации (но не для кода) задачи данного типа.
г) Спецификация наименьшего для фиксированных типов: Т'SMALL
Префикс Т должен обозначать первый именованный подтип фиксированного типа. Выражение должно быть статическим некоторого вещественного типа; его значение должно быть не больше, чем дельта этого первого поименованного подтипа. Результат применения спецификатора длины — использование этого наименьшего значения для представления значений фиксированного базового типа. (Спецификатор длины, таким образом, также влияет на выделенный для объектов этого типа объем памяти.)
Примечание. Спецификация размера допустима для ссылочного, задачного или фиксированного типов независимо от того, задана или нет для такого типа какая-либо другая форма спецификатора длины.
От реализации зависит, чтб понимается под резервированием части памяти для набора или активизации задачи. Поэтому управление с помощью спецификаторов длины зависит от соглашений в реализации. Например, в языке не определено, включается ли в память, выделяемую для активизации задачи память, необходимая для размещения набора, сопоставленного ссылочному типу и описанному в теле задачи. Метод распределения памяти под объекты, обозначенные значениями ссылочного типа, также не определяется. Например, место может выделяться в стеке; можно использовать схему настраиваемого динамического распределения памяти, или память может быть зафиксирована.
Размещенные объекты набора не обязаны занимать одинаковые размеры памяти, если указанный тип — это неограниченный индексируемый тип или неограниченный тип с дискриминантами. Заметим также, что сам генератор может требовать некоторый объем памяти для размещения внутренних таблиц и связей. Следовательно, спецификатор длины для набора ссылочного типа не всегда позволяет точно управлять максимальным числом генерируемых объектов.
Спецификаторы представления
Спецификаторы представления задают способ представления типов в объектной машине для более эффективного представления или для интерфейса с внеязыковой сферой (например, с периферийным оборудованием).
спецификатор-представления :: = спецификатор-представления-типа | спецификатор-адресаспецификатор-представления-типа ::= спецификатор-длины | спецификатор-представления-перечисления | спецификатор-представления-записиСпецификатор представления типа применяется либо к типу, либо к первому именованному подтипу (т.е. подтипу, идентифицированному описанием типа, базовый тип которого является анонимным). Такой спецификатор представления применяется ко всем объектам данного типа или данного первого именованного подтипа. Для конкретного типа допустимо не более одного спецификатора представления перечисления или записи; спецификатор представления перечисления допустим только для перечислимого типа; спецификатор представления записи — только для именуемого типа. (С Другой стороны, для конкретного типа может быть задано более одного спецификатора длины; более того, могут быть одновременно заданы спецификатор длины и спецификатор представления записи или перечисления.) Спецификатор длины — это единственный из спецификаторов представления, допустимый для производного от родительского типа, имеющего (определенные пользователем) наследуемые подпрограммы.
Спецификатор адреса применяется либо к объекту, либо к подпрограмме, пакету или за-дачному модулю, либо к входу. Для любого из этих понятий допустимо не более одного спецификатора адреса.
Спецификатор представления и описание понятия, к которому применяется спецификатор, должны оба находиться непосредственно в одном и том же разделе описаний, спецификации пакета или спецификации задачи; описание должно помещаться до спецификатора. В отсутствие спецификатора представления для данного описания реализация определяет представление по умолчанию. Место нахождения такого подразумеваемого определения представления по умолчанию — не позже конца непосредственно объемлющего раздела описаний, спецификаций пакета или задачи. Для описания из раздела описаний место нахождения подразумеваемого определения по умолчанию — до любого вложенного тела.
В случае типа некоторые вхождения его имени неявно предполагают, что представление типа уже должно быть определено. Следовательно, такие вхождения требуют определения по умолчанию любого способа представления, еще не определенного предшествующим спецификатором представления типа. Аналогичные вхождения имени подтипа этого типа или имени любого типа или подтипа с подкомпонентами данного типа также требуют определения по умолчанию. Требуемое вхождение — это любое вхождение, отличное от вхождения в описание типа или подтипа, спецификацию подпрограммы, описание входа, описание субконстанты, прагму или спецификатор представления для самого типа. В любом случае вхождение в выражение является всегда требуемым.
Спецификатор представления для данного понятия не должен помещаться после вхождения имени понятия, если вхождение требует определения представления этого понятия по умолчанию.
Аналогичные ограничения существуют для спецификатора адреса. Любое вхождение имени объекта (после описания объекта) требует определения представления. Для подпрограммы, пакета, задачного модуля или входа любое вхождение атрибута представления таких понятий является требуемым вхождением.
Результат предвыполнения спецификатора аспектов представления — определение соответствующих представления.
Интерпретация некоторых выражений, помещенных в спецификаторах представления, зависит от реализации, например, выражений, задающих адреса. Реализация может ограничивать использование спецификаторов представления лишь теми, которые можно просто обрабатывать на имеющемся оборудовании. Для учитываемых реализации спецификаторов представления компилятор должен гарантировать назависимость конечного результата работы программы от наличия или отсутствия таких спецификаторов представления, исключая спецификатор адреса и те разделы программы, где используются атрибуты представления. Если программа содержит спецификатор представления, который не учитывается реализацией, она неправильна. Для каждой реализации в приложении даются правила составления руководства по языку, в котором должны быть описаны допустимые ею спецификаторы представления и соглашения для выражений, зависящих от реализации.
Если спецификатор представления используется для того, чтобы предписывать некоторые характеристики отображения понятия в объектной машине, то для выбора такого отображения реализация может использовать прагмы. Прагма PACK указывает, что минимизация размера памяти является главным критерием при выборе представления именуемого или индексируемого типа. Ее форма такова:
pragma PACK (простое имя- типа);
Упаковка означает, что промежутки между областями памяти, выделенные под последовательные компоненты, следует минимизировать, упаковка не влияет на отображение в памяти каждой компоненты. На отображение компонент можно повлиять прагмой (или спецификатором представления) для компоненты или типа компоненты. Место прагмы PACK в программе и ограничения на именованный тип подчинены тем же правилам, что и для спецификатора представления; в частности, прагма должна помещаться до любого использования атрибута представления упакованного понятия.
Прагма PACK — единственная определенная в языке прагма, связанная с представлением. Реализация может вводить дополнительные прагмы; они должны быть перечислены в приложении F. (В отличие от спецификаторов представления прагма, которая не принята в реализации, игнорируется.)
Примечание. Для формального типа настройки недопустим спецификатор представления.
Ссылки: атрибут представления 13,7.2, 3, вход 9.5, выражение 4.4, выражение по умолчанию 1, должно 1.6, допустим 1.6, задачный модуль 9, имя 4.1, компонента 3.3, наследуемая подпрограмма 3.4, находится непосредственно в 8.1, неправильная 1.6, объект 3.2, описание 3.1, описание подтипа 2, описание субконстанты 7.4, описание типа 1, пакет 7, подкомпонента 3.3, подпрограмма 6, подтип 3.3, понятие 3.1, прагма 2.8, производный тип 3.4, раздел описаний 3.9, родительский тип 3.4, спецификатор адреса 13.5, спецификатор длины 13.2, спецификация задачи 9.1, спецификация пакета 7.1, спецификатор представления записи 13.4, спецификатор представления перечисления 13.3, тело 3.9, тип 3.3, формальный тип настройки 2.
Спецификаторы представления перечисления
Спецификатор представления перечисления задает внутренние коды для литералов перечислимого типа, указанного в спецификаторе.
спецификатор-представления-перечисления ::= for простое-имя-типа use агрегат;Используемый в спецификаторе агрегат записывается как одномерный агрегат, в кото ром подтип индекса — перечислимый тип, а тип компоненты — универсальный-целый тип.
Для всех литералов перечислимого типа должны быть заданы различные целые коды, и все выборы и значения всех компонент в агрегате должны быть статическими. Целые коды, заданные для перечислимого типа, должны удовлетворять предопределенному отношению упорядоченности типа.
Пример:
type MIX_CODE is (ADD, SUB, MUL, LDA, STA, STZ); for MIX_CODE use (ADD => 1, SUB => 2, MUL => 3, LDA => 8, STA => 24, STZ => 33);Примечание. Атрибуты SUCC, PRED и PCS определены даже для перечислимых типов с разрывным представлением; их определение соответствует (логическому) описанию типа, и на них не влияет спецификатор представления перечисления. В примере из-за того, что значения даны с пропуском, эти функции реализуются менее эффективно, чем это могло быть в отсутствие спецификатора представления. Это же справедливо и при использовании таких типов для индексации.
Ссылки: агрегат 4.3, агрегат массива 2, атрибут перечислимого типа 5, выбор 3, индекс 3.6, индексируемый тип 3.6, компонента 3.3, литерал 4.2, литерал перечисления 1, описание типа 1, отношение упорядоченности для перечислимого типа 1, перечислимый тип 1, подтип индекса 3.6, простое имя 4.1, спецификатор представления 13.1, статическое выражение 4.9, тип 3.3, универсальный-целый тип 4, функция
Спецификаторы представления записей
Спецификатор представления записи задает представление записи в памяти, т.е. порядок, позицию и размер компонент записи (включая дискриминанты, если они есть).
спецификатор-представления-записи ::= for простое-имя-типа use record [спецификатор-выравнивания] (спецификатор - компоненты) end record;спецификатор-выравнивания ::= at mod статическое-простое-выражение;спецификатор-компоненты ::= имя-компоненты at статическое-простое-выражение range статический-диапазон;Простое выражение, заданное в спецификаторе выравнивания после зарезервированных слов at mod или в спецификаторе компоненты после зарезервированного слова at, должно быть статическим некоторого целого типа. Если в спецификаторе компоненты границы диапазона спецификатора компоненты определяются простыми выражениями, то каждая граница должна быть определена как статическое выражение любого целого типа; не обязательно, чтобы обе границы были одного и того же целого типа.
Спецификатор выравнивания требует, чтобы каждая запись данного типа была размещена начиная с адреса памяти, кратного значению данного выражения (т.е. адрес по модулю выражения должен быть равен нулю). Реализация может наложить ограничения на допускаемые выравнивания.
Спецификатор компоненты специфицирует для компоненты место в памяти относительно начала записи. Значение целого типа, определенное статическим выражением в спецификаторе компоненты, — это относительный адрес, выраженный в квантах памяти. Диапазон определяет позиции разрядов места памяти относительно этого кванта памяти. Первый квант памяти для записи имеет нулевой номер. Первый разряд кванта памяти тоже имеет нулевой номер. Порядок разрядов в кванте памяти машинно-зависим, а их нумерация может переходить на соседние кванты. (Для конкретной машины размер кванта памяти в разрядах задан с помощью зависящего от конфигурации именованного числа SYSTEM.STORAGE-UNIT.) Допускается размещение одной компоненты записи в соседних квантах памяти, это размещение определяется реализацией.
Для каждой компоненты именуемого типа, включая каждый дискриминант, допустимо не более одного спецификатора компоненты. Спецификаторы компонент могут быть даны для нескольких, всех или ни для одной из компонент. Если для компоненты не задан спецификатор компоненты, то выбор места в памяти для компоненты определяется компилятором. Если спецификаторы компонент даны для всех компонент, то спецификатор представления записи полностью задает представление именуемого типа и компилятор должен в точности следовать спецификатору.
Места в памяти для компонент в пределах одного варианта не должны перекрываться, но допускается перекрытие для различных вариантов. Каждый спецификатор компоненты должен допускать достаточный размер памяти для размещения допустимого значения компоненты. Спецификатор компоненты допустим только для такой компоненты, для которой любое ограничение, наложенное на него или на его подкомпоненты, является статическим.
Реализация может генерировать имена, обозначающие зависящие от реализации компоненты (например, компоненту, содержащую смещение другой компоненты). Такие имена могут быть использованы в спецификаторах представления записей (эти имена могут не быть простыми именами, например они могут быть зависящими от реализации атрибутами).
Пример:
WORD : constant := 4; -- квант памяти — это байт; в слове 4 байт type STATE is (A, M, W, Р); type MODE is (FIX, DEC, EXP, SIGNIF);type BYTE_MASK is array (0 .. 7) of BOOLEAN; type STATE_MASK is array (STATE) of BOOLEAN; type MODE_MASK is array (MODE) of BOOLEAN;type PROGRAM_STATUS_WORD is record SYSTEM_MASK : BYTE_MASK; PROTECTION_KEY : INTEGER range 0 .. 3; MACHINE_STATE : STATE_MASK; INTERRUPT_CAUSE : INTERRUPTION_.CODE; ILC : INTEGER range 0 .. 3; CC : INTEGER range 0 .. 3; PROGRAM_MASK : MODE_MASK; INST_ADDRESS : ADDRESS; end record;for PROGRAM_STATUS_WORD use record at mod 8; SYSTEM_MASK at 0*WORD range 0 .. 7; PROTECTION_KEY at 0*WORD range 10 .. 11; -- биты 8, 9 не использует MACHINE_STATE at 0*WORD range 12 .. 15; INTERRUPT-CAUSE at 0+WORD range 16 .. 31; ILC at 1*WORD range 0 .. 1; -- второе слово СС at 1*WORD range 2 .. 3; PROGRAM_MASK at 1*WORD range 4 .. 7; INST_ADDRESS at 1*WORD range 8 .. 31; end record;for PROGRAM_STATUS_WORD'SIZE use 8*SYSTEM.STORAGE_UNIT:Примечание к примеру. Спецификатор представления записи определяет размещение полей записи. Спецификатор длины гарантирует, что при этом будет использовано точно восемь квантов памяти.
Ссылки: атрибут 4, вариант 3, диапазон 3.5, дискриминант 1, должен 1.6, допустим 1.6, именованное число 3.2, именуемый тип 3.7, квант памяти 13.7, компонента записи 3.7, константа 1, ограничение 3.3, пакет SYSTEM 13.7, подкомпонента 3.3, простое выражение 4.4, простое имя 4.1, статическое выражение 4.9, статическое ограничение 4.9, целый тип 4.
Связь с другими языками
Из программы, написанной на языке Ада, может быть вызвана подпрограмма, написанная на другом языке; все связи с этими подпрограммами обеспечиваются через параметры и результаты функций. Для каждой такой подпрограммы должна быть задана следующая прагма:
pragma INTERFACE (имя -языка, имя- подпрограммы};
Допустимо использование совмещенных имен подпрограмм. Эта прагма допустима на месте элемента описания и должна применяться к подпрограмме, описанной ранее в этом же разделе описаний или спецификации пакета. Прагма также допустима и для библиотечного модуля; в этом случае прагма должна помещаться после описания подпрограммы, но до любого следующего компилируемого модуля. Прагма задает другой язык (и тем самым соглашения о вызовах) и сообщает компилятору, что для такой подпрограммы будет задан объектный модуль. Для таких подпрограмм недопустимо задание тела (даже в форме следа тела), так как его команды написаны на другом языке.
Эту возможность не обязательно обеспечивают все реализации. Реализация может наложить ограничения на допускаемые формы и места параметров и вызовов.
Пример:
package FORT_LIB is function SORT (X : FLOAT) return FLOAT; function EXP (X : FLOAT) return FLOAT; private pragma INTERFACE(FORTRAN, SORT); pragma INTERFACE(FORTRAN, EXP); end FORT_LIB;Примечание. Соглашения, использованные в других языковых процессорах, которые вызывают Ада-программы, не являются частью определения языка Ада. Эти соглашения должны быть определены в описании других языковых процессоров.
Прагма INTERFACE не определена для настраиваемых подпрограмм. Ссылки: библиотечный модуль 10.1, вызов подпрограммы 6.4, должен 1.6, допустимый 1.6, имя 4.1, компилируемый модуль 10.1, описание 3.1, описание подпрограммы 6.1, параметр подпрограммы 6.2, подпрограмма 6, прагма 2.8, раздел описаний 3.9, результат функции 6.5, след тела 10.2, совмещенная подпрограмма 6.6, спецификация пакета 7.1, тело подпрограммы 6.3, элемент описания
Вставки машинных кодов
Машинные коды могут быть включены в программу с помощью вызова процедуры, последовательность операторов которой состоит из операторов кода.
оператор-кода ::= обозначение-типа'агрегат-записи;Оператор кода допустим только в последовательности операторов тела процедуры. Если в теле процедуры содержатся операторы кода, то в нем недопустимы никакие формы операторов, кроме операторов кода (помеченных или нет); из описаний допустимы только спецификаторы использования; недопустимы обработчики исключения (комментарии и прагмы допустимы как обычно).
Каждая машинная команда записывается как агрегат именуемого типа, агрегат определяет эту команду. Базовый тип обозначения типа в операторе кода должен быть описан в предопределенном пакете MACHINE_CODE; этот пакет должен быть упомянут в спецификаторе контекста, помещаемом для компилируемого модуля, в который входит оператор кода. Реализация не обязана обеспечивать такой пакет.
В реализации допустимо наложение дополнительных ограничений на допустимые в операторах кода агрегаты записи. Например, можно требовать, чтобы выражения в агрегатах были статическими.
Реализация может определить машинно-зависимые прагмы, специфицирующие соглашения об использовании регистров и вызовов. Такие прагмы должны быть описаны в приложении F.
Пример:
М : MASK; procedure SET_MASK; pragma INLINE(SET_MASK);procedure SET_MASK is use MACHINE_CODE; begin SI_FORMAT'(CODE => SSM, В => M'BASE_REG, D => M'DISP); -- M'BASE_REG and M'DISP —это заданные реализацией предопределенные атрибуты end;Ссылки: агрегат именуемого типа 1, библиотечный модуль 10.1, допустим 1.6, именуемый тип 3.7, комментарий 2.7, компилируемый модуль 10.1, обработчик исключения 11.2, оператор 5, пакет 7, помеченный оператор 5.1, последовательность операторов 5.1, прагма 2.8, прагма INLINE 2, применим 1, процедура 1, спецификатор использования 8.4, спецификатор совместности 1, статическое выражение 4.9, тело процедуры 6.3, элемент описания