Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
161
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

2. Введение в компиляцию

2.1. Задание языков программирования

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

А=В*С,

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

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

Другая проблема - проблема задания самого языка. Задавая язык программирования, как минимум необходимо определить:

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

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

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

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

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

L:GOTO L

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

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

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

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

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

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

где x – программа на походном языке,

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

Предполагается, что мы заранее знаем это множество, и наша главная забота – построить эффективное устройство, которое по данному входу x выдает выход y. Мы будем называть это множество пар (x, y) переводом. Если x – цепочка в алфавите , а y – цепочка в алфавите , то перевод - это просто отображение множества **.