Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_tyap (1).doc
Скачиваний:
23
Добавлен:
17.04.2019
Размер:
1.05 Mб
Скачать

8. Основные понятия, связанные с процессами трансляции

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

2. Редакторы связи — это системная обрабатывающая программа, которая предназначена для объединения раздельно полученных, с помощью Ассемблера, объектных модулей и связывания их в единый модуль. В пределах редактора связи все адресные ссылки настраиваются на единое адресное пространство. В отдельных объектных модулях каждый объектный модуль считает, что выход редактора связи – это вход загрузчика.

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

3. Макропроцессоры – это программы, предназначенные для символьной обработки, в процессе которой неким коротким фразам (макровызовам) ставятся в соответствие длинные (макрорасширения). На входе макропроцессора имеется некий текст из макровызовов, на выходе – макрорасширения.

4. Трансляторы (переводчики) переводят текст с одного языка на другой. Выделяют разновидности трансляторов:

- компиляторы (на входе текст на ЯВУ, на выходе – программа в машинных кодах, которая может передаваться либо редактору, либо загрузчику). Особенность – четкое разделение функций перевода и выполнения переведенного.

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

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

5. Языки конверторы выполняют преобразование программы с одного ЯВУ на другой ЯВУ.

6. Текстовые редакторы отличаются необыкновенными расширенными возможностями для обработки текста.

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

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

9. Кросс-система – программа для получения на одной ВМ программ, представленных в машинных кодах некоторой другой ВМ. Используется для отладки проектируемых архитектурных ВС.

9. Этапы и фазы процесса трансляции. Характеристики основных этапов

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

A) Лексический анализ.

B) Работа с таблицами.

C) Синтаксический анализ, или разбор.

D) Генерация кода, или трансляция в промежуточный код (например, язык ассемблера).

E) Оптимизация кода.

F) Генерация объектного кода (например, ассемблирование).

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

Характеристики основных этапов

Лексический анализ

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

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

1) Во многих языках цепочка, состоящая из одного или более пробелов, обычно рассматривается как один пробел.

2) В некоторых языках есть ключевые слова, такие, как BEGIN, END, GOTO, DO, INTEGER и т. д., каждое из которых считается одним символом.

3) Каждая цепочка, представляющая числовую константу, рассматривается как один элемент текста.

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

Работа лексического анализатора состоит в том, чтобы сгруппировать определенные терминальные символы в единые синтаксические объекты, называемые лексемами. Какие объекты считать лексемами, зависит от определения языка программирования.

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

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

DO 10 I = 1,5

и

DO 10 I = 1.5

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

Работа с таблицами

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

Такие таблицы называют таблицами имен (таблицами идентификаторов и таблицами символов). В них перечислены, в частности, все идентификаторы вместе с относящейся к ним информацией:

- их типы (простая переменная, имя массива, имя подпрограммы, формальный параметр и т.п.);

- отношение к той или иной среде ссылок;

- любая другая информация, которую можно извлечь в программе из деклараций и применений идентификаторов.

Таким образом, эти таблицы должны обеспечивать:

A) быстрое добавление новых идентификаторов и новых сведений о них,

B) быстрый поиск информации, относящейся к данному идентификатору.

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

Синтаксический анализ

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

Синтаксический анализ (разбор) — это процесс, в котором исследуется цепочка лексем и устанавливается, удовлетворяет ли она структурным условиям, явно сформулированным в определении синтаксиса языка.

Какова синтаксическая структура данной цепочки, необходимо знать при генерации кода. Например, синтаксическая структура выражения А + В * С должна отражать тот факт, что сначала перемножаются В и С, а потом результат складывается с А. При любом другом порядке операций нужное вычисление не получится.

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

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

Пример. Допустим, что выход лексического анализатора — цепочка лексем

<ид>1 = ( <ид>2 + <ид>3) * <ид>4

Эта цепочка передает информацию о том, что необходимо выполнить в точности следующее:

(1) <ид>3 прибавить к <ид>2,

(2) результат (1) умножить на <ид>4,

(3) результат (2) поместить в ячейку, зарезервированную для <ид>1

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

n3

/ | \

<ид>1 = n2

/ | \

n1 * <ид>4

/ | \

<ид>2 + <ид>3

Рисунок – Древовидная структура

Внутренние вершины дерева представляют те действия, которые надо выполнить. Прямые потомки каждой вершины либо представляют аргументы, к которым нужно применить действие (если соответствующая вершина помечена идентификатором или является внутренней), либо помогают определить, каким должно быть это действие (в частности, это делают знаки +, *, =). Скобки в цепочке в дереве явно не указаны, хотя их можно было бы изобразить в качестве прямых потомков вершины n1. Роль скобок только в том, что они влияют на порядок операций. Если бы в цепочке их не было, следовало бы поступить согласно обычному соглашению о том, что умножение «предшествует» сложению, и на первом шаге перемножить <ид>3 и <ид>4.

Генерация кода

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

Оптимизация кода

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

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

На разных стадиях процесса компиляции применяются различные приемы улучшения кода.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]