Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

34

2 ВВЕДЕНИЕ В КОМПИЛЯЦИЮ

2.1 ЗАДАНИЕ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

Операции машинного языка вычислительной машины значительно бо-

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

ды которого приближаются к типу операций, встречающихся в приложениях

[1]. Например, если выполняются матричные операции, то для выражения то-

го обстоятельства, что матрица A получается перемножением матриц B и C,

удобнее написать команду вида

A = B*C,

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

Языки программирования могут существенно облегчить, упростить ал-

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

Другая проблема – проблема задания самого языка. Задавая язык про-

граммирования, как минимум, необходимо определить:

1)множество символов, которые можно использовать для написания правильных программ;

2)множество правильных программ;

3)«смысл» правильной программы.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Первая проблема решается довольно легко. Определить множество правильных программ – это искусство.

35

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Для многих языков программирования конструкция

L: GOTO L

правильная с точки зрения языка.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

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

ния, связывающего с каждой правильной программой предложение в языке,

смысл которого мы понимаем. Тогда можно определить смысл программы,

записанной на любом языке программирования, в терминах эквивалентной

«программы» в функциональном исчислении (под эквивалентной програм-

мой понимается программа, выполняющая те же самые функции).

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

ствиях, к которым она побуждает эту машину после того, как та начинает ра-

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

Третий подход – вообще игнорировать вопросы о «смысле», оставив его на совести разработчика программы. Этот подход и применяется при по-

строении компиляторов. То есть для нас «смысл» исходной программы со-

стоит просто в выходе компилятора, когда он применяется к этой программе.

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

жество пар (x, y), где x – программа на исходном языке, y – программа в том языке, на который нужно перевести x.

Предполагается, что мы заранее знаем это множество, и наша главная забота – построить эффективное устройство, которое по данному входу x вы-

36

дает выход y. Мы будем называть это множество пар (x, y) переводом. Если x

– цепочка в алфавите Σ, а y – цепочка в алфавите Δ, то перевод – это просто отображение множества Σ*→Δ*.

2.2 СИНТАКСИС И СЕМАНТИКА

Перевод обычно рассматривают как композицию двух более простых

отображений – синтаксического и семантического.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Синтаксическое отображение связывает с каждым вхо-

дом (программой на исходном языке) некоторую структуру, ко-

торая служит аргументом семантического отображения.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Почти всегда структурой любой программы является помеченное дере-

во. Поэтому сущность алгоритмов перевода обычно сводится к построению подходящих деревьев для входных программ [3].

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

В качестве примера того, как для цепочек строятся эти деревья, рас-

смотрим разбиение английского предложения на синтаксические категории

(рис. 2.1):

The pig is in the pen.

Неконцевые вершины этого дерева помечены синтаксическими катего-

риями, а концевые (листья) помечены концевыми, или терминальными, сим-

волами, в данном случае – английскими словами.

37

<предложение>

<именная группа>

<группа сказуемых>

<определение> <определяемое><глагол> <группа>

<предлог> <именная группа>

the

pig

is

<определение><определяемое> in

the pen

Рисунок 2.1 – Древовидная структура английского предложения

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Аналогично, можно программу, написанную на языке программирова-

ния, расчленить на синтаксические компоненты в соответствии с синтаксиче-

скими правилами, управляющими этим языком.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Дерево для цепочки a+b*c приведено на рис. 2.2.

 

38

 

 

<выражение>

 

 

<терм>

+

<терм>

 

<слагаемое>

<слагаемое>

<идентификатор>

<выражение>

a

<терм>

*

<терм>

 

 

 

 

<множитель>

 

<множитель>

 

<идентификатор>

<идентификатор>

 

b

 

c

Рисунок 2.2 – Дерево арифметического выражения

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Процесс нахождения синтаксической структуры данного предложения называется синтаксическим анализом или син-

таксическим разбором.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Синтаксический разбор позволяет понять взаимоотношения между раз-

личными частями предложения. Термином «синтаксис» языка будем назы-

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

ветствует категории «предложение». Естественно, нам нужно более строгое определение синтаксиса. Что и будет сделано позднее.