Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки программирования. Концепции и принципы
.pdf
Перспективные модели языка
271
1.2. Операционное программирование –
модель фон Неймана (модель Н)
Рассмотрим модель, отражающую свойства первых ЭВМ, – модель весьма прими
тивную, но способную послужить для нас точкой отсчета. Опишем ее в соответ
ствии с концептуальной схемой на стр. 40.
Базис. Два скалярных типа данных: адреса и значения. Конечный набор базис
ных скалярных операций (система команд): присваивание, условные операции,
останов и др. Единственная структура данных – кортеж ячеек (то есть пар адрес
> значение) с линейно упорядоченными адресами (память). Есть выделенная
ячейка С (регистр команд), в которой хранится адрес подлежащей выполнению
команды. Никакой явной структуры операций, каждая операция сама определяет
своего преемника (в том смысле, что модифицирует содержимое регистра
команд).
Развитие. Никаких выделенных явно средств развития – все они скрыты
в универсальности набора операций, среди которых ключевую роль играет опера
тор присваивания ячейке нового значения и зависимость выбора преемника от
состояния памяти. Любое развитие возможно только путем явного моделирова
ния новых операций за счет универсальности системы команд. Что такое значе
ние, не уточняем. Достаточно считать, что это целые и строки литер (для выделен
ных ячеек вводавывода).
Защита. Полностью отсутствует.
Исполнитель. Память – базисная структура данных (кортеж ячеек), процес
сор – устройство, последовательно выполняющее указанные в С операции, пове
дение – последовательность состояний памяти, план (программа) – исходное со
стояние (или его выделенная часть), результат – заключительное состояние (если
оно есть; при этом содержательно результатом обычно служит лишь выделенная
часть заключительного состояния).
Указанные «части» для каждой программы свои. Так что в общем случае про
грамма формально не отличается от исходных данных и результатов – одни и те
же ячейки исполнитель может интерпретировать либо как содержащие команды,
либо как содержащие данные. Все дело в том, в какой роли адреса ячеек использу
ются в исполняемых командах.
Знаки и денотаты в модели Н. Сведения о базисе можно выразить с по
мощью следующих обозначений.
Пусть А – тип данных «адрес» (то есть множество адресов в модели Н), V – тип
данных «значение» (то есть множество содержимых ячеек с адресами из А). Тогда
конкретное состояние памяти можно представить функцией s типа
S: A>V,
то есть конкретным отображением адресов в значения. Обратите внимание, мы
применяем метаязык (то есть язык для описания языков), в котором допустимы
функциональные типы, причем структура функционального типа S описана парой

272
Перспективы языков программирования
A>V,
где А – область определения (область отправления) функций этого типа, а V –
область значений (область прибытия) функций этого типа.
Итак, состояние памяти (содержательно это кортеж содержимых ячеек) представ
лено формально функцией из адресов в значения (хранящиеся по этим адресам).
Тип функции «состояние» выражает первый принцип фон Неймана – прин
цип произвольного доступа к памяти (в конкретном состоянии s из S равнодос
тупны все ячейки; задай адрес – получишь значение).
Операции (операторы) в модели Н – это объекты типа
St: S>S.
Кроме того, модель фонНеймана характеризуется функцией декодирования
операций (частично определенной)
d: V>Com,
где Com – команды, то есть операции, встроенные (элементарные, предопреде
ленные) в Н.
Второй принцип фон Неймана – принцип хранимой программы – отражается
формулой
(∀ с из Com) (∃ v из V):d(v) = с,
где ∀ обозначает «для всех», а ∃ – «существует», то есть всякую команду можно
записать в память (найдется способ ее закодировать).
Фактически здесь использованы элементы некоторого языка для описания семан
тики ЯП – семантического метаязыка. Язык для описания синтаксиса ЯП знаком
из курса программирования. Таким синтаксическим метаязыком служит, напри
мер, БНФ (форма БэкусаНаура).
Основное семантическое соотношение в модели Н (денотационная семан
тика). Каков денотат программы s в модели Н? Другими словами, какова та фун
кция, которую реализует программа s?
Рассмотрим функцию r типа St
r: S>S,
которая обозначает результат выполнения программы s, то есть r(s) – это состоя
ние s1, в котором выполняется операция остановки (stop). Оно не всегда достига
ется, то есть функция r – частично определенная, ведь не всякое состояние может
служить программой и не всякая программа завершает работу.
Так что если С – регистр команд, то
d(s1(s1(C))) = stop
(такому семантическому соотношению удовлетворяет заключительное состояние si).
Обозначим через k=d*s*s композицию функций d,s,s. Тогда основное семанти
ческое соотношение, определяющее денотат r(s) программы s в модели Н, записы
вается так:
r(s) = (если k(C)=stop, то s, иначе r(k(C)(s))).

