Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки программирования. Концепции и принципы
.pdf
Перспективные модели языка
Упражнение 2. Можно ли эту программу написать короче? Например, так:
{e1 s:(+I*) e2}R > {e1}{e2}S
{(е)} > {e}
{e} > e
Упражнение 3. Можно ли здесь отказаться от правого согласования?
Упражнение 4. Напишите программу аналитического дифференцирования много
членов по переменной «х».
281
1.3.5. Основное семантическое
соотношение в модели МТ
Рассмотрим функцию sem, реализуемую МТпрограммой р. Ее тип, очевидно:
sem:P х Е > Е,
где Р – программы, Е – выражения.
Уже тип функции sem указывает на принципиальное отличие от модели Н – про
грамма не меняется. В модели Н программа – часть (изменяемого) состояния.
Пусть ft – функция, выделяющая в выражении ведущий функциональный
терм, l и r – функции, выделяющие соответственно левую и правую части выраже
ния, оставшиеся после удаления ведущего терма. Конкатенацию (соединение)
строк литер будем обозначать точкой «.». Удобно считать, что если ведущего тер
ма в выражении е нет, то ft = <>, r(е) = е, где <> обозначает пустое слово. Все эти
три функции типа Е > W, где W – тип «слов» (произвольных последовательно
стей литер), так как результаты могут и не быть выражениями.
Пусть далее step – функция типа
Р х Т’ > Е,
где Т’ = Т U {<>}. Она реализуется одним шагом работы МТмашины – отобража
ет пару (программа, ведущий терм или пусто) в выражение, получающееся из это
го терма применением соответствующей МТподстановки. Функция step, ес
тественно, частичная – она не определена, если согласование с р невозможно;
step(p,<>) = <> по определению.
Учтем, что р не меняется и вся зависимость sem от р скрыта в функции step.
Поэтому позволим себе для краткости явно не указывать р среди аргументов функ
ций sem и step. Тогда можно выписать следующее соотношение для sem:
sem(e) = sem(l(e).step(ft(e)).r(e)).
Если обозначить l(e), r(е) и ft(e) соответственно через l, r и f, то получим более
выразительное соотношение:
(a) sem(l.ft.r) = sem(l.step(ft).r).
Покажем, что на самом деле справедливо следующее основное соотношение
(b) sem(l.ft.r) = sem(l.sem(ft).r).

282
Перспективы языков программирования
Действительно, если step(ft) не содержит функциональных термов, то
sem (ft) = step(ft)
и (b) следует из (а).
Если же step (ft) содержит функциональные термы, то так как l таких термов
не содержит, все функциональные термы из step (ft) будут заменены раньше, чем
изменится l или r. Но последовательные замены термов в step (ft) – это и есть
вычисление sem(ft).
Если такое вычисление завершается и между l и r не остается функциональных
термов, то вычисление sem от исходного выражения будет нормально продолже
но с выражения l.sem (ft).r.
Если же sem(ft) вычислить не удается изза отсутствия согласования, то на
этом же месте окажется невозможным согласование и для исходного выражения.
Тем самым равенство доказано.
В соотношении (b) зафиксированы следующие свойства МТсемантики:
1. Результат применения программы к ведущему терму не зависит от его кон
текста, а значит, и от истории применения программы к исходному выра
жению.
2. «Область изменения» в выражении е до полного вычисления его ведущего
терма ограничена этим термом.
3. Если l и r не содержат функциональных скобок, они никогда не могут быть
изменены.
Аналогичными рассуждениями можно обобщить соотношение (а). Обозначим
через ft1,...,ftn последовательные терминальные функциональные термы в е (то
есть не содержащие других функциональных термов), а через r0,...,rn – слова, не
содержащие функциональных термов и такие, что
е = r0.ft1.,...,.ftn.rn.
Тогда справедливо следующее соотношение:
(с) sem(r0.ft1.,...,.ftn) –
sem (r0.sem (ft 1).,...,.sem (ftn).rn).
Упражнение. Докажите справедливость этого соотношения.
Не забудьте, что участок
r0.sem(ft1).,…,.sem(ftn).rn
может содержать функциональные термы.
Отметим также очевидное соотношение
sem(sem(е)) = sem(e).
Таким образом, обработка в модели МТ обладает четкой иерархической струк
турой. Другими словами, выполнение программы р над выражением е можно
представлять себе как «вычисление» этого выражения, начиная с любого из «тер
минальных функциональных поддеревьев» соответствующего дерева.

