Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП_КР_МУ1.doc
Скачиваний:
7
Добавлен:
13.09.2019
Размер:
434.69 Кб
Скачать

Введение

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

1 Общие сведения о трансляции

Транслятор - это программа, которая допускает в качестве входа программу на исходном языке высокого уровня, а в качестве выхода выдает другую версию этой программы, написанную на другом языке, который называется объектным языком.

Объектный язык обычно является машинным языком некоторой вычислительной машины, причем программу в этом случае можно сразу же выполнять.

Транслятор можно представить как сложный вычислительный процесс, включающий отдельные более простые блоки. На рисунке 1 представлена упрощенная схема транслятора, который содержит:

  • лексический блок;

  • синтаксический блок;

  • генератор кода;

  • таблицы.

Рисунок 1

Лексический блок. Входом транслятора служит набор двоичных символов (цепочка).

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

Например, цепочка символов может быть такой:

ifb1=10thengoto5.

Лексический блок устанавливает, что цепочка представляет слово if, за которым следует переменная b1, знак равенства, число 10, слова then, goto и метка 5. Таким образом 16 символов преобразуются в 7 новых единиц.

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

Так b1 принадлежит классу "переменная" и имеет значение, которое служит указателем на элемент таблицы имен для b1. Этот указатель на таблицу имен фактически является внутренним именем переменной b1.

Лексема 10 принадлежит классу "константа" и имеет в качестве значения набор битов, изображающих число 10.

Знак равенства относится к классу "знак отношения", а его значение - указывает - какое именно отношение.

Лексема if принадлежит классу "if" (служебное слово) и информирования о ее значении не требуется.

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

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

Например, если в программе написано a+b*c - это значит, что числа, представляемые идентификаторами b, c будут перемножены и к результату будет прибавлено число, представляемое идентификатором а.

Указанные выражения можно перевести так:

УМНОЖИТЬ (b, c, r1),

СЛОЖИТЬ (a, r1, r2),

где первое выражение идентифицируется как "умножить b на с и заслать результат в r1", а второе - "сложить а и r1 и заслать результат в r2".

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

Преимуществом здесь является то, что последовательность атомов отражает порядок, в котором должны выполняться действия. Предположим, как и раньше, что каждый атом состоит из класса и значения. Тогда атом УМНОЖИТЬ (b, c, r1) принадлежит классу "УМНОЖИТЬ" и имеет значение, состоящее из 3-х указателей на элемент таблицы: для b, c и r1 соответственно.

Внутри транслятора атом будет представлен целым числом, обозначающим "УМНОЖИТЬ" и тремя указателями, обозначающими его значение.

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

Генератор кода. Этот блок "развертывает" атомы, построенные СБ, в последовательность команд вычислительной машины, которые выполняют соответствующие действия.

Точный характер этого развертывания зависит от многих признаков. Например, от типа операторов (b, c) - с фиксированной или плавающей точкой, от используемых регистров машины и др.

Та часть работы транслятора, которая связана со смысловым значением лексем, называется семантической обработкой.

Семантика идентификатора может включать его тип, а в случае, если это массив, то его размерность.

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

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

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

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

Будет рассмотрено два вида действия транслятора:

  • лексическая обработка;

  • синтаксическая обработка.