Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
История информационных технологий I.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
8.02 Mб
Скачать

23.3.Трансляция программ

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

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

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

Сказанное выше можно представить в виде следующей диаграммы рис.82.

Рис. 82. Иерархия языков программирования и трансляторов

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

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

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

Технологическая схема компиляции изображена на (рис.83). Три компьютера (K1, K2, K3) выполняют системные программы компилятора, редактора связей и загрузчика. Чаще всего, в качестве этих компьютеров используется один и тот же реальный компьютер. В результате получается абсолютный модуль программы пользователя, который исполняется на компьютере K0, реализуя преобразование исходных данных d в результирующие данные r.

Рис. 83. Технологическая схема компиляции. K0 – K3 различные компьютеры или последовательно один и тот же компьютер

Трансляторы подразделяются на два класса: компиляторы и интерпретаторы. Выше мы описали работу транслятора компилирующего типа- компилятора.

Транслятор интерпретирующего типа - интерпретатор, по сути дела представляет собой виртуальную машину "понимающую" язык программирования высокого уровня (рис. 84). Такая виртуальная машина состоит из аппаратуры компьютера и транслятора интерпретирующего типа, расширяющего возможности аппаратуры до "понимания" языка программирования высокого уровня.

Рис. 84. Транслятор - интерпретатор как виртуальная вычислительная машина

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

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

В настоящее время в одной системе программирования реализуется как интерпретатор, так и компилятор для одного и того же языка (Паскаль, СИ).