Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
68
Добавлен:
30.04.2013
Размер:
328.19 Кб
Скачать

24) Компиляторы. Семантический анализатор. Генерация, оптимизация кода программы.

Компилятором называется системная программа (транслятор), выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на языке, близком к машинному, и в определенном смысле эквивалентную первой. Другой разновидностью трансляторов являются интерпретаторы, осуществляющие анализ и перевод текста программы в машинный код пошагово, непосредственно перед выполнением, и сразу же исполняющие получившийся машинный код.

Процесс компиляции состоит из следующих этапов: 1.)Лексический анализ - на этом этапе последовательность символов исходного файла преобразуется в последовательность лексем. 2.)Синтаксический анализ - последовательность лексем преобразуется в семантическое дерево. 3.)Семантический анализ, включающий: оптимизацию - выполняется удаление лишних конструкций и упрощение семантического дерева, генерация кода - семантическое дерево преобразуется в целевой язык.

Семантический (контекстный) анализ

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

На данном этапе выявляются зависимости между частями программы, которые не могут быть описаны контекстно-свободным синтаксисом. Это в основном связи «описание-использование», в частности, анализ типов объектов, анализ областей видимости, соответствие параметров, метки и другие. В процессе контекстного анализа таблицы объектов пополняются информацией об описаниях (свойствах) объектов.

Результатом контекстного анализа является атрибутированное дерево программы. Информация об объектах может быть как рассредоточена в самом дереве, так и сосредоточена в отдельных таблицах объектов. В процессе контекстного анализа также могут быть обнаружены ошибки, связанные с неправильным использованием объектов.

Затем программа может быть переведена во внутреннее представление. Это делается для целей оптимизации и/или удобства генерации кода.

Оптимизация

Целью данной фазы обработки программы является уменьшение затрат программы по памяти и по времени. Оптимизация обычно обозначает модификацию кода и его установок компиляции для данной архитектуры для производства более эффективного ПО. Значительное улучшение производительности часто может быть достигнуто с помощью удаления избыточной функциональности.

Для оптимизации требуется найти узкое место: критическую часть кода, которая является основным потребителем необходимого ресурса. Улучшение примерно 20% кода влечёт за собой изменение 80% результатов.

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

Генерация кода - последняя фаза трансляции. Результатом ее является либо ассемблерный модуль, либо объектный (загрузочный) модуль. В процессе генерации кода могут выполняться некоторые локальные оптимизации, такие как распределение регистров, выбор длинных или коротких переходов, учет стоимости команд при выборе конкретной последовательности команд.

При работе модулем генерации кода используются: 1) матрица промежуточного кода программы; 2) таблица символических имен и литералов; 3) таблица кодовых образцов.

Алгоритм работы модуля генерации кода в простейшем случае сводится к выполнению подстановок: для очередного кода из матрицы отыскивается в таблице кодовый образец, который построчно переносится в файл объектного кода. При этом в каждой строке выполняется замена признаков элементами из матрицы промежуточного кода. Наблюдается прямая аналогия с алгоритмом работы макропроцессора, только роль макроопределений выполняют кодовые образцы, а макрокоманд - промежуточные коды.

Соседние файлы в папке Материал