Трансляция программ и сопутствующие процессы

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

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

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

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

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

Важнейшим элементом в развитии систем программирования выступили подпрограммы.

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

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

В настоящее время распространены пользовательские и прикладные библиотеки подпрограмм; их число увеличивается; меняется структура библиотечных подпрограмм. В современных языках получили распространение модули (Unit), представляющие собой специализированные пакеты взаимосвязанных подпрограмм определенного назначения, например, по работе с клавиатурой, с графикой и пр. Развитие объектно-ориентированного программирования позволило создавать библиотеки объектов и подпрограмм с объектными типами данных (Object). Примером могут служить оболочки типа Turbo Vision в языках Pascal и C.

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

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

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

Редактор связей (иначе компоновщик или сборщик) представляет собой системную обрабатывающую программу, редактирующую и объединяющую объектные модули, полученные в результате работы транслятора, в единые загрузочные, готовые к выполнению программные модули, загружающиеся ОС для выполнения в основную память.

Объектные модули не предназначены для непосредственного исполнения, поэтому в них обычно нет привязки составляющих их машинных команд к конкретному месту в ОЗУ. Адреса машинных слов бывают условными, что помогает компоновщику размещать объектные модули в свободных местах ОЗУ, заменяя условные адреса команд на конкретные.

Многие системы программирования дополнительно содержат промежуточные этапы трансляции. В этих системах на первом шаге предусмотрена трансляция исходного текста в макроассемблерный код, а уже затем – в объектный модуль. Это связано с тем, что многие подпрограммы удобнее писать на Ассемблере, и подключать их легче на этапе объединения (связывания) ассемблерного модуля с ассемблерными библиотеками подпрограмм.

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

Описанный процесс трансляции характерен для компиляции. Последовательно реализованный интерпретатор объектного модуля фактически не создает. В этом его недостаток, а достоинство – в экономии машинной памяти. Впрочем, у современных ЭВМ, в том числе и ПК, проблема малого ОЗУ отходит на второй план, и интерпретация встречается все реже, т.к. эффективность этого процесса в целом значительно ниже. К компилируемым языкам программирования можно отнести, например, Pascal, C, C++, а к интерпретируемым – Basic.

Трансляция происходит в три этапа:

• синтаксический анализ. Транслятор проверяет, не нарушены ли в исходной программе формальные правила, содержащиеся в данном языке программирования. В системе программирования встроены описания всех синтаксически разрешенных конструкций, и транслятор применяет их к исходной программе. Для строгого и точного задания синтаксиса применяются специальные метаязыки (языки для описания других языков) – нормальные металингвистические формы Бэкуса-Наура (язык БНФ) и синтаксические диаграммы Вирта. Первой фазой синтаксического анализа является лексический анализ, заключающийся в просмотре литер исходной программы и построении из них лексически допустимых единиц – идентификаторов, ключевых слов языка, чисел и т.д. Во второй фазе эти единицы уже рассматриваются как неделимые, и проверяется допустимость их сочетания;

• семантический анализ. Транслятор проверяет, имеет ли программа смысл в рамках данного языка программирования, т.е. понятен ли текст программы (семантика – смысловая сторона языка). Пример семантической ошибки – неописание переменных в языке, требующем обязательного явного их описания;

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

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

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

СВОЙСТВА АЛГОРИТМОВ

• точность – алгоритм должен однозначно и подробно описывать задачу;

• дискретность (упорядоченность) – все действия в алгоритме должны быть выстроены в четком, строго определенном порядке;

• результативность (эффективность) – алгоритм должен быть как можно более компактным, то есть результат должен быть получен при использовании минимально возможного числа программных шагов;

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

Наши рекомендации