Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО юнита 2.doc
Скачиваний:
38
Добавлен:
17.11.2019
Размер:
5.82 Mб
Скачать

2.3 Компиляторы как класс программного обеспечения

Принципы и технологии написания компиляторов очень разнообразны. Написание компиляторов охватывает языки программирования, архитектуру вычислительных систем, теорию языков, алгоритмы и технологию создания программного обеспечения.

Создатели компиляторов применяют такие программные инструменты, как отладчики, средства контроля версий, профайлеры.

Профайлер – программа определения профиля программы или профиля оборудования.

Профиль программы – информация о ходе выполнения программы.

Профиль оборудования – набор значений, параметров и характеристик конкретного оборудования компьютера.

Вскоре после написания первых компиляторов появились инструменты, облегчающие их создание. Такие системы получили названия компиляторов компиляторов, генераторов компи-ляторов или систем написания трансляторов. Как правило, они ориентированы на языки опреде-ленной модели и наиболее подходят для генерации компиляторов языков именно этой модели.

Например, лексические анализаторы для всех языков одинаковы – за исключением множеств ключевых слов и знаков. Многие компиляторы компиляторов используют фиксированные программы лексического анализа в генерируемых компиляторах. Эти программы пользуются только списком ключевых слов, и все, что требуется от пользователя, – предоставить этот список. Такой подход вполне корректен, но может оказаться неработоспособным, если необходимо распознавание нестандартных токенов. Например, идентификаторов, которые включают символы, отличающиеся от букв и цифр.

Некоторые инструменты созданы для автоматической разработки определенных компонентов компиляторов. Они используют специализированные языки для определения и реализации компо-нентов и применяют весьма интеллектуальные алгоритмы. Наиболее эффективные инструменты скрывают детали алгоритма генерации и производят компоненты, интегрируемые с остальными частями компилятора.

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

1) генераторы синтаксических анализаторов – производят синтаксические анализаторы по входной информации, основанной на контекстно-свободной грамматике. Генераторы синтак-сических анализаторов используют алгоритмы разбора, которые сложны для ручной реализации;

2) генераторы сканеров – этот инструментарий автоматически генерирует лексические ана-лизаторы с использованием спецификаций, построенных на регулярных выражениях. В основном, лексические анализаторы действуют по принципу конечного автомата;

3) средства синтаксически управляемой трансляции. С помощью данного инструментария создаются наборы программ прохода по дереву разбора и генерации промежуточного кода. Основная идея состоит в одной или нескольких "трансляциях", связанных с каждым узлом дерева разбора. При этом каждая трансляция определяется с учетом соседних узлов дерева;

4) автоматические генераторы кода – эти инструменты получают набор правил, которые указывают способ трансляции каждой операции промежуточного языка в определенный машинный язык. Правила должны быть достаточно детальны, чтобы обеспечить работу с различными способами доступа к данным. Например, переменные могут находиться в регистрах, статических ячейках памяти или в стеке.

Стек – упорядоченный набор элементов данных, в котором очередной читаемый или удаляемый элемент выбирается из его конца.

В данном случае применяется технология "согласованных шаблонов". Инструкции промежу-точного кода замещаются "шаблонами", которые представляют собой последовательности машин-ных инструкций, согласованные по способу хранения переменных. Поскольку обычно имеется множество вариантов размещения переменных, возможно использование различных способов замещения промежуточного кода набором шаблонов. Необходимо выбрать хорошее замещение шаблонами, без перебора всех возможных вариантов и замедления компиляции;

5) средства работы с потоком данных. Для получения оптимизированного выходного кода требуется проведение анализа потока данных, т.е. сбора и анализа информации о том, каким образом значения передаются из одной части программы в другую.