М.Ю. Харламов, ВНУ им. В.Даля, 2009
Транслятор Транслятор - это программа, которая переводит программу на исходном (входном) языке в эквивалентную ей программу на результирующем (выходном) языке Тема 1. Основы компиляторов Транслятор Целевая программа Исходная программа Сообщения об ошибках
Компилятор Компилятор генерирует результирующую программу, предназначенную для непосредственного исполнения на целевой вычислительной системе исходная программа исходный код результирующая программа объектная программа (объектный код) Интерпретатор Интерпретатор это программа, которая воспринимает исходную программу на входном языке и (сразу же) выполняет ее Тема 1. Основы компиляторов
Скелетная исходная программа Препроцессор Исходная программа Компилятор Ассемблер Загрузчик/Ре- дактор связей Целевая ассемблерная программа Перемещаемый машинный код Библиотека, объектные файлы Абсолютный машинный код
Тема 1. Основы компиляторов Лексический анализ Синтаксический разбор Семантический анализ Подготовка к генерации кода Внутреннее представление программы Генерация кода Исходная программа Анализ и локализация обнаруженных ошибок Сообщение об ошибке Объектная программа Таблицы идентификаторов Синтез Анализ
лексическом анализе токенов При лексическом анализе символы исходной программы считываются (слева направо) и группируются в поток токенов (token), в котором каждый токен представляет логически связанную последовательность символов: идентификатор, ключевое слово (if, while и т.п.), символ пунктуации,… Тема 1. Основы компиляторов position := initial + rate * 60 Лексический анализатор id 1 := id 2 + id 3 * 60
Синтаксический разбор Синтаксический разбор основная часть компилятора на этапе анализа: выполняется выделение и иерархическое группирование синтаксических конструкций в тексте исходной программы, обработанном лексическим анализатором проверяется синтаксическая правильность программы Тема 1. Основы компиляторов id 1 := id 2 + id 3 * 60 Синтаксический анализатор id 1 id 2 id 3 60 * + :=
Тема 1. Основы компиляторов семантического анализа: В процессе семантического анализа: проверяется наличие семантических ошибок в исходной программе и накапливается информация о типах Производится идентификации операторов и операндов выражений и инструкций Семантический анализатор id 1 id 2 60 * + := id 1 id 2 60 * + inttoreal
Управление таблицей символов Таблица символов - структура данных, содержащую записи о каждом идентификаторе с полями для его атрибутов: сведения об отведенной идентификатору памяти, его типе, области видимости, … Обнаружение ошибок и сообщение о них Тема 1. Основы компиляторов
Генерация явного промежуточного представления исходной программы (программа для абстрактной машины) Генератор промежуточного кода id 1 id 2 60 * + inttoreal temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3
Тема 1. Основы компиляторов При оптимизации кода производятся попытки улучшить промежуточный код, чтобы получить более эффективный машинный код. Оптимизатор кода temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 temp1 := id3 * 60.0 id1 := id2 + temp1
Тема 1. Основы компиляторов При оптимизации кода производятся попытки улучшить промежуточный код, чтобы получить более эффективный машинный код. Генератор кода temp1 := id3 * 60.0 id1 := id2 + temp1 MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF Rl, id1
Начальная стадия Начальная стадия объединяет те фазы компилятора, которые зависят в 1 ую очередь от исходного языка и практически не зависят от целевой машины Лексический и синтаксический анализ, создание таблицы символов, семантический анализ и генерация промежуточного кода Заключительная стадия Заключительная стадия состоит из тех фаз компилятора, которые в 1 ую очередь зависят от целевой машины, для которой выполняется компиляция, и, вообще говоря, не зависят от исходного языка (а только от промежуточного) + часть оптимизации кода и генерация выходного кода (сопровождаемые необходимой обработкой ошибок и работой с таблицей символов) Тема 1. Основы компиляторов
Проход Проход процесс последовательного чтения компилятором данных из внешней памяти, их обработки и помещения результата работы во внешнюю память Чаще всего один проход включает в себя выполнение одной или нескольких фаз компиляции Наиболее распространены 2 х- и 3 х-проходные компиляторы, например: 1 ый проход лексический анализ, 2 ой - синтаксический разбор и семантический анализ, 3 ий генерация и оптимизация кода Желательно иметь компилятор с минимальным числом проходов Тема 1. Основы компиляторов
Препроцессоры Препроцессоры - создают входной поток информации для компилятора обработка макросов; включение файлов; «интеллектуальные'' препроцессоры; языковые расширения… Программы для предварительного анализа структурные редакторы; программы форматированного вывода на печать; статические проверяющие программы… Ассемблеры Ассемблеры Загрузчики и редакторы связей Загрузчики и редакторы связей Тема 1. Основы компиляторов
1. Ахо А.В., Сети. Р., Ульман Д.Д. Компиляторы: принципы, технологии и инструменты М.: Издательсхий дом "Вильямс" с. 2. Молчанов А.Ю. Системное программное обеспечение: Учебник для вузов. СПб.: Питер, с: 3. Молчанов А.Ю. Системное программное обеспечение. Лабораторный практикум. – СПб.: Питер, – 284 с. Тема 1. Основы компиляторов