И.А. Волкова, И.Г. Головин, Л.Е. Карпов - Системы программирования (1119414), страница 7
Текст из файла (страница 7)
Вэтом смысле термин транслятор является самым общим и обозначает, как компиляторыи ассемблеры, так и интерпретаторы.Некоторые интерпретаторы построены так, что исполняют исходную программупоследовательно, по мере поступления программы на вход интерпретатора.Пользователю при этом не надо ждать завершения интерпретации, чтобы увидетьпервые результаты работы программы, он может получать результаты постепенно, помере работы интерпретатора. Не все языки программирования допускают такоепостроение интерпретаторов. Для того, чтобы это было возможно, язык долженодновременно допускать возможность существования однопроходного компиляторадля этого языка. Это ограничение приводит к таким свойствам языковпрограммирования, как необходимость описаний объектов данных до их первогоиспользования в программе.
Например, не могут интерпретироваться таким способомпрограммы на языках программирования, если эти языки допускают использованиенекоторых объектов прежде, чем в тексте встретится описание этих объектов.Скорость выполнения программы интерпретаторами во много раз меньше, чемпри использовании компиляторов. Кроме того, при интерпретации исходная программадолжна подвергаться разбору всякий раз при ее выполнении, а при компиляции разборвыполняется только один раз, после чего используется уже не исходный текст, аобъектный файл с готовой программой. Однако интерпретаторы обладают26независимостью от архитектуры целевой вычислительной системы, в то время, как прикомпиляции готовые программы всегда ориентированы на эту архитектуру.Разнородность оборудования, с которой постоянно приходится сталкиваться вглобальных информационных сетях, например, в сети Интернет, препятствуетиспользованию компиляторов, но способствует развитию систем, интерпретирующихтексты исходных программ, либо систем с двойной технологией – компиляции иинтерпретации, в которых, в зависимости от требований пользователя исходнаяпрограммалибокомпилируется,либоинтерпретируется.Примерамиинтерпретируемых языков являются язык JavaScript , а также язык для решения задачискусственного интелллекта ПЛЭНЕР.
Смешанная стратегия трансляции применяется всистемах, работающих в сети Интернет, программы для которых пишутся на языкеJava.3.3. Компилятор как основной компонент системы программированияНа начальном этапе развития теории построения компиляторов их сравнивалимежду собой по количеству проходов по тексту исходной программы, которыевыполнялись при компиляции программ.
Это количество может меняться от одного донескольких десятков, на их количество, кроме свойств исходного языка, могут влиятьтакже свойства операционного окружения, в котором работает компилятор. Проход –это процесс последовательного чтения компилятором данных из внешней памяти, ихобработки и записи результата во внешнюю память. Во время одного прохода можетвыполняться сразу несколько фаз компиляции, но случается, что одна фаза компиляции(например, синтаксический анализ) выполняется за несколько проходов.В настоящее время практически все компиляторы языков программированияпросматривают сам исходный текст только один раз. Если же такого просмотраоказывается недостаточно, а его часто оказывается недостаточно, организуютсядополнительные просмотры отдельных фрагментов программы, причем выполняютсяони не по исходному тексту, а по его внутреннему представлению.
Чтобы построитьтакое внутреннее представление программы, в компиляторе строятся сложныетаблицы, в которые заносятся сведения, извлекаемые из текста программы на первом иединственном его просмотре.3.3.1. Общая схема работы компилятораНа следующей странице изображена схема работы компилятора языкапрограммирования. Сплошные стрелки на этом рисунке указывают порядок работыкомпилятора, а пунктирные линии – потоки информации.3.3.1.1. Основные компоненты компилятора и фазы компиляцииИнформационные таблицы. При анализе программы из имеющихся в нейописаний, заголовков процедур, блоков, циклов и других структурных операторовизвлекается информация, которая должна сохраняться для использования напоследующих фазах компиляции.
Вся эта информация размещается в информационныхтаблицах компилятора. Если при просмотре программы встречается некоторыйидентификатор, в таблицах должны быть сведения о том, как он был описан и какиспользовался в программе. Конкретная информация зависит от исходного языка, отобъектного языка и сложности транслятора. Кроме таблицы идентификаторов (“имен”)обычно строится таблица констант, в которую включаются все константы,использованные в программе, и заносятся их адреса в объектной программе.27Компиляторязыка программированияТаблицыкомпилятораНачальные установкиФазы анализа программИсходнаяпрограммаТекстЛексический анализ(сканер)ЛексемыСинтаксический исемантический анализ(контроль контекстныхусловий)Анализ и локализацияобнаруженных ошибокВнутреннеепредставлениеТаблицыслужебныхидентификаторовТаблицаконстантТаблицаименФазы оптимизации программВнутреннеепредставлениеФазы синтеза программТаблицапроцедурТаблицаблоковРаспределение памятиСообщенияоб ошибкахВнутреннее представлениеТаблицацикловРаспределение регистровВнутреннее представлениеОбъектнаяпрограммаТекст или кодГенерация команд имашинно-зависимаяоптимизацияМножестводругихтаблицНачальные установки.
Перед началом работы с программой компиляторунеобходимо провести инициирующие мероприятия. К таковым относятся ввод иобработка режимов запуска компилятора и первичное заполнение таблиц исходнойинформацией.Фазы анализа программ. На этапе анализа в компиляторе выполняетсяраспознавание текста исходной программы и заполнение информационных таблиц. Врезультате формируется некоторое внутреннее представление программы, понятное28следующим фазам компиляции. Получая на вход исходную программу какпоследовательность символов входного языка (“цепочку”), компилятор долженпроверить, принадлежит ли она входному языку, а также определить правила, покоторым эта последовательность строилась. Анализ часто подразделяется налексический, синтаксический и семантический анализ.Лексический анализатор (сканер). Основная задача лексического анализатора –просмотреть весь текст исходной программы и выделить в нем лексемы (минимальныелексические единицы или элементы текста программы, обладающие смыслом в рамкахданного языка).
В обычных языках программирования лексемами являются числа(десятичные целые, вещественные), идентификаторы, служебные слова, разделители.Задачей лексического анализатора является замена разнообразных элементов текстастандартно выглядящими лексемами, которые в дальнейшем будет легче обрабатыватьв других частях компилятора. Лексический анализ сопровождается исключениемнезначащих фрагментов текстов программ, например, комментариев. Для тех языков, вкоторых имеются макросредства, дополнительно выполняется расширениемакровызовов. Подробнее задачи и проблемы лексического анализа рассматриваются впособии “Формальные грамматики и языки.
Элементы теории трансляции”.Синтаксический и семантический анализаторы. Программа должна бытьпроверена на синтаксическую и семантическую правильность (должно быть проверенособлюдение контекстных условий), разделена на составные части, для каждой изкоторых должно быть сформировано внутреннее представление.
В таблицытранслятора должна быть занесена вся информация, которую можно извлечь изобрабатываемой программы. Подробнее задачи и проблемы синтаксического исемантического анализа рассматриваются в разделе 3.3.2 и в пособии “Формальныеграмматики и языки. Элементы теории трансляции”.Внутреннее представление исходной программы. Внутреннее представлениеисходной программы в компиляторе в наибольшей степени зависит от той обработки,которой должна подвергнуться программа. Некоторые виды внутреннегопредставления больше подходят для фиксации структуры компилируемой программы,другие ориентированы на проведение оптимизирующих преобразований, третьинаиболее удобны при синтезе (генерации) результата компиляции. Более подробновнутреннее представление программ в компиляторах рассматривается в разделе 3.3.3 ив пособии “Формальные грамматики и языки.
Элементы теории трансляции”.Фазы оптимизации программ. Оптимизация – важнейшая задача компилятора.Языки высокого уровня, не связанные напрямую с особенностями конкретнойаппаратуры, на которой должны выполняться программы, без оптимизации не могутиспользоваться для создания эффективных программ.
Оптимизация программ можетпроводиться в интересах различных свойств программ. Обычно используют двестратегии оптимизации: оптимизация в целях повышения скорости работы программыи оптимизация в целях уменьшения размеров программ. Методы, используемые приреализации этих стратегий часто противоположны, хотя некоторые из них близки другк другу. Более подробно проблемы оптимизации программ в компиляторахрассматриваются в разделе 3.3.4.Фазы синтеза программ. Второй главной работой компилятора являетсягенерация результирующей программы. На выходе компилятора должна бытьпостроена последовательность символов (“цепочка”) выходного языка по темправилам, которые предлагаются языком машинных команд или языком ассемблера. В29случае машинных команд распознавателем этой последовательности символов будетвыступать целевая вычислительная система, для которой создается результирующаяпрограмма.Распределение памяти и регистров.