Subject: Re: Об отсечениях внутри блока
From: Sergei Romanenko (roman@integrum.ru)
Date: Mon Nov 27 2000 - 12:44:45 MSK
Привет!
Ничего не могу сказать по поводу этих предложений, поскольку мысль у меня в
этом направлении сейчас вообще никак не работает.
Дело в том, что к настоящему времени я пришел к твердому убеждению, что
backtracking (как и прочая прологовщина) - это мерзость, которая
принципиально противоречит сути функционального программирования. А суть эта
в том, что писатель программ должен думать не о "времени" и "текущем
состоянии", а о "значениях" расположенных в "пространстве". Т.е. основная
идея - замена "времени" на "пространство". Основная выгода от этого в том,
что "время" - строго одномерно, а "пространство" - многомерно, и мы можем
располагать в нем "значения" как нам самим удобно, а не как навязывает
жесткая конструкция вделанная в тот или другой язык программирования.
А всякие выверты с "откатами" - это не более чем судорожная попытка
преодолеть одномерность дерева, превратив линию в дерево. А почему,
собственно, нужно втискиваться именно в дерево? Иногда это соответствует
сути задачи, а иногда - нет...
В то же время, если использовать ленивые вычисления и функции высших
порядков, то мы сразу и очень легко воспроизводим те возможности, которые
дают "откаты", но не обязаны втискиваться в жесткие рамки перебора по
дереву. (А конкретные иллюстрации к сказанному можно, например, найти в
книге L.C.Paulson "ML for the working programmer".)
(Размышляя на эту тему, я одно время занимался тем, что переписывал разные
программы с Рефала Плюс на SML и наоборот, и сравнивал то, что получалось.)
Кстати, не следует воспринимать вышесказанное как наезд на императивные
и/или объектные средства программирования. Как раз против них я ничего
против не имею: во многих случаях (вроде ввода/вывода или доступа к базе
данных) они совершенно адекватны! Например, последовательные состояния
банковского счета строжайше упорядочены в одномерном времени, поэтому
императивный подход к ним вполне уместен.
Что касается "ленивости", то меня тоже не устраивает, когда один из ее
вариантов намертво вмонтируется в язык (как, например, в Хаскеле). При этом
подразумевается, что тот вариант ленивости, который заделан в язык -
"единственно верный" и "всепобеждающий", а творческмя свобода программиста в
этом направлении подрубается на корню.
На самом деле существует много разновидностей "ленивости" и кеширования, а
реализация Хаскеля - это типичный набор некоторых волюнтаристских решений
(которые и выдаются за "единственно верные"). Например, почему вычисленные
значения кешируются только в оперативной памяти, а не, скажем, в базе
данных? Например, если компьютер упадет, то программу нужно запускать с
самого начала (что приемлемо для академических приложений, но не
промышленных).
Вот из-за этого меня и привлек SML: он представляет собой конструктор, с
помощью которого можно легко соорудить и перебор, и ленивость, и кеширование
результатов, и еще много чего. Но при этом не надо втискиваться в какую-то
одну жесткую и "единственно истинную" парадигму. И это, с моей точки зрения,
перевешивает разные глюки и извращения, которые в нем, естественно,
имеются...
Сергей
----- Original Message -----
From: "Anton Yu. Orlov" <orlov@mccme.ru>
To: "Andrei Klimov" <Andrei.Klimov@supercompilers.com>
Cc: <refal-plus@botik.ru>; "Fedor Romanenko" <fedor@blues.ru>
Sent: Sunday, November 26, 2000 10:12 AM
Subject: Re: Об отсечениях внутри блока.
Добрый день!
Я решил привести еще одно соображение в пользу решения, высказанного в
предыдущем письме:
On Sat, 25 Nov 2000, Anton Yu. Orlov wrote:
> На мой взгляд, есть еще третий вариант, который представляется вполне
> разумным. Он состоит в том, что блок всегда характеризуется "глубиной
отсечения
> стека" равной 0, но отсекать возвраты в нем все равно можно ;-). Т.е.
после
> прохождения блока тропа оказывается на том же уровне, что и до блока,
> независимо от находящихся в нем отсечений. Иначе говоря, всякое отсечение
> действует только до конца текущего предложения (в терминах абстрактного
> синтаксиса; в терминах статьи Сергея Романенко про компиляцию в
виртуальный
> код, до конца текущего предложения или текущей тропы). Такая семантика
> совпадает с принятой, в случае, если блок - это последнее действие в
> предложении, и добавляет приятную возможность, в случае неуспеха
"выброситься"
> куда-нибудь даже из источника. И "дизайн", вроде бы, достаточно прост для
> написания/понимания программ.
Насколько я понимаю, ровно такую семантику имеют на данный момент
правые части. Т.е. если мы встретили '=', то надо очистить стек
альтернатив, однако, когда текущее предложение будет скомпилировано, надо
будет вспомнить содержимое стека до компиляции блока. Так что вполне
логично так же поступать и с отсечениями.
С уважением,
Антон.
This archive was generated by hypermail 2b25 : Mon Nov 27 2000 - 12:54:00 MSK