Блок-схема в генерации кода

Опубликовано: 17 Сентября, 2022

Базовый блок представляет собой простую комбинацию операторов. За исключением входа и выхода, базовые блоки не имеют ответвлений вроде входа и выхода. Это означает, что поток управления входит в начале и всегда выходит в конце без остановки. Выполнение набора инструкций базового блока всегда происходит в виде последовательности.

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

Ниже пошагово описан алгоритм построения базового блока:

Алгоритм: Используемый здесь алгоритм разбивает трехадресный код на основные блоки.

Вход: последовательность трехадресных кодов будет входом для основных блоков.

Выходные данные: в качестве выходных данных рассматривается список базовых блоков с каждыми тремя адресными операторами ровно в одном блоке.

Метод: мы начнем с определения лидеров промежуточного кода. Ниже приведены некоторые рекомендации по выявлению лидеров:

  1. Первая инструкция в промежуточном коде обычно считается ведущей.
  2. Инструкции, нацеленные на условный или безусловный оператор перехода, можно рассматривать как ведущие.
  3. Любые инструкции, которые находятся сразу после оператора условного или безусловного перехода, могут рассматриваться как лидеры.

Базовый блок каждого лидера будет содержать все инструкции от лидера до инструкции непосредственно перед стартом следующего лидера.

Пример базового блока:

Трехадресный код для выражения a = b + c – d:

T1 = b + c
T2 = T1 - d
a = T2

Это представляет собой базовый блок, в котором все операторы выполняются последовательно один за другим.

Базовая конструкция блока:

Давайте разберемся с построением базовых блоков на примере:

Пример:

1. PROD = 0
2. I = 1
3. T2 = addr(A) – 4
4. T4 = addr(B) – 4
5. T1 = 4 x I
6. T3 = T2[T1]
7. T5 = T4[T1]
8. T6 = T3 x T5
9. PROD = PROD + T6
10. I = I + 1
11. IF I <=20 GOTO (5)

Используя приведенный выше алгоритм, мы можем легко определить количество основных блоков в приведенном выше трехадресном коде:

Есть два основных блока в приведенном выше трехадресном коде:

  • B1 – Заявление 1–4
  • B2 – Заявление 5–11

Преобразования на базовых блоках:

Преобразования базовых блоков могут быть применены к базовому блоку. При преобразовании нам не нужно менять набор вычисляемых блоком выражений.

Существует два типа базовых преобразований блоков. Вот они:

1. Преобразования, сохраняющие структуру

Преобразования с сохранением структуры могут быть достигнуты следующими методами:

  1. Устранение общих подвыражений
  2. Устранение мертвого кода
  3. Переименование временных переменных
  4. Обмен двумя независимыми соседними утверждениями

2. Алгебраические преобразования.

В случае алгебраического преобразования мы в основном меняем набор выражений на алгебраически эквивалентный набор.

Например, и выражение

x:= x + 0 
or x:= x *1 

Это можно исключить из базового блока без изменения набора выражений.

Диаграмма потока:

Потоковый граф — это просто ориентированный граф. Для набора базовых блоков блок-схема показывает поток управляющей информации. Граф потока управления используется для отображения того, как управление программой анализируется между блоками. Блок-схема используется для иллюстрации потока управления между базовыми блоками после того, как промежуточный код был разделен на базовые блоки. Когда начальная инструкция блока Y следует за последней инструкцией блока X, ребро может перейти от одного блока X к другому блоку Y.

Давайте составим блок-схему примера, который мы использовали для формирования базового блока:

Во-первых, мы вычисляем базовые блоки (что уже сделано выше). Во-вторых, мы назначаем информацию управления потоком.