Перспективные модели языка
283
1.3.6. Пример вычисления в модели МТ
Сопоставим вычисление по школьным правилам выражения (10+2)* (3+5) с обра
боткой в модели МТ выражения {10+2} {3+5}* по программе перевода в ПОЛИЗ.
Изобразим последовательно получаемые деревья, соответствующие обрабатывае
мым выражениям (слева – для школьной арифметики, справа – для модели МТ).
Шаг 1 (исходные деревья)
* . . *
| | |
| | | |
10+2 3+5 {10+2} {3+5}
Деревья явно похожи (вершины изображают операции, дуги – отсылки к тем
операндам, которые еще следует вычислить).
Шаг 2 (применение одной из операций, для которых готовы операнды)
12 * . . . + . *
| | | |
| | | |
3+5 {10} {2} {3+5}
Видно, что дерево справа «отстает» от дерева слева. Сказывается различие ре
зультатов функций step и sem. Последим за правым деревом до завершения вы
числения функции sem ({10+2}).
Шаг 2.1
10 . + . *
||
||
{2} {3+5}
Шаг 2.2
10 2 + . *
|
|
{3+5}
Шаг 2.3
12 . *
|
|
{3+5}
Вот теперь деревья снова похожи!

284
Перспективы языков программирования
Слово «вычисление» означает здесь процесс, вполне аналогичный вычисле
нию значения обычного школьного алгебраического выражения после подстанов
ки вместо переменных их значений. Однако аналогия касается не типа допусти
мых значений (в школьной алгебре – числа, а здесь – сбалансированные по скобкам
тексты), а способа планирования обработки (способа программирования).
И в школьной алгебре, и в модели МТ план обработки в определенном смысле
содержится в обрабатываемом (вычисляемом) выражении. Роль исполнителя со
стоит в том, чтобы выполнять указанные операции над допустимыми операндами,
подставляя результат операций в обрабатываемое выражение на место вычислен
ного терма.
Существенные отличия состоят в том, что, вопервых, школьные операции счита
ются заранее известными, предопределенными, а смысл единственной МТопера
ции step задается полем определений; вовторых, результат школьных операций –
всегда окончательный (новых операций в нем не содержится – это число), а резуль
тат операции step – в общем случае «промежуточный»; им может оказаться выраже
ние с новыми функциональными термами. Заметим, что второе отличие исчезает,
если от функции step перейти к функции sem – ее результат всегда «окончатель
ный», ведь (sem(sem(е))=sem(e)).
Шаг 3
12 * 8 10 2 + . . + *
||
||
{3} {5}
Шаг 3.1
12 * 8 10 2 + 3 . + *
|
|
{5}
Шаг 3.2
12 * 8 10 2 + 3 5 + *
Шаг 4
96 10 2 + 3 5 + *
(нет функциональных термов)
Итак, мы убедились, что МТвычисления очень похожи на вычисления обыч
ных арифметических формул.
Несколько замечаний. Вычисления по формулам очень поучительны для про
граммистов. Из этого древнейшего способа планирования вычислений можно из
влечь много полезных идей.
Вопервых, это четкая структура вычислений – она, как мы видели, древо
видная.

