13.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.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.