Этапы подготовки программы

 

 
 

 


Загрузчик
Загрузочный модуль
Редактор Связей
Объектный модуль
Трансляция

 

Трансляторы и интерпретаторы – общая схема работы

Транслятор – это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке. В определении транслятора, как и в его работе, участвует три программы. Во-первых, сам транслятор – программа. Он входит в состав СПО, представляет собой набор машинных команд и данных и выполняется компьютером в рамках ОС. Во-вторых, исходными данными для транслятора является текст входной программы. Как правило, это файл, содержащий текст программы и удовлетворяющий синтаксическим и семантическим требованиям входного языка. В-третьих, выходными данными транслятора является текст результирующей программы, которая строится по синтаксическим правилам, заданным в выходном языке транслятора.

Важным требованием в определении транслятора является эквивалентность программ на входе и выходе. Нарушение этого требования делает работу транслятора бесполезной. С точки зрения принципа работы транслятор выступает как переводчик: преобразует предложения входного языка в эквивалентные им предложения выходного языка. Кроме того, само слово «транслятор» означает «переводчик».

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

 

Процесс компиляции состоит из двух основных этапов − анализа и синтеза.

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

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

 

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

Компилятор с точки зрения теории формальных языков выполняет две основные функции:

1) он является распознавателем для языка исходной программы. Получает на вход цепочку символов входного языка, проверяет ее принадлежность языку и выявляет правила, по которым эта цепочка построена;

2) он генерирует результирующую программу. На выходе создается цепочка выходного языка по определенным правилам. Распознавателем сгенерированной цепочки объектной программы будет выступать вычислительная система.

Функции основных фаз компиляции:

Лексический анализ. Эту часть компилятора выполняет сканер, который читает литеры программы (символы) на исходном языке и строит из них слова (лексемы) исходного языка. На входе сканера (лексического анализатора) текст исходной программы, выходная информация передается для дальнейшей обработки на этап синтаксического разбора.

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

Семантический анализ − это часть компилятора, проверяющая часть текста исходной программы с точки зрения семантики входного языка.

Подготовка к генерации кода − на этой фазе компилятор выполняет предварительные действия, непосредственно связанные с синтезом текста результирующей программы: идентификация элементов языка, распределение памяти и т.п. Эта подготовка ещё не ведёт к порождению текста на выходном языке.

Генерация кода − это фаза, на которой непосредственно порождаются команды, составляющие предложения выходного языка и текст результирующей программы в целом. Фаза генерации кода основная на этапе синтеза результирующей программы. Кроме этого, генерация обычно включает в себя и оптимизацию. Оптимизация − это процесс, связанный с обработкой уже порожденного текста и оказывающий существенное влияние на качество и эффективность результирующей программы.

Таблицы идентификаторов

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

Интерпретатор − это программа, которая воспринимает входную программу на исходном языке и выполняет её.

Термин «интерпретатор», как и «транслятор» означает «переводчик». Но с точки зрения формальных языков, отличаются они принципиально.

Большинство интерпретаторов последовательно исполняют исходную программу по мере поступления ее на вход интерпретатора. При этом пользователю нет смысла ждать завершения компиляции всей исходной программы. Исходя из этой особенности (исполнение команд по мере их поступления) в интерпретаторах отсутствует фаза оптимизации. А также на последнем этапе − этапе генерации кода − машинные команды не записываются в объектный файл, а выполняются.

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

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

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

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

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

Долгое время интерпретаторы были менее распространены, чем компиляторы, и существовали для относительно простых языков программирования (Basic). Профессиональные средства разработки ПО с высокими требованиями к производительности строились на базе компиляторов.

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

Многие языки программирования, которые используются в сети Интернет, предусматривают механизм интерпретации исходного текста программы вместо компиляции. В качестве примера интерпретируемого языка широкого распространения выступает HTML (Hypertext Markup Language) язык описания гипертекста. Он лежит в основе функционирования большинства структур сети Интернет. Языки Java и Java Script сочетают функции компиляции и интерпретации. На первом этапе исходная программа компилируется в некоторый двоичный код, который является промежуточным и не зависит от архитектуры целевого компьютера. Этот код передается по сети и выполняется принимающим компьютером в виде интерпретации.