Блоки

Материал из Compilers Wiki
Версия от 02:19, 15 марта 2018; Admin (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
BLOCK :=
   @IDENT    # Block label
   PHI*      # Phi instructions
   INST*     # Regular instructions
   JUMP      # Jump or return

Все блоки имеют имя, начинающееся с метки "@". Затем следует последовательность инструкций. Наконец один прыжок завершает блок. Прыжок может либо передать управление другому блоку той же функции, либо возвратить; они описаны ниже.

All blocks have a name that is specified by a label at their beginning. Then follows a sequence of instructions that have "fall-through" flow. Finally one jump terminates the block. The jump can either transfer control to another block of the same function or return; they are described further below.

Первый блок в функции не должен быть целью любого перехода в программу. Если это действительно необходимо, лучше вставить пустой блок в начале функции.

The first block in a function must not be the target of any jump in the program. If this is really needed, the frontend could insert an empty prelude block at the beginning of the function.

Когда один блок переходит к следующему блоку в файле промежуточного языка, нет необходимости давать команду перехода, он автоматически добавляется парсером. Например, начальный блок (@start) в приведенном ниже примере переходит непосредственно к блоку цикла (@loop).

When one block jumps to the next block in the IL file, it is not necessary to give the jump instruction, it will be automatically added by the parser. For example the start block in the example below jumps directly to the loop block.
Пример.
function $loop() {
 @start
 @loop
       %x =w phi @start 100, @loop %x1
       %x1 =w sub %x, 1
       jnz %x1, @loop, @end
 @end
       ret
}



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