Перспективные модели языка
Вовторых, операнды рядом с операциями (их не нужно доставать из общей
памяти).
Втретьих, результат не зависит от допустимого изменения порядка действий
(с сохранением иерархии в соответствии с деревом выражения). Отсюда – путь
к параллельному вычислению, если позволяют вычислительные ресурсы (когда
есть несколько процессоров).
Вчетвертых, принцип синхронизации таких вычислений прост – всякая
операция должна ждать завершения вычислений своих операндов (ничто дру
гое на ее выполнение не влияет). На этом принципе основаны так называемые
конвейерные вычисления и вычисления, «управляемые потоком данных» (data
flow).
Впятых, результаты операций никуда не нужно посылать – они нужны там,
где получены.
Наконец, отметим еще одну идею, в последние годы привлекающую внимание
исследователей, стремящихся сделать программирование надежным, доказатель
ным, систематическим. Речь идет о том, что над школьными формулами можно
выполнять систематические преобразования (упрощать, приводить подобные чле
ны, явно выражать неизвестные в соотношениях и т. п.). Есть надежда определить
практичную алгебру преобразований и над хорошо организованными программа
ми. Это позволит систематически выводить программы, проверять их свойства,
оптимизировать и т. п.
Обратите внимание, значение функции sem не зависит от порядка вычисления
терминальных функциональных термов. А в нашем исходном определении моде
ли МТ требовалось, чтобы всегда выбирался самый левый из всех таких термов.
При отсутствии взаимного влияния непересекающихся термов это требование
несущественно. В реальном Рефале указанное влияние возможно.
285
1.3.7. Аппликативное программирование
Модель МТ относится к широкому классу аппликативных моделей вычислений.
Это название (от слова apply – применять) связано с тем, что в некотором смысле
единственной операцией в таких моделях оказывается операция применения
функции к ее аргументу, причем единственной формой влияния одного примене
ния на другое служит связь по результатам (суперпозиция функций). В частно
сти, функции не имеют побочного эффекта.
Напомним, что побочным эффектом функции называется ее влияние на глобаль
ные объекты, не являющиеся аргументами; в модели МТ переменные локальны в
предложениях, а отсутствие побочного эффекта на поле зрения мы уже обсуждали.
Аппликативные модели привлекательны тем, что сохраняют многие полезные
свойства вычислений по формулам. Самое важное из них – простая и ясная струк
тура программы, четко отражающая требования к порядку вычислений и связям
компонент. Вместе с тем по своей алгоритмической мощности аппликативные мо
дели не уступают другим моделям вычислений.

286
Задача. Доказать, что модель МТ алгоритмически полна, то есть для всякого нор
мального алгоритма А найдется эквивалентная ему МТпрограмма (допускается
заменять алфавит, в котором работает А).
Пока наша модель МТ бедна в том отношении, что ко всем термам применяет
ся одна и та же функция step. Это плохо и потому, что программу трудно пони
мать (особенно если она длинная), и потому, что она будет медленно работать,
если каждый раз просматривать все предложения поля определений. К счастью,
модель МТ легко приспособить к более гибкому стилю аппликативного
программирования.
Перспективы языков программирования
1.3.8. Структуризация поля определений.
МТ'функции
Допустим, что имеется неограниченный набор различных функциональных ско
бок (как это можно обеспечить?). Будем группировать предложения, записывая
подряд друг за другом такие предложения, левая часть которых заключена в оди
наковые функциональные скобки.
Тогда ведущий терм будет однозначно указывать на соответствующую группу
предложений (в ней и только в ней достаточно искать согласование).
В этом случае функция step распадается на отдельные функции, а программа –
на определения этих функций (за что соответствующее поле, где помещается МТ
программа, мы и назвали полем определений).
Достаточно различать только левые функциональные скобки (почему?).
Будем считать левой функциональной скобкой название (идентификатор)
функции вместе с непосредственно следующей за ним открывающей фигурной
скобкой.
Например, программу перевода в ПОЛИЗ запишем так:
перевод{е1+е2}R -> перевод{е1} перевод{е2} +
перевод{е1*е2}R -> перевод{е1} перевод{е2} *
перевод{(е)} -> перевод{е}
переводе{е} -> е.
Эту совокупность подстановок естественно считать определением МТфунк
ции «перевод». Его удобно использовать в большой программе среди других по
добных определений.
Поле зрения с исходными данными для перевода может иметь при этом вид
перевод {(a+b) * (c+d)}.
Так что и запись самой программы в модели МТ, и обращение к ней весьма
напоминают то, что мы выбрали в качестве идеала в самом начале разговора об
анализе и синтезе.
Недостаточна, правда, выразительная сила применяемых в нашей модели образ
цов. Поэтому приходится писать подробнее, чем в БНФ.

