1 / 17

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

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Архитектура транслятора языка ВУ Исходный код Парсер Синтаксическое дерево Оптимизации Машинно-независимое представление Оптимизации Конвертер Машинно-зависимое представление Конвертер test.s Кодогенератор Front End Middle End Back End

  3. Архитектура двоичного транслятор Исходный двоичный код Декодер Декодированные команды Оптимизации Машинно-независимое представление Оптимизации Конвертер Машинно-зависимое представление Конвертер test.s Кодогенератор Front End Middle End Back End

  4. Свойства промежуточного представления (IR) Содержит всю информацию необходимую для трансляции исходного кода в семантически эквивалентный промежуточный код. • Структура • Уровень абстракции • Поддерживаемые входные и выходные языки • Поддерживаемые оптимизации

  5. Структура IR • Граф • Деревья • DAG • Граф потока управления • Граф зависимостей • Линейная последовательность команд • Код стековой машины • Трехадресный код (четверки, тройки)

  6. Древовидное представление 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 Абстракция на уровне исходного кода Явно выраженные вычисления адресов переменных, чтения и записи в память

  7. Направленный ациклический граф (DAG) z = 2 * y – 2 * y * x Направленный ациклический граф (DAG): Абстрактное синтаксическое дерево: = = - z - z * * * x * 2 y x * 2 y 2 y

  8. Линейные последовательности команд • Используемые операции зависят от уровня абстрактности и входного выходного языка • Для полного представления исходного кода требуются операции передачи управления • Популярные виды представления: • Код (абстрактной) стековой машины • Трехадресный код • Четверки • Тройки Operation L0: Operation Operation Operation Cond jump L1 Operation Operation Operation Uncond jump L0 L1: Operation Operation Operation

  9. Код стековой машины • Использует соглашение о нахождении операндов в стеке • Операции читают операнды из стека, удаляют их и записывают результат на стек + Очень компактное представление - Результаты и аргументы не выраженны явно в представленнии z = x – 2 * y push 2 push y mul push x sub pop z

  10. Трехадресный код • Совокупность оператора и трех адресов (операндов): двух аргументов и результата • На практике в представлении могут встречаться команды • Без результата, одного или двух аргументов • С большим количеством аргументов • Количество таких команд мало • Можно рассматривать как код абстрактной RISC-машины z = x – 2 * y t1 = 2 t2 = y t3 = t1 * t2 t4 = x t5 = t4 – t3 z = t5

  11. Реализация в виде четверок (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

  12. Реализация в виде троек(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

  13. Линейное представление(на примере 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; }

  14. Граф потока управления %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

  15. Комбинированные представления • Граф управления в вершинах которого находятся: • Линейные цепочки операций • Список корневых вершин деревьев • Граф зависимостей, вершинами которого являются отдельные операции • Управление также может быть представлено в виде зависимостей

  16. Аналитические структуры данных • Строятся при помощи анализа основной части представления • Могут быть временными (внутри фазы) или постоянными (сохраняются между фазами) • Корректируются либо перестраиваются при преобразованиях представления

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

More Related