Н. И. Лобачевского факультет вычислительной математики и кибернетики лаборатория «информационные технологии» проект «исследовательский компилятор» Практикум
СодержаниеЛексический анализатор. Синтаксический анализатор Семантический анализатор. Оптимизирующим компилятором Парсер (лексический и синтаксический анализатор) Оптимизация дерева Реализация функциональности находится в файле tree-inline.c. Реализация методов находится в файле fold-const.c. Генерация RTL описана в файлах: stmt.c, calls.c, expr.c, explow.c, expmed.c, function.c, optabs.c, emit-rtl.c. Код для сохранения RTL-кода функции и последующего его встраивания содержится в файле integrate.c. Оптимизация вызовов Реализация располагается в файле sibcall.c. Файл с реализацией: jump.c. Файл с реализацией: regclass.c. Файл с реализацией: jump.c Ключ для получения отладочной информации: -dW, файл с отладочной информацией: .ssaccp. Ключ для получения отладочной информации: -dX, файл с отладочной информацией: .ssadce. Файлы с реализацией: cse.c, cselib.c. Файлы с реализацией: gcse.c, lcm.c. Файл с реализацией: gcse.c. Ключ для получения отладочной информации: -dt, файл с отладочной информацией: .cse2. Файл с реализацией: flow.c. Файл с реализацией: combine.c. Файл с реализацией: regmove.c. Файлы с реализацией: sched-deps.c, sched-ebb.c,sched-int.h, sched-rgn.c, sched-vis.c. Распределение регистров Файл с реализацией: regclass.c. Файл с реализацией: global.c. Файлы с реализацией: bb-reorder.c, predict.c. Файл с реализацией: reorg.c. Преобразование регистров в регистровый стек Название прохода Название прохода Register Transfer Language (RTL) Представление регистров и памяти в RTL Представление арифметических выражений в RTL Прочие инструкции SSA форма в GCC Минусы представления RTL и дерева, используемого front end, как промежуточных представлений при работе оптимизатора Управляющий граф (control flow graph) Преобразование в SSA Оригинальный код Анализ исходной программы Синтаксический анализ Семантический анализ Императивные (процедурные) языки. Аппликативные (функциональные) языки. Объектно-ориентированное программирование. Front end Создание собственного Front end Выбор инструкций Распределение регистров. Рисунок 5. Конфликт между командами по использованию функционального устройства. Программная конвейеризация. Рисунок 6. Пример подстановки вперёд и переименования переменных. Таблица 6. Схема формирования программного конвейера алгоритмом EPS. Кодогенератор (backend compiler) Описание архитектуры микропроцессора Описание конвейера в GCC Класс инструкции Таблица 8. Синтаксис описания модели конвейера. Параметры конструкции Таблица 9. Синтаксис описания резервирования устройств. Пример описания Описание целевой машины в GCC на примере микроконтроллера семейства AVR. Поддержка описания машины Определение типов данных Определение оптимизирующего преобразования Разные результаты Ошибка при работе с памятью Различные результаты Участки экономии. Примеры оптимизации Оригинальный код Свертка констант Оригинальный код Цель оптимизации Оригинальный код Подстановка операторов Оригинальный код Прямое преобразование Оригинальный код Удаление неиспользуемого кода Оригинальный код Упрощение булевых выражений в серию переходов Оригинальный код Снижение мощности выражений с индексной переменной Пути достижения Оригинальный код Удаление индексной переменной Пути достижения Оригинальный код Раскрутка циклов Пути достижения Программная конвейеризация Пути достижения Вынесение условных выражений за пределы цикла Пути достижения Исходный код Исходный граф потока управления Вынесение первых и последних итераций Исходный текст Исходный граф потока данных Оптимизация хвостовых вызовов Исходная программа Оптимизация вызовов отключена Встраивание функций (Inline) Оригинальный код Получение дистрибутива. Общие опции Опции поиска каталогов и подключения библиотек Пример компиляции Корневой каталог Подкаталог gcc Имя выражение Выражение {действие} YACC (Yet Another Compiler Compiler)