Перспективные модели языка
Другими словами, нужно выполнить над состоянием s операцию, получающу
юся декодированием содержимого ячейки с адресом, взятым из С, и вычислить
функцию r от полученного нового состояния, пока не окажется, что нужно выпол
нить операцию stop.
Что можно извлечь из формулы для r?
Вопервых, то, что один шаг выполнения программы требует в общем случае
трех обращений к памяти (в нашей модели регистр команд – в основной памяти),
ведь переход к новому состоянию описывается как d(s(s(C)))(s).
Вовторых, становится еще очевиднее, что средства развития в модели Н не выде
лены – денотат программы разлагается лишь на очень мелкие части – денотаты от
дельных команд (выраженные, кстати, функцией k). Отсутствуют средства для явно
го обозначения композиций функции k, то есть для явного укрупнения денотатов.
Функциональная (денотационная) семантика. Пусть Р = {р} – множество
программ, R={г} – множество функций типа S>S. Функциональной, или денота
ционной, семантикой программ называют функцию типа P>R, отображающую
программу (то есть исходное состояние р) в соответствующую ей функцию r,
удовлетворяющую основному семантическому соотношению.
Название «денотационная» возникло исторически. Всякая семантика денотацион
ная в том смысле, что сопоставляет знаку (программе) некоторый ее денотат (смысл).
Обратите внимание, насколько сложной концептуально оказалась знаковая
система Н. Во всяком случае, нам потребовались функции высших порядков (то
есть функции, среди аргументов и (или) результатов которых встречаются снова
функции). Функции такого рода математики часто называют «операторами».
Действительно, посмотрите на перечень примененных функций:
s: А > V;
St: S > S;
d: V > Com;
r: S > S;
sem: P > R.
Очевидно, что и операция, отображающая состояния (функции из адресов
в значения), и декодирующая функция – функции высшего порядка, как и семан
тическая функция по отношению к функциям р и r (первая из них отображает
адреса в значения, вторая – исходное состояние в заключительное).
Примеры программ в модели Н можно найти в любом учебнике по программи
рованию.
273
1.3. Ситуационное программирование –
модель МарковаEТурчина (модель МТ)
Модель Н возникла как обобщение такого поведения, когда после предыдущего
действия ясно, какое должно быть следующим (команда сама устанавливает сле
дующую команду). Такое поведение типично для рутинных вычислений, на авто

