- •Тема 2. Основные принципы построения трансляторов
- •Трансляторы, компиляторы и интерпретаторы - общая схема работы
- •Формальное определение транслятора
- •Определение компилятора. Отличие компилятора от транслятора
- •Многопроходные и однопроходные компиляторы
- •Определение интерпретатора. Разница между интерпретаторами и трансляторами
- •Трансляция в ассемблер
- •Методики создания компилятора
- •Метод раскрутки
- •Кросс-транслятор
- •Виртуальная машина
- •Компиляция "на лету"
- •Этапы трансляции. Общая схема работы транслятора
- •Лексический анализ
- •Синтаксический анализ
- •Семантический анализ
- •Оптимизация кода
- •Генерация кода
- •Просмотры
Генерация кода
Наконец, по оптимизированной версии промежуточного представления генерируется объектная программа.
Помимо собственно генерации кода, на этом этапе необходимо решить множество сопутствующих проблем, например:
распределение памяти, т.е. отображение имен исходной программы в адреса памяти,
распределение регистров, т.е. определение для каждой точки программы множества переменных, которые должны быть размещены в регистрах,
выбор такой последовательности записи значений в регистры, которая избавила бы от необходимости частой выгрузки значений из регистров, а затем повторной загрузки.
Просмотры
Под просмотром (или проходом) компилятора понимается процесс обработки всего, возможно, уже преобразованного, текста исходной программы.
Одна или несколько фаз компиляции могут выполняться на одном просмотре. Например, лексический анализ и синтаксический анализ часто выполняются на одном просмотре, т.е. синтаксический анализатор может обращаться к лексическому анализатору за очередной лексемой лишь по мере необходимости. С другой стороны, некоторые оптимизации могут выполняться на нескольких просмотрах.
Передача информации между просмотрами происходит в терминах так называемых промежуточных языков. Таким образом, если компилятор состоит из N просмотров, то должно быть определено N-1 промежуточных языков. Каков этот промежуточный язык, зависит от разработчиков компилятора. Обычно программа на промежуточном языке представляет собой синтаксическое дерево и, возможно, какие-то внутренние таблицы компилятора.
Желательно иметь относительно мало просмотров, т.к. для чтения программы на одном промежуточном языке и записи ее на другом промежуточном языке может занимать довольно много времени. С другой стороны, объединяя несколько фаз в один просмотр, мы должны помнить о том, что иногда мы не можем выполнить некоторую фазу, не получив информацию из предыдущих фаз. Например, C# позволяет использовать имя метода до того, как он был описан. Понятно, что мы не можем выполнить семантический анализ до тех пор, пока мы не будем знать имена и типы всех методов объектов. Таким образом, эти задачи должны решаться на разных просмотрах.
Контрольные вопросы и задачи
Вопросы
Задачи
Литература
Молчанов А.Ю. Системное программное обеспечение: Учебник для вузов. – СПб.: Питер, 2003(2010). – 396 с.
Ахо Альфред В., Лам,Моника С, Сети Рави, Ульман Джеффри Д. Компиляторы: принципы, технологии и инструментарий, 2-е изд. : Пер. с англ. - М. : ООО "И.Д. Вильямс", 2008. - 1184 с.
Разработка компиляторов./Вояковская Н.Н., Москаль А.Е., Булычев Д.Ю., Терехов А.А.-Лекция3. Основы компиляторов. ИНТУИТ http://www.intuit.ru/department/sa/compilersdev/3/3.html
Тест
