logo
стр 103-113

Трансляторы

Как следует из многоуровневой архитектуры ЭВМ, прикладные программы пишутся на языках высокого уровня (ЯВУ). Существуют сотни таких языков, но процессор понимает только язык единиц и нулей. Поэтому программы на ЯВУ обычно транслируются на уровень 3 или 4 (уровень ассемблера). Программы трансляторы бывают двух видов – интерпретаторы и компиляторы.

Программа (микропрограмма) способная вызывать команды, операнды из памяти, определять тип команд и выполнять эти команды называется – интерпретатор.

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

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

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

Отличительные особенности: быстро, но изменение платформы приводит к необходимости разработки нового компилятора. Есть и третья возможность, известная под именем Java машины или виртуальной машины Java – это компилятор, транслирующий ЯВУ на промежуточный псевдокод, а затем с псевдокода интерпретатор. При этом сочетаются отличительные особенности того и другого метода.

Компьютеры могут иметь интерпретатор и тогда они гораздо проще и дешевле чем компьютеры без интерпретации, а могут и не иметь, но тогда они должны использовать технику компиляции. Впервые интерпретация получила применение при реализации компьютеров способных выполнять сложные команды, предназначенные для высокопроизводительных и дорогих машин (IBM S./360, S/370, S/390). Это сформировало тенденцию введения все более и более сложных команд (порядка 300 у VAX DEC и 200 способов определения операндов). Главное преимущество интерпретации заключалось в том, что можно было разработать простой процессор, а вся сложность сводилась к созданию интерпретатора.

(Такое операторное управление вычислительным процессом привело к необходимости использовать разнообразные форматы обработки данных (например: тривиальное суммирование в S/360 имело около 20 различных форматов). Хотя машина была способна вычислять экспоненту, логарифм, но простые операции производились очень медленно. Действительно, что бы перевести команду сложения в машинный код, интерпретатор должен был просмотреть более 20 возможных команд. Такое разнообразие инструкций потребовало и множества командных форматов различной длины.) Каждый процессор имеет свои специфические команды, наборы регистров и режимы адресации, поэтому программу на Ассемблере невозможно перенести с одной аппаратной платформы на другую. Для того чтобы не зависеть от конкретного процессора, часто используют язык описания команд RTL, от англ. Register Transfer Language — язык перемещения регистров. Фактически RTL представляет собой Ассемблер, не зависящий от конкретного процессора. Многие компиляторы, например, gcc, не переводят программу с языка высокого уровня сразу на язык машинных команд, а сначала транслируют ее на язык RTL. Затем на уровне RTL выполняется оптимизация кода, которая составляет 99% работы компилятора. И лишь на последнем этапе программа c языка RTL переводится на язык команд конкретного процессора. Поскольку RTL максимально приближен к Ассемблеру, трансляция из RTL в конкретный Ассемблер не представляет никакого труда. Такой подход позволяет сделать компилятор с языка высокого уровня практически независимым от конкретной архитектуры. Зависим лишь модуль, осуществляющий перевод с RTL в Ассемблер, но его реализация требует минимальных усилий.