274
матизацию которых ориентировались первые компьютеры (они были предназна
чены для расчетов, связанных с созданием атомной бомбы).
Расчеты такого рода характеризуются данными относительно простой струк
туры – программы имеют дело с числами. Вся сложность поведения исполнителя
определяется сложностью плана (то есть числом и связями указанных в нем дей
ствий). Управление последовательностью действий зависит от сравнения про
стых данных. Еще Джон фонНейман хорошо понимал, что для других классов
применений могут потребоваться компьютеры, характеризующиеся другим ти
пом поведения.
Перспективы языков программирования
1.3.1. Перевод в польскую инверсную
запись (ПОЛИЗ)
Рассмотрим, например, задачу перевода арифметической формулы в постфикс
ную форму. Другими словами, исходными данными для нашей программы долж
ны быть обычные арифметические формулы, а в результате нужно получить их
запись в ПОЛИЗе. Например:
(a+b)*(c+d) > ab + cd + *.
Данные ко всякой программе записываются на некотором языке (являются
знаками в некоторой знаковой системе). Чтобы их обработать, нужно воспользо
ваться правилами построения знаков в этой системе (синтаксисом языка) для рас
познавания структуры знака, затем семантикой знаковой системы, чтобы связать
со структурой знака его смысл (денотат), и обработать данное в соответствии с его
смыслом.
Пусть синтаксис языка формул, которые мы хотим обрабатывать, задают сле
дующие правила БНФ:
<формула>::=<сумма> | <произведение> |<первичная>;
<сумма>::=<сумма>+<произведение> | <первичная>; <произведение>::=<произведение>*<первичная> |<первичная>;
<первичная>::=<число> | <переменная> | (<формула>).
Числа и переменные точно определять не будем, оставляя представление о них
на интуитивном уровне (23 и 305 – числа; х, у, а, b, АЛЬФА – переменные).
Тогда 23 – формула (первичная, произведение, сумма), а+b*23 – также форму
ла (сумма), (а+b)*23 – также формула (произведение); (а+*b) – не формула.
Семантика формул – общепринятая. Смыслом (денотатом) формулы будем
считать число, получающееся из чисел, входящих в формулу, применением ука
занных операций в общепринятом порядке. Задача состоит в том, чтобы получить
перевод в ПОЛИЗ, сохраняющий денотат (то есть в данном случае – над теми же
числами нужно выполнить те же операции и в том же порядке).
Другими словами, было бы идеально, если бы вся программа записывалась
фразой примерно такого вида:
перевод(<формула 1><операция><формула2>) =
перевод(<формула 1 >)

Перспективные модели языка
перевод(<формула2>)
<операция>
Две ключевые абстракции – анализ и синтез. Можно заметить, что перевод
текста с языка формул четко распадается на действия двух сортов – на распозна
вание компонент структуры исходной формулы и на компоновку ее образа в ПО
ЛИЗе из результатов перевода выделенных компонент. Когда действия этих сор
тов переплетены некоторым нерегулярным способом, то планировать, понимать,
выполнять и проверять сложно. Чтобы уменьшить сложность, полезно выделить
две ключевые абстракции (два понятия): анализ исходной структуры и синтез ре
зультирующей структуры, – и предложить знаковую систему для их взаимосвя
занной конкретизации в рамках единой программы.
Модель Маркова. Тут уместно вспомнить язык нормальных алгоритмов Мар
кова (для единообразия назовем этот язык моделью Маркова).
Охарактеризуем эту модель с точки зрения нашей концептуальной схемы.
Базис: единственный скалярный тип данных – литера; единственная базисная
операция – поискподстановка; единственная структура данных – строка (текст);
единственная структура операций – цикл по подстановкам.
Развитие: явных средств нет. Только моделированием.
Дальнейший анализ модели можно предложить в качестве упражнения.
В модели Маркова анализ структуры встроен в исполнитель и управляется
левой частью подстановки. Синтез структуры отделен от анализа – он управляет
ся правой частью подстановки. Исполнитель распознает тривиальную структуру
(слово), указанную слева, и заменяет ее столь же тривиальной структурой (сло
вом), указанной справа.
С точки зрения нашей задачи модель Маркова недостаточно развита. Дело
в том, что вид распознаваемых структур слишком тривиален. Хотелось бы при
близить средства описания вида структур, например, к БНФ. Шаги в нужном
направлении сделаны в языке, созданном В. Ф. Турчиным в ИПМ АН СССР
в 1966–1968 гг. и названном им «Рефал» (рекурсивных функций алгоритмиче
ский язык). В основу Рефала положены три модификации модели Маркова.
275
1.3.2. Модификации модели Маркова
(введение в Рефал)
Изложим модель языка Рефал, особенно интересного с точки зрения нашей кон
цептуальной схемы потому, что он был задуман и реально используется как сред
ство для эффективного определения других языков (другими словами, как базо
вый ЯП).
Первая модификация состоит в том, что в качестве (попрежнему единствен
ной) базисной структуры данных вместо произвольной строки (слова) использу
ется «выражение» – строка, сбалансированная по скобкам.
Вторая модификация касается подстановки. Ее левая часть должна быть так
называемым функциональным термом с возможными переменными. Правая

