- •1. Цель работы 17
- •Введение
- •3. Примеры
- •3.1. Лексический анализатор целочисленных констант языка с
- •3.2. Лексический анализатор для поиска строк в исходном тексте программы
- •4. Содержание работы
- •5. Контрольные вопросы
- •3. Примеры
- •3.1. Схемы су – перевода
- •3.2. Схема су–перевода дерева операций на язык ассемблера
- •3.3. Схема су - перевода дерева операций в последовательность триад
- •3.4. Методы оптимизации кода
- •3.5. Свертка объектного кода
- •3.6. Исключение лишних операций
- •4. Содержание работы
- •5. Контрольные вопросы
- •Список литературы
- •450000, Уфа - центр, ул. К. Маркса, 12
3.3. Схема су - перевода дерева операций в последовательность триад
Функцию, реализующую перевод узла дерева в последовательность триад, назовем Code. Входные и выходные данные у этой функции будут те же, что и при работе с командами ассемблера. Триады являются машинно – независимой формой внутреннего представления в компиляторе результирующей объектной программы, а потому не требуют дополнительных условий при генерации кода. Триады взаимосвязаны между собой, поэтому для установки корректной взаимосвязи функция генерации кода должна учитывать также текущий номер очередной триады (i).
Будем рассматривать те же варианты узлов дерева, что и для команд ассемблера (табл. 2.3).
Таблица 2.3
Вид узла дерева |
Результирующий код |
Примечание |
|
i) act (oper1, oper2) |
act – тип триады oper1, oper2 – операнды (листья дерева) |
|
i) Code (Узел 2, i) i+j) act (oper1, ^i+j-1)
|
Узел 2 – нижележащий узел (не лист) дерева Code (Узел 2, i) – последовательность триад, порождаемая для Узла 2, начиная с триады с номером i, j – количество триад, порождаемых для Узла 2 |
|
i) Code (Узел 2, i) i+j) act (^i+j-1, oper2) |
Узел 2 – нижележащий узел (не лист) дерева Code (Узел 2, i) – последовательность триад, порождаемая для Узла 2, начиная с триады с номером i, j – количество триад, порождаемых для Узла 2 |
|
i) Code (Узел 2, i) i+j) Code (Узел 3, i+j) i+j+k) act (^i+j-1, ^i+j+k-1) |
Code (Узел 2, i) – последовательность триад, порождаемая для Узла 2, начиная с триады с номером i, j – количество триад, порождаемых для Узла 2 Code (Узел 3, i+j) – последовательность триад, порождаемая для Узла 3, начиная с триады с номером i+j, k – количество триад, порождаемых для Узла 3 |
Для триад не требуется учитывать операцию присваивания как отдельный тип узла дерева. Она преобразуется в триаду обычного вида. Рассмотрим в качестве примера дерево, приведенное на рис. 2. Согласно принципу СУ – перевода, построение начинается от корня дерева.
Шаг 1: 1) Code(U2, 1)
i) := (A, ^i-1)
Шаг 2: 1) Code(U3, 1)
j) Code(U5, j)
i-1) –(^j-1, ^i-2)
i) := (A, ^i-1)
Шаг 3: 1) Code (U4, 1)
k) + (^k-1, D)
j) Code(U5, j)
i-1) –(^j-1, ^i-2)
i) := (A, ^i-1)
Шаг 4: 1) *(B,C)
2) +(^1, D)
3) Code (U5, 3)
i-1) – (^j-1, ^i-2)
i) :=(A, ^i-1)
Шаг 5: 1) *(B,C)
2) +(^1, D)
3) *(B, 10)
4) –(^2, ^3)
5) :=(A, ^4)
Использование триад позволяет сократить количество рассматриваемых вариантов узлов дерева. В этом случае не требуется принимать во внимание типы операндов и ориентироваться на архитектуру целевой вычислительной системы. Все эти аспекты необходимо будет принимать во внимание уже на этапе преобразования триад в последовательность команд ассемблера или непосредственно в последовательность машинных команд результирующей программы.
Как и последовательность команд ассемблера, последовательность триад можно оптимизировать