17
Внутреннее представление компилятора Типы представлений и их особенности

Внутреннее представление компилятора

Embed Size (px)

DESCRIPTION

Внутреннее представление компилятора. Типы представлений и их особенности. Архитектура транслятора языка ВУ. Исходный код. Парсер. Синтаксическое дерево. Оптимизации. Машинно-независимое представление. Оптимизации. Конвертер. Машинно-зависимое представление. Конвертер. test.s. - PowerPoint PPT Presentation

Citation preview

Page 1: Внутреннее представление компилятора

Внутреннее представление компилятора

Типы представленийи их особенности

Page 2: Внутреннее представление компилятора

Архитектура транслятора языка ВУИсходный

код Парсер

Синтаксическое дерево

КонвертерМашинно-

независимое представление

Оптимизации

Машинно-зависимое представлениеКонвертер

Кодогенератор test.s

Оптимизации

Front End Middle End Back End

Page 3: Внутреннее представление компилятора

Архитектура двоичного трансляторИсходныйдвоичный

кодДекодер

Декодированные команды

КонвертерМашинно-

независимое представление

Оптимизации

Машинно-зависимое представлениеКонвертер

Кодогенератор test.s

Оптимизации

Front End Middle End Back End

Page 4: Внутреннее представление компилятора

Свойства промежуточного представления (IR)

• Структура• Уровень абстракции• Поддерживаемые входные и выходные

языки• Поддерживаемые оптимизации

Содержит всю информацию необходимую для трансляции исходного кода в семантически эквивалентный промежуточный код.

Page 5: Внутреннее представление компилятора

Структура IR

• Граф– Деревья– DAG– Граф потока управления– Граф зависимостей

• Линейная последовательность команд– Код стековой машины– Трехадресный код (четверки, тройки)

Page 6: Внутреннее представление компилятора

Древовидное представлениеz = x – 2 * y

Абстрактное синтаксическое дерево:

zx

2

-*

y

=

Абстракция на уровне исходного кода

+

num12

-

write

Val sp +

Val sp

read

Num4

*Num

2+

Val sp

read

Num8

Явно выраженные вычисления адресов переменных, чтения и записи в память

Page 7: Внутреннее представление компилятора

Направленный ациклический граф (DAG)

z = 2 * y – 2 * y * x

Абстрактное синтаксическое дерево:

z

2

-

*y

=

*

2*

yx

Направленный ациклический граф (DAG):

z -=

*

2*

y

x

Page 8: Внутреннее представление компилятора

Линейные последовательности команд

OperationL0: Operation Operation Operation Cond jump L1 Operation Operation Operation Uncond jump L0L1: Operation Operation Operation

• Используемые операции зависят от уровня абстрактности и входного выходного языка

• Для полного представления исходного кода требуются операции передачи управления

• Популярные виды представления:1. Код (абстрактной) стековой машины2. Трехадресный код

a. Четверкиb. Тройки

Page 9: Внутреннее представление компилятора

Код стековой машины

• Использует соглашение о нахождении операндов в стеке

• Операции читают операнды из стека, удаляют их и записывают результат на стек

+ Очень компактное представление- Результаты и аргументы не выраженны

явно в представленнии

z = x – 2 * y

push 2push ymulpush xsubpop z

Page 10: Внутреннее представление компилятора

Трехадресный код

• Совокупность оператора и трех адресов (операндов): двух аргументов и результата

• На практике в представлении могут встречаться команды – Без результата, одного или двух

аргументов– С большим количеством аргументов– Количество таких команд мало

• Можно рассматривать как код абстрактной RISC-машины

z = x – 2 * y

t1 = 2t2 = yt3 = t1 * t2t4 = xt5 = t4 – t3z = t5

Page 11: Внутреннее представление компилятора

Реализация в виде четверок (quadruples)

Напрямую представлены имя операции, результат и аргументы

z = x – 2 * y

t1 = 2t2 = yt3 = t1 * t2t4 = xt5 = t4 – t3z = t5

op arg1 arg2 res

move 2 NULL t1

move y NULL t2

mul t1 t2 t3

sub t4 t3 t5

move x t4

move t5 z

NULL

NULL

1.

2.

3.

4.

5.

6.

Page 12: Внутреннее представление компилятора

Реализация в виде троек(triples)

Временные переменные полностью замещаются ссылкой на производящую операцию

z = x – 2 * y

t1 = 2t2 = yt3 = t1 * t2t4 = xt5 = t4 – t3z = t5

op arg1 arg2

move 2 NULL

load y NULL

mul Op 1 Op 2

sub Op 4 Op 3

load x

save Op5

NULL

z

1.

2.

3.

4.

5.

6.

Page 13: Внутреннее представление компилятора

Линейное представление(на примере LLVM)

int func( int a, int b){ int c; if ( a > b) { c = a + 1; } else { c = a + b; } return c;}

%cmp.res = icmp %a, %bbr %cmp.res, label %if.then, label %if.else

if.then:%c.0 = add %a, 1br label %if.end

if.else:%c.1 = add %a, %bbr label %if.end

if.end:%c.2 = phi [%c.0, %if.then], [%c.1, %if.else]ret %c.2

Page 14: Внутреннее представление компилятора

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

%cmp.res = icmp %a, %bbr %cmp.res, label %true, label %false

true:%c.0 = add %a, 1br label %end

false:%c.1 = add %a, %bbr label %end

end:%c.2 = phi [%c.0, %true], [%c.1, %false]ret %c.2

Page 15: Внутреннее представление компилятора

Комбинированные представления

• Граф управления в вершинах которого находятся:– Линейные цепочки операций– Список корневых вершин деревьев

• Граф зависимостей, вершинами которого являются отдельные операции– Управление также может быть представлено в виде

зависимостей

Page 16: Внутреннее представление компилятора

Аналитические структуры данных

• Строятся при помощи анализа основной части представления

• Могут быть временными (внутри фазы) или постоянными (сохраняются между фазами)

• Корректируются либо перестраиваются при преобразованиях представления

Page 17: Внутреннее представление компилятора

Примеры аналитических структур

• Граф потока управления– Классификация дуг– Циклы, дерево циклов– Доминаторы/Постдоминаторы

• Граф потока данных• Граф зависимостей