276
часть должна быть выражением, в котором можно использовать переменные из
левой части подстановки (и только их).
Третья модификация касается поиска применимой подстановки. В отличие от
модели Маркова, где заранее не фиксируется заменяемая часть обрабатываемого
слова, в Рефале заменяемая часть обрабатываемого выражения фиксируется пе
ред поиском применимой подстановки – это всегда так называемый ведущий
функциональный терм.
Применимой считается подстановка с минимальным номером, левая часть ко
торой согласуется с ведущим термом. Иными словами, применима подстановка
с такой левой частью, где указан общий вид структуры (образец), частным случа
ем которого оказался ведущий терм.
Займемся теперь каждой из модификаций подробнее. Нам нужно уточнить
смысл слов «выражение», «ведущий функциональный терм», «переменная» и
«согласуется». Рассматриваемую модель ЯП назовем моделью МарковаТурчина
(моделью МТ).
Строение выражений; поле зрения. Выделены три типа скобок – символьные
(открывающая ‘ и закрывающая ’ кавычки), структурные (обычные круглые скоб
ки) и функциональные (мы будем использовать фигурные скобки «{« и «}»).
Выражением называется всякая последовательность литер, сбалансированная
по всем трем типам скобок; термом – выражение в скобках либо совсем без ско
бок; символом – отдельная литера либо последовательность литер в символьных
скобках.
Например:
(а+b) – выражение – структурный терм;
{а+b (с 'АЛЬФА')} – выражение – функциональный терм;
'АЛЬФА' – символ, терм, выражение;
}ab{ – не выражение.
По существу, выражение – это линейное представление дерева – структура
этого вида часто используется в программировании именно потому, что наглядно
воплощает идею иерархии, частичного порядка, пошаговой (последовательной)
декомпозиции.
Дерево – это ориентированный граф (орграф) без циклов, в котором выделена
вершина, называемая корнем дерева, и в каждую вершину, кроме корня, входит
ровно одна дуга, причем из корня доступны все вершины. В дереве легко вводятся
уровни иерархии (по длине пути из корня).
Так, выражение {а+b(с 'АЛЬФА' )} может быть представлено деревом вида
{} 0й уровень
/ \
а + b ( ) 1й уровень
/\
с ‘ ’ 2й уровень
/\
АЛЬФА 3й уровень
Перспективы языков программирования

Перспективные модели языка
277
Ведущим (функциональным) термом называется самый левый функциональ
ный терм, не содержащий других функциональных термов. В примерах ведущие
термы выделены:
(a+b{c+d});
{ АЛЬФА (a*b)}{cd}xl0
(100 DO 3 {I={1}(,3)}).
Таким образом, мы полностью описали допустимую структуру поля зрения
МТисполнителя (МТмашины). В этом поле помещается обрабатываемый
объект, который может быть только выражением. В качестве очередной заменяе
мой части всегда выбирается ведущий терм. Если такового нет, то делать испол
нителю нечего, и он останавливается.
Выражение, оставшееся в поле зрения, считается результатом выполнения
программы, находящейся в поле определений исполнителя.
В авторской терминологии это поле называется «поле памяти». Так говорить нам
неудобно. В модели Н и программа, и данные находились в памяти. Естественно
считать, что поле зрения МТмашины – также часть памяти. Термин «поле опреде
лений» лучше отражает суть дела.
Поле определений; МТпредложения. Мы изучаем модели ЯП. Поэтому бу
дем позволять себе «вариации на тему» рассматриваемого языкапрототипа, ког
да такие вариации упрощают рассмотрение. Например, говоря о МТпредложени
ях, мы не будем строго следовать их авторской трактовке.
В модели Маркова средства описания правил анализа и синтеза бедны – мож
но лишь явно выписывать заменяемое и заменяющее подслова (левую и правую
части марковской формулы соответственно).
Основная идея обобщения марковской формулы состоит в том, чтобы за счет
введения локальных переменных наглядно изображать одной (обобщенной) фор
мулой сразу целый класс подстановок (применимых к функциональным термам
определенной структуры).
Ключевыми понятиями при этом служат интерпретация переменных и согла
сование (терма с обобщенной подстановкой при определенной интерпретации ее
переменных).
Интерпретация переменных – это функция типа I:N>N, где N – множество
обозначений переменных. V – множество их допустимых значений.
Интерпретация напоминает состояние в модели Н. Только вместо адресов – обоз
начения переменных. Это, по сути, одно и то же. Но называем мы их поразному,
так как они играют разные роли. Состояние в модели Н – глобальный объект,
сохраняющийся между последовательными операциями, а интерпретация в моде
ли МТ – локальный объект, действующий внутри операции подстановки.
При конкретной интерпретации переменных обобщенная подстановка (в Ре
фале ее называют предложением, или Рефалпредложением) изображает конк
ретную марковскую формулу подстановки.

278
Например, предложение
{10 е 00 s 1} > s 101 е,
где e и s– (локальные) переменные, при интерпретации
i1={e>00, s>11)
(здесь фигурные скобки – обозначение множества пар, составляющих интерпре
тацию) изображает марковскую формулу
{100000111}>1110100,
а при интерпретации
i2={e>ABC,s>D} –
марковскую формулу
{10ABC00D1}>D101ABC.
Соответственно, левая часть предложения изображает левую часть марковс
кой формулы, а правая часть предложения – правую часть формулы.
Согласование – это тройка (t,i,s), где t – ведущий терм, s – предложение и i –
такая интерпретация, при которой левая часть s изображает t.
Итак, за счет различных интерпретаций переменных одна обобщенная марков
ская подстановка (предложение) способна изображать целый класс марковских
подстановок (что и требовалось).
Однако этот класс не должен быть слишком широким. Ведь каждое предложе
ние должно быть приспособлено для наглядного изображения вполне определен
ного содержательного преобразования поля зрения. Поэтому следует принять
меры к тому, чтобы, вопервых, изображаемые подстановки не нарушали структу
ру поля зрения и, вовторых, чтобы можно было управлять допустимыми значе
ниями переменных (другими словами, управлять их типом).
Наконец, втретьих, необходимо установить такие правила согласования пред
ложения с ведущим термом, чтобы анализ и синтез были однозначными. Так что
правила согласования должны обеспечивать единственность подразумеваемой
программистом согласующей интерпретации (при фиксированном поле зрения).
Первое и второе достигаются за счет ограничений на класс допустимых интер
претаций, третье – за счет ограничений на класс допустимых согласований.
Допустимые интерпретации должны удовлетворять двум условиям:
• значения переменных, а также обе части изображаемой подстановки долж
ны быть выражениями (так что МТпреобразования не выводят за класс
выражений);
• значение переменной должно соответствовать спецификатору, который
указывается непосредственно после обозначения переменной и отделяется
двоеточием «:».
Понятие спецификатора связано с еще одним (в некотором смысле орто
гональным) направлением обобщения марковской формулы подстановки. Это
направление мы оставим открытым и будем использовать пока только очень про
стые спецификаторы. Именно в качестве спецификатора можно написать «сим
Перспективы языков программирования

Перспективные модели языка
вол» или «терм» (это значит, что значениями переменной могут быть только сим
волы (только термы)) или в круглых скобках можно явно перечислить допусти
мые значения переменной. Например,
рой могут быть только символы, t:терм – только термы, s:(+I) – значениями s
могут быть только литеры «+» или «–».
Ограничения на согласования состоят в том, что допустимыми считаются
только так называемые ориентированные согласования. Они бывают левыми или
правыми.
Определим левое (левоориентированное) согласование. Правое определя
ется по симметричным правилам.
Будем называть переменную y1 в функциональном терме левой для перемен
ной у2, если самое левое вхождение y1 расположено левее самого левого вхожде
ния переменной у2.
Будем говорить, что согласование (t,i’,s) короче согласования (t,i,s), если в t
найдется переменная y1, для которой i’(y1) короче i(y1), причем для любой пере
менной z, левой для y1 в терме t, i’(z) совпадает с i(z).
Согласование (t,i,s) называется левым, если оно самое короткое из возможных
согласований t и s.
Таким образом, основная идея левого согласования – левые переменные при
поиске согласующей интерпретации удлиняются в последнюю очередь.
По умолчанию предполагается, что допустимы только левые согласования.
Допустимость только правых согласований указывается буквой R после закрыва
ющей функциональной скобки в левой части предложения.
Например, предложение
{e1+e2}>{e1}{e2}+
согласуется с термом {a+b+c+d} интерпретацией
{e1>a, e2>b+c+d}
и изображает формулу подстановки
{a+b+c+d} > {a}{b+c+d}+,
а предложение
{e1+e2}R > {e1}{e2}+
согласуется с тем же термом интерпретацией
{e1>a+b+c, e2>d}
и изображает формулу подстановки
{a+b+c+d} > {a+b+c}{d}+.
В Рефале принимаются меры к тому, чтобы всегда можно было отличить пе
ременные от постоянных частей предложения. Если есть опасность спутать пере
менную и постоянную, то постоянную будем выделять.
Подводя итог, можно сказать, что идея подстановки работает в Рефале три раза:
1) интерпретация i определяет подстановку значений переменных вместо их
обозначений;
S: СИМВОЛ – переменная, значениями кото
279

280
2) тем самым она определяет соответствие обобщенной и конкретной марковс
ких подстановок (то есть «подстановку» конкретной подстановки вместо
обобщенной);
3) правая часть этой конкретной подстановки заменяет ведущий терм.
При этом подбор согласующей интерпретации есть, по существу, анализ веду
щего терма, а порождение конкретной правой части подстановки при найденной
интерпретации – синтез заменяющего выражения (в правой части всегда должно
быть правильное выражение – это еще одно требование Рефала). В этом смысле
левая часть предложения служит образцом структуры ведущего терма (терм и
предложение согласуются, если структура терма соответствует образцу), а пра
вая – образцом для синтезируемого заменяющего выражения.
Упражнение. Покажите, что если ведущий терм согласуется с некоторым предло
жением, то соответствующее согласование единственно.
Подсказка. Оно либо левое, либо правое.
Перспективы языков программирования
1.3.3. Исполнитель (МТ'машина)
Теперь легко объяснить, как действует исполнитель, имея в поле зрения обраба
тываемое выражение, а в поле определений – программу (то есть кортеж предло
жений). Он выполняет следующий цикл:
1) выделяет ведущий терм. Если такового нет, останавливается. Выражение
в поле зрения считается результатом;
2) ищет первое по порядку предложение, которое согласуется с ведущим тер
мом. Соответствующее согласование всегда единственно. Значит, един
ственна и изображаемая при соответствующей интерпретации переменных
марковская подстановка. Она и применяется к ведущему терму. И цикл на
чинается сначала с обновленным полем зрения.
Если нет согласующихся с ведущим термом предложений, то исполнитель ос
танавливается с диагностикой «согласование невозможно».
1.3.4. Программирование в модели МТ
Задачу перевода в ПОЛИЗ (с учетом старшинства операций) решает следующая
программа:
{e1+e2}R > {e1}{e2}+
{e1*e2}R > {e1}{e2}*
{(e)} > {e}
{e} > e
Упражнение 1. Доказать, что это правильная программа.
Обратите внимание, действиями исполнителя полностью управляет структура об
рабатываемых данных.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
