среда, 4 августа 2010 г.

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


7. Управление таблицей символов
Важная функция компилятора состоит в том, чтобы записывать имена пере­менных в исходной программе и накапливать информацию о разных атрибутах каждого имени. Эти атрибуты могут предоставлять информацию о выделенной памяти для данного имени, его типе, области видимости (где именно в программе может использоваться его значение) и, в случае имен процедур, такие сведения, как количество и типы их аргументов, метод передачи каждого аргумента (напри­мер, по значению или по ссылке), а также возвращаемый тип.
Таблица символов представляет собой структуру данных, содержащую записи для каждого имени переменной, с полями для атрибутов имени. Структура данных должна быть разработана таким образом, чтобы позволять компилятору быстро находить запись для каждого имени, а также быстро сохранять данные в записи и получать их из нее.

8.     Объединение фаз в проходы
Фазы связаны с логической организацией компилятора. При реализации рабо­та разных фаз может быть сгруппирована в проходы (pass), которые считывают входной файл и записывают выходной. Например, фазы анализа — лексический анализ, синтаксический анализ, семантический анализ и генерация промежуточ­ного кода — могут быть объединены в один проход. Оптимизация кода может представлять собой необязательный проход. Затем может быть еще один проход, заключающийся в генерации кода для конкретной целевой машины.
Некоторые наборы компиляторов созданы вокруг тщательно разработанного промежуточного представления, которое позволяет начальной стадии для некото­рого языка программирования взаимодействовать с заключительной стадией для определенной целевой машины. При наличии таких наборов можно создавать компиляторы для различных исходных языков и одной целевой машины, комби­нируя различные начальные стадии с заключительной стадией для этой целевой машины. Аналогично можно разрабатывать компиляторы для различных целевых машин, комбинируя начальную стадию с заключительными стадиями для различ­ных целевых машин.

9.     Инструментарий для создания компиляторов
Разработчики компиляторов, как и разработчики любого другого программ­ного обеспечения, могут с успехом использовать современные среды разработки программного обеспечения, содержащие такие инструменты, как редакторы язы­ков, отладчики, средства контроля версий, профайлеры, средства тестирования и т.п. В дополнение к этим средствам общего назначения может использоваться ряд более специализированных инструментов, созданных для помощи в реализа­ции различных фаз компилятора.
Эти инструменты используют собственные специализированные языки для описания и реализации отдельных компонентов, и многие из них основаны на весьма сложных алгоритмах. Наиболее успешными являются те инструменты, которые скрывают детали алгоритма генерации и создают компоненты, легко ин­тегрируемые в компилятор. К широко используемым инструментам для создания компиляторов относятся следующие.
1. Генераторы синтаксических анализаторов, которые автоматически созда­ют синтаксические анализаторы на основе грамматического описания язы­ка программирования.
2.  Генераторы сканеров, которые создают лексические анализаторы на основе описания токенов языка с использованием регулярных выражений.
3.      Средства синтаксически управляемой трансляции, которые создают набо­ры подпрограмм для обхода синтаксического дерева и генерации промежу­точного кода.
4.       Генераторы генераторов кода, которые создают генераторы кода на ос­нове набора правил трансляции каждой операции промежуточного языка в машинный язык для целевой машины.
5.      Средства работы с потоком данных, которые облегчают сбор информации о передаче значений от одной части программы ко всем другим. Анализ потоков данных представляет собой ключевую часть оптимизации кода.
6.       Наборы для построения компиляторов, которые представляют собой инте­грированные множества подпрограмм для построения разных фаз компи­ляторов.

Комментариев нет:

Отправить комментарий