Data

Материал из Compilers Wiki
Перейти к: навигация, поиск
DATADEF :=
    ['export'] 'data' $IDENT '='
    '{'
        ( EXTTY DATAITEM+
        | 'z'   NUMBER ),
    '}'
DATAITEM :=
    $IDENT ['+' NUMBER]  # Символ и смещение (offset)
  |  '"' ... '"'         # Строка
  |  CONST               # Константа

Объявление Data выражает объекты, которые будут присутствовать в скомпилированном файле. Они могут быть локальными для файла или экспортироваться с глобальной видимостью для всей программы (если она состоит из нескольких файлов).

Data definitions express objects that will be emitted in the compiled file. They can be local to the file or exported with global visibility to the whole program.

Они определяют глобальный идентификатор (начиная с символа $), который будет содержать указатель на объект, указанный в объявлении.

They define a global identifier (starting with the sigil $), that will contain a pointer to the object specified by the definition.

Объекты описываются последовательностью полей, начинающихся с буквы типа. Эта буква может быть либо расширенным типом, либо буквой z. Если используемая буква является расширенным типом, то следующий элемент Data указывает биты, которые должны храниться в поле. Когда несколько элементов Data следуют букве, они инициализируют несколько полей одного размера.

Objects are described by a sequence of fields that start with a type letter. This letter can either be an extended type, or the z letter. If the letter used is an extended type, the data item following specifies the bits to be stored in the field. When several data items follow a letter, they initialize multiple fields of the same size.

Члены структуры будут упакованы. Это означает, что содержимое должно быть выбрано интерфейсом, когда это необходимо. Выравнивание всех объектов данных может быть задано вручную, а при отсутствии выравнивания используется максимальное выравнивание с платформы.

The members of a struct will be packed. This means that padding has to be emitted by the frontend when necessary. Alignment of the whole data objects can be manually specified, and when no alignment is provided, the maximum alignment from the platform is used.

Когда используется буква z, следующее число указывает размер поля; содержимое поля инициализируется нулем. Его можно использовать для добавления дополнений между полями или больших массивов, инициализированных нулями.

When the z letter is used the number following indicates the size of the field; the contents of the field are zero initialized. It can be used to add padding between fields or zero-initialize big arrays.

Ниже приводится пример объявления Data.

Here are various examples of data definitions.
 # Три 32-битных значения 1, 2 и 3
 # за которыми следует 0 байт.
 data $a = { w 1 2 3, b 0 }
 # Массив из 1000 байт, заполненных нулем.
 data $b = { z 1000 }
 # Объект, содержащий два 64-битных
 # поля. У первого все биты заполнены.
 # А второе содержит указатель на объект.
 data $c = { l -1, l $c }



Источник: c9x.me