Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Языки программирования. Концепции и принципы

.pdf
Скачиваний:
2
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Перспективные модели языка
Упражнение 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. Модель МТ с точки зрения концептуальной схемы
Базис: скалярные данные – только литеры, скалярные операции – только обоб щенная поискподстановка. Структурные данные – только выражения (есть под типы: символ и терм), структурные операции – встроенный цикл, легко приводя щий к комбинациям функций.
Говорят, что функции комбинируются горизонтально, если их результаты являют ся непосредственными составляющими одного функционального терма. Говорят, что функции комбинируются вертикально, если одна из них не может быть вычислена до завершения вычисления другой. В такой комбинации первая называется внешней, а вторая – внутренней. В модели МТ применяются и горизонтальная, и вертикальная комбинации функ ций. Горизонтальная комбинация называется также конструкцией, а вертикаль ная, при которой результат внутренней служит полным аргументом внешней, – композицией; произвольная комбинация – суперпозицией.
Развитие: вверх – только функции типа Е > Е (однако за счет структуриро ванности выражений это весьма мощное средство развития (как будет показано)); вниз – средств нет.
Защита: в базисе средств нет.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]