Перспективные модели языка
287
До сих пор поле определений рассматривалось как определение одной функ
ции. Это была либо функция step, если результат считался полученным после од
ного применения подстановки, либо (в общем случае рекурсивная) функция sem,
если результатом признавалось только выражение без функциональных термов.
Когда поле определений разбито на группы подстановок с одинаковыми левыми
функциональными скобками, каждую такую группу естественно считать опреде
лением отдельной функции. С точки зрения одного шага МТмашины, это функ
ция, представляющая собой сужение функции step на ведущие термы с конкрет
ной функциональной скобкой. С технологической точки зрения (с точки зрения
программиста), это рекурсивная МТфункция, представляющая собой сужение
функции sem на те же термы.
Замечание. Применение МТфункций предполагает уже некоторый элемент про
гнозирования со стороны программиста и контроля со стороны МТмашины, от
сутствовавший в исходной модели.
Употребляя конкретную функциональную скобку в правой части предложения,
программист прогнозирует, что при определенном поведении исполнителя (если
будет выбрано именно это предложение) потребуется определение соответствую
щей функции.
МТмашина, со своей стороны, получает возможность просмотреть поле определе
ний и проверить, что в нем присутствуют определения всех использованных МТ
функций. Другими словами, становится возможным статический контроль про
грамм (то есть контроль программ до их выполнения, без учета исходных данных).
Итак, мы можем определять в программе столько рекурсивных функций,
сколько нужно.
Вот, например, как выглядит программа аналитического дифференцирования,
в которой используется частная производная по х и частная производная по у:
Dx{e1+e2}R -> Dx{e1} + Dx{e2}
Dx{e1*e2}R -> e1*(Dx{e2}) + e2*{Dx{e1})
Dx{(e)} -> Dx{e}
Dx{'x'} -> 1
Dx{s: символ} -> 0
Dy{el+e2}R -> Dy{el} + Dy{e2}
......
......
Dy{'y'} ->1
Dy{s: символ} -> 0
Задача. Можно ли объединить эти функции? Как это сделать?


Глава 2
Функциональное
программирование
(модель Б)
2.1. Функциональное
программирование
в модели МТ .................................. 290
2.2. Функциональное
программирование в стиле
Бэкуса (модель Б) .......................... 299

290
Перспективы языков программирования
2.1. Функциональное
программирование в модели МТ
В соответствии с определением А. П. Ершова функциональное программирова
ние – это способ составления программ, в которых единственным действием яв
ляется вызов (применение) функции, единственным способом расчленения про
грамм на части – введение имени для функции и задание для него выражения,
вычисляющего значение этой функции, единственным правилом композиции
(структурой операций) служит суперпозиция функций.
Ясно, что модель МТ с учетом последней «функциональной» модификации
позволяет программировать в строго функциональном стиле. Другими словами,
это одна из моделей функционального программирования.
Таким образом, одно из отличий «функционального» программирования от «апп
ликативного» – возможность явно определять (в общем случае рекурсивные)
функции.
Дополнительные примеры программирования в «функциональном стиле» мы
приведем чуть позже, а пока дадим краткий обзор «функциональной» модели МТ
с точки зрения нашей концептуальной схемы.
2.1.1. Модель МТ с точки зрения
концептуальной схемы
Базис: скалярные данные – только литеры, скалярные операции – только обоб
щенная поискподстановка. Структурные данные – только выражения (есть под
типы: символ и терм), структурные операции – встроенный цикл, легко приводя
щий к комбинациям функций.
Говорят, что функции комбинируются горизонтально, если их результаты являют
ся непосредственными составляющими одного функционального терма.
Говорят, что функции комбинируются вертикально, если одна из них не может
быть вычислена до завершения вычисления другой. В такой комбинации первая
называется внешней, а вторая – внутренней.
В модели МТ применяются и горизонтальная, и вертикальная комбинации функ
ций. Горизонтальная комбинация называется также конструкцией, а вертикаль
ная, при которой результат внутренней служит полным аргументом внешней, –
композицией; произвольная комбинация – суперпозицией.
Развитие: вверх – только функции типа Е > Е (однако за счет структуриро
ванности выражений это весьма мощное средство развития (как будет показано));
вниз – средств нет.
Защита: в базисе средств нет.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
