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