Н. Джехани - Язык Ада (1988) (1160771), страница 114
Текст из файла (страница 114)
13.3. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ПЕРЕЧИСЛЕНИЯ Спецификатор представления перечисления задает внутренние коды для литералов пере. числимого типа, укаэанного в спецификаторе. спецификатор представления перечисления:: = (ог простое имя типа пве агрегат; Используемый в спецификаторе агрегат записывается как одномерный агрегат, в котором подтип индекса — перечислимыи тип, а тип компоненты — универсальный целый тип. Для всех литералов перечислимого типа должны быть заданы различные целые коды, и все выборы и значения всех компонент в агрегате должны быть статическими.
Целые коды, заданные для перечислимого типа, должны удовлетворять предопределенному отношению упорядоченности типа. Пример; аура М1Х СООЕ )а (АОО, 508, МОЦ ЬОА. ЗТА ЗТ7); Гы М!Х СООЕ оае (АОО => 1, 508 => 2, МЦС => Э, ЬОА => 8, ЗТА => 24. 5Т2 => 33); Примечание. Атрибуты 8()СС, РЯЕО и РОЗ определены даже для перечислимых типов с разрывным представлением; их определение соответствует (логическому) описанию типа, и на них не влияет спецификатор представления перечисления. В примере из-эа того, что значения даны с пропуском, эти функции реализуются менее эффективно, чем это могло быть в отсутствие спецификатора представления.
Это же справедливо и при использовании таких типов для индексации. Ссылки: агрегат 4.3, агрегат массива 4.3.2, атрибут перечислимого типа 3.5.5, выбор 3.7.3, индекс 3.6, индексируемыи тип 3.6, компонента 3.3, литерал 4.2, литерал перечисления 3.5.1, описание типа 3.3.1, отношение упорядоченности для перечислимого типа 3.5.1, перечислимый тип 3.5.1, подтип индекса 3.6, простое имя 4.1, спецификатор представления 13.1, статическое выражение 4.9, тип З.З, универсальный целыи тип 3.5.4, функция 6.5. 13.4. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ЗАПИСЕЙ Спецификатор представления записи задает представление записи в памяти, т.е. порядок, позицию и размер компонент записи (включая дискриминанты, если они есть).
спецификатор представления записи::= (ог простое имя типа мве гесогб (спецификатор выравнивания) (спецификатор компоненты) епд гесол(; спецификатор выравнивания:: = а( глоб статическое простое выражение; спецификатор компоненты;; = имя компоненты а( статическое простое выражение гап9е статический диапазон; ЧУОНО: асмшасп ы 4; -- квант памяти — зто баит; в слове 4 баит 1 ° (А, М, ЧЧ, Р); 1а (Е)Х, ОЕС, ЕХР, 516М!Р); НШе ЗТАТЕ 1уре МООЕ гура ВУТЕ МАЯК 1 ° аггау (О .. 7) е( ВООЬЕАМ; суре 5ТАТЕ МАЯК )а асгау (5ТАТЕ) е( 8001.ЕАМ; !Уре МООЕ МАЯК 1 ° апау (МООЕ) е( 8001.ЕАМ; !Ура РВООЯАМ ЗТАТО5 ЧЧОЯО 1а гааеы ЗУЗТЕМ МА5К с ВУТЕ МАЯК: РНОТЕСТ10М КЕУ: )МТЕОЕВ саиде 0 .. 3,' МАСИ1МЕ ЯТАТЕ .
ЯТАТЕ МАЯК; )МТЕЙЙОРТ САОЗЕ: )МТЕЙЙОРТ)ОМ СООЕ; 1ЬС: )МТЕОЕЯ галде 0 .. 3; СС 1МТЕОЕй галде 0 .. 3; РЯООВАМ МАЯК: МООЕ МА5К; 1МЗТ АООНЕЯЗ ; АООйЕ85: апд геаеп1: сег РНООЙАМ ЯТАТ05 ЧЧОНО пае ° ааагд а! спев 8; ЯУ5ТЕМ МАЯК ас ОсИЮЯО галде О РНОТЕСТ10М КЕУ аг ОсЧЧОЯО Салда 1О МАСН)МЕ ЗТАТЕ Ы ОгИЮЯО гасща 12 )МТЕВВОРТ САОЗЕ ас 0*ЧЧОВО савве 18 7: 11; — биты 8, 9 не использует 18: 31; !5' Простое выражение, заданное в спецификаторе выравнивания после зарезервированных слов а( глоб или в спецификаторе компоненты после зарезервированного слова а(, долм!но быть статическим некоторого целого типа.
Если в спецификаторе компоненты границы диапазона спецификатора компоненты определяются простыми выражениями, то каждая граница должна быть определена как статическое выражение любого целого типа; не обязательно, чтобы обе границы были одного и того же целого типа.
Спецификатор выравнивания требует, чтобы каждая запись данного типа была размеще. на начиная с адреса памяти, кратного значению данного выражения (т.е. адрес по модулю выражения должен быть равен нулю). Реализация может наложить ограничения на допускае. мые выравнивания. Спецификатор компоненты специфицирует для компоненты место в памяти относительно начала записи. Значение целого типа, определенное статическим выражением в спецификаторе компоненты, — это относительный адрес, выраженный в квантах памяти. Диапазон определяет позиции разрядов места памяти относительно этого кванта памяти.
Первый квант памяти для записи имеет нулевой номер. Первый разряд кванта памяти тоже имеет нулевой номер. Порядок разрядов в кванте памяти машинно-зависим, а их нумерация может переходить на соседние кванты.(Дпя конкретной машины размер кванта памяти в разрядах задан с помощью зависящего от конфигурации именованного числа ЯУЯТЕМ.ЗТОВАСЕ ОМ1Т.) Долу. скается размещение одной компоненты записи в соседних квантах памяти, это размещение определяется реализацией. Дпя каждой компоненты именуемого типа, включая каждый дискриминант, допустимо не более одного спецификатора компоненты.
Спецификаторы компонент могут быть даны для нескольких, всех или ни для однои из компонент. Если для компоненты не задан специфика. тор компоненты, то выбор места в памяти для компоненты определяется компилятором. Если спецификаторы компонент даны для всех компонент, то спецификатор представления записи полностью задает представление именуемого типа и компилятор должен в точности следовать спецификатору. Места в памяти дпя компонент в пределах одного варианта не должны перекрываться, но допускается перекрытие для различных вариантов. Каждый спецификатор компоненты должен допускать достаточныи размер памяти для размещения допустимого значения компо.
ненты. Спецификатор компоненты допустим только для такой компоненты, для которой любое ограничение, наложенное на него или на его подкомпоненты, является статическим. Реализация может генерировать имена, обозначающие зависящие от реализации компоненты (например, компоненту, содержащую смещение другой компоненты). Такие имена могут быть использованы в спецификаторах представления записей (эти имена могут не быть простыми именами, например они могут быть зависящими от реализации атрибутами). Пример: Глава 13 пг 1*ИЮВО гппее 0 ..
1; — второе слово пг 1*ЬУОНО гппве 2 .. 3; гп )ыМОВО щ)е 4 ПГ 1пИЮНО ГППЗШ 3 .. 31; ГьС СС РВООЯАМ МАЗК !ВЗТ АООНЕЗЗ ппп гппепз: Гпг РВООЯАМ ЗТАТОЗ ИГОНО'8)2Е пзе З*ЗУЗТЕМ.ЗТОЯАОЕ ОНГГ: Примечание к примеру. Спецификатор представления записи определяет размещение по. лей записи. Спецификатор длины гарантирует, что при этом будет использовано точно восемь квантов памяти. Ссылки: атрибут 4.1.4, вариант 3.7.3, диапазон 3.6, дискриминант 3.7.1, должен 1.6, долу. стим 1.6, именованное число 3.2, именуемый тип 3.7, квант памяти 13.7, компонента записи 3.7, константа 3.2.1, ограничение 3.3, пакет ЗУЗТЕМ 13.7, подкомпонента 3.3, простое выражение 4.4, простое имя 4.1, статическое выражение 4.9, статическое ограничение 4.9, целый тип 3.5.4.
13 6. СПЕЦИФИКАТОРЫ АДРЕСА Спецификатор адреса задает адрес в памяти для понятия. спецификатор адреса :: = Гог простое имя мве аз простое выражение; Выражение после зарезервированного слова аз должно быть типа АООЙЕЗЗ, определенного в пакете 8УЗТЕМ (см. 13.7). Этот пакет должен быть именован в спецификаторе совместности компилируемого модуля, в котором помещается спецификатор адреса. Условия, определяющие интерпретацию значения типа АООВЕ88 как адреса, уровня прерывания или чего-либо другого, зависят от реализации.
Ниже перечислены допустимые толкования простого имени и смысл соответствующего адреса; а) имя объекта: требуемый адрес — адрес объекта (переменнои или константы); б] имя подпрограммы, пакета или задачного модуля: трвбуемый адрес — адрес машинного кода, связанного с телом программного модуля; в) имя одиночного входа: адрес задает аппаратное прерывание, связанное с этим входом. Если простое имя — это имя одиночной задачи, то спецификатор адреса относится к задачному модулю, а не к задачному объекту.
Во всех случаях спецификатор адреса является правильным только тогда, когда точно одно описание с этим идентификатором помещено раньше непосредственно в том же разделе описаний, спецификации пакета или спецификации задачи. В качестве простого имени недопустимо имя, введенное описанием переименования. Спецификаторы адреса не могут быть использованы для задания перекрытия объектов или перекрытия программных модулей. Данное прерывание может быть связано не более чем с одним входом. Любая программа, использующая такой спецификатор адреса, ошибочна.
ПримеР: Гпг СОНТЯОС пзе аг 1бзт0020ас — преДполагается, что ЗУЗТЕМ.АООЙЕЗЗ вЂ” это некоторыи целыи тип Примечание. Иэ приведенных правил следует, что если в данной точке программы видимы две совмещенные подпрограммы, то спецификатор адреса для каждои из этих подпро. грамм является неправильным в данной точке. Аналогично если в спецификации задачи описаны совмещенные друг с другом входы, то они не могут быть входами прерываний. Для библиотечного модуля синтаксис не допускает спецификатора адреса. Реализацией могут быть определены прагмы для обеспечения оверлейных перекрытий программ.