Спецификаторы представления записей
Спецификатор представления записи задает представление записи в памяти, т.е. порядок, позицию и размер компонент записи (включая дискриминанты, если они есть).
спецификатор-представления-записи ::= 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.1.4, вариант 3.7.3, диапазон 3.5, дискриминант 3.7.1, должен 1.6, допустим 1.6, именованное число 3.2, именуемый тип 3.7, квант памяти 13.7, компонента записи 3.7, константа 3.2.1, ограничение 3.3, пакет SYSTEM 13.7, подкомпонента 3.3, простое выражение 4.4, простое имя 4.1, статическое выражение 4.9, статическое ограничение 4.9, целый тип 3.5.4.
|
Пред. |
Уровень выше |
След.
|
13.3. СПЕЦИФИКАТОРЫ ПРЕДСТАВЛЕНИЯ ПЕРЕЧИСЛЕНИЯ
|
Содержание |
13.5. СПЕЦИФИКАТОРЫ АДРЕСА
|