Внутреннее представление компилятора Типы представлений и их особенности Архитектура транслятора языка ВУ Исходный код Парсер Синтаксическое дерево Конвертер Оптимизации Машиннонезависимое представление Оптимизации Конвертер Машинно-зависимое представление Кодогенератор 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 Комбинированные представления • Граф управления в вершинах которого находятся: – Линейные цепочки операций – Список корневых вершин деревьев • Граф зависимостей, вершинами которого являются отдельные операции – Управление также может быть представлено в виде зависимостей Аналитические структуры данных • Строятся при помощи анализа основной части представления • Могут быть временными (внутри фазы) или постоянными (сохраняются между фазами) • Корректируются либо перестраиваются при преобразованиях представления Примеры аналитических структур • Граф потока управления – Классификация дуг – Циклы, дерево циклов – Доминаторы/Постдоминаторы • Граф потока данных • Граф зависимостей