Внутреннее представление
компилятора
Типы представлений
и их особенности
Архитектура транслятора языка ВУ
Исходный
код
Парсер
Синтаксическое
дерево
Конвертер
Оптимизации
Машиннонезависимое
представление
Оптимизации
Конвертер
Машинно-зависимое
представление
Кодогенератор
Front End
Middle End
Back End
test.s
Архитектура двоичного транслятор
Исходный
двоичный
код
Декодер
Декодированные
команды
Конвертер
Оптимизации
Машиннонезависимое
представление
Оптимизации
Конвертер
Машинно-зависимое
представление
Кодогенератор
Front End
Middle End
Back End
test.s
Свойства промежуточного
представления (IR)
Содержит всю информацию необходимую для трансляции
исходного кода в семантически эквивалентный
промежуточный код.
• Структура
• Уровень абстракции
• Поддерживаемые входные и выходные
языки
• Поддерживаемые оптимизации
Структура IR
• Граф
– Деревья
– DAG
– Граф потока управления
– Граф зависимостей
• Линейная последовательность команд
– Код стековой машины
– Трехадресный код (четверки, тройки)
Древовидное представление
z=x–2*y
Абстрактное синтаксическое дерево:
write
+
=
-
z
x
*
2
y
Абстракция на уровне исходного кода
-
Val num read
*
sp 12
+
Num
Val Num 2
sp
4
read
+
Val
sp
Num
8
Явно выраженные вычисления адресов
переменных, чтения и записи в память
Направленный ациклический граф
(DAG)
z=2*y– 2*y*x
Абстрактное синтаксическое дерево:
Направленный ациклический граф (DAG):
=
=
*
2
-
z
-
z
*
*
y *
2
y
x
*
x
2
y
Линейные последовательности
команд
Operation
L0:
Operation
Operation
Operation
Cond jump L1
Operation
Operation
Operation
Uncond jump L0
L1:
Operation
Operation
Operation
• Используемые операции зависят от уровня
абстрактности и входного выходного языка
• Для полного представления исходного кода
требуются операции передачи управления
• Популярные виды представления:
1. Код (абстрактной) стековой машины
2. Трехадресный код
a. Четверки
b. Тройки
Код стековой машины
z=x–2*y
push 2
push y
mul
push x
sub
pop z
• Использует соглашение о
нахождении операндов в стеке
• Операции читают операнды из
стека, удаляют их и записывают
результат на стек
+ Очень компактное представление
- Результаты и аргументы не выраженны
явно в представленнии
Трехадресный код
z=x–2*y
t1 = 2
t2 = y
t3 = t1 * t2
t4 = x
t5 = t4 – t3
z = t5
• Совокупность оператора и трех
адресов (операндов): двух
аргументов и результата
• На практике в представлении могут
встречаться команды
– Без результата, одного или двух
аргументов
– С большим количеством аргументов
– Количество таких команд мало
• Можно рассматривать как код
абстрактной RISC-машины
Реализация в виде четверок
(quadruples)
z=x–2*y
t1 = 2
t2 = y
t3 = t1 * t2
t4 = x
t5 = t4 – t3
z = t5
op
arg1
arg2
res
1.
move
2
NULL
t1
2.
move
y
NULL
t2
3.
mul
t1
t2
t3
4.
move
x
NULL
t4
5.
sub
t4
6.
move
t5
t3
NULL
t5
z
Напрямую представлены имя операции, результат и аргументы
Реализация в виде троек
(triples)
z=x–2*y
t1 = 2
t2 = y
t3 = t1 * t2
t4 = x
t5 = t4 – t3
z = t5
op
arg1
arg2
1.
move
2
NULL
2.
load
y
NULL
3.
mul
Op 1
Op 2
4.
load
x
NULL
5.
sub
Op 4
Op 3
6.
save
Op5
z
Временные переменные полностью замещаются ссылкой
на производящую операцию
Линейное представление
(на примере LLVM)
int func( int a, int b) %cmp.res = icmp %a, %b
br %cmp.res, label %if.then, label %if.else
{
int c;
if.then:
if ( a > b)
%c.0 = add %a, 1
{
br label %if.end
c = a + 1;
if.else:
} else
%c.1 = add %a, %b
{
br label %if.end
c = a + b;
}
if.end:
return c;
%c.2 = phi [%c.0, %if.then], [%c.1, %if.else]
}
ret %c.2
Граф потока управления
%cmp.res = icmp %a, %b
br %cmp.res, label %true, label %false
true:
%c.0 = add %a, 1
br label %end
false:
%c.1 = add %a, %b
br label %end
end:
%c.2 = phi [%c.0, %true], [%c.1, %false]
ret %c.2
Комбинированные представления
• Граф управления в вершинах которого находятся:
– Линейные цепочки операций
– Список корневых вершин деревьев
• Граф зависимостей, вершинами которого являются
отдельные операции
– Управление также может быть представлено в виде
зависимостей
Аналитические структуры данных
• Строятся при помощи анализа основной
части представления
• Могут быть временными (внутри фазы) или
постоянными (сохраняются между фазами)
• Корректируются либо перестраиваются при
преобразованиях представления
Примеры аналитических структур
• Граф потока управления
– Классификация дуг
– Циклы, дерево циклов
– Доминаторы/Постдоминаторы
• Граф потока данных
• Граф зависимостей
Скачать

Граф потока управления - mipt-scheme