- •Кубанский государственный технологический университет Кафедра вычислительной техники и асу
- •Введение
- •1 Нормативные ссылки
- •2 Требования к курсовому проекту
- •3 Примерный перечень курсовых проектов
- •4 Пример выполнения курсового проекта
- •Введение
- •1 Общие сведения о трансляции
- •2 Описание транслируемого языка
- •3 Синтез транслятора
- •3.1 Лексический блок
- •3.2 Синтаксический блок
- •4 Описание программы
- •4.1 Общие сведения
- •4.2 Работа с программой
- •Заключение
- •Приложение а
- •Форма задания на курсовое проектирование
- •Кубанский государственный технологический университет
- •Задание на курсовое проектирование
- •Приложение б
- •Форма титульного листа пояснительной записки
- •Кубанский государственный технологический университет
- •Пояснительная записка
- •Список использованных источников
Введение
В последнее время круг задач, решаемых с помощью ЭВМ, значительно расширился, а сложность задач возросла. В этой ситуации все чаще используются языки высокого уровня, а также специализированные языки. Кроме того, всем известен тот факт, что ЭВМ понимает программы, состоящие только из внутренних команд процессора. В связи с этим возникает задача перевода программы с языка высокого уровня на язык, понятный процессору ЭВМ (трансляция). Разрабатывается один из вариантов программы, выполняющей такой перевод, — транслятор.
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) - с фиксированной или плавающей точкой, от используемых регистров машины и др.
Та часть работы транслятора, которая связана со смысловым значением лексем, называется семантической обработкой.
Семантика идентификатора может включать его тип, а в случае, если это массив, то его размерность.
Один из видов семантической обработки включает занесение в таблицу имен свойств отдельных идентификаторов по мере их выявления.
Другой вид включает действия, зависящие от типа данных. В некоторых трансляторах определенные семантические действия выполняются отдельным семантическим блоком, помещаемым между синтаксическим блоком и генератором кода.
Иногда перед генератором кода размещается еще оптимизирующий блок, цель которого - повысить эффективность работы программы.
Например, вычисления внутри цикла, когда они не меняются. Это необходимо определить и вынести эти вычисления вне цикла.
Будет рассмотрено два вида действия транслятора:
лексическая обработка;
синтаксическая обработка.