императивность vs декларативность

Jul 22, 2007 11:24

В программировании существует два принципиальных подхода, на которых строятся бесчисленные техники: императивный подход и декларативный подходПри чисто-императивном подходе программа, которую нужно исполнить, полностью содержит в себе граф переходов по самой себе. Можно сказать, что для императивной программы не существует внешних по отношению к ( Read more... )

какой я умный, hermetics, genetics, управление

Leave a comment

Comments 9

repolainen July 22 2007, 21:45:09 UTC
Функциональный стиль тогда это уже совершенный аутизм

Reply

jayrandom July 22 2007, 23:20:56 UTC
Функциональный - это как раз один из видов декларативного. То есть весьма и весьма интерактивный.

Reply

repolainen July 23 2007, 09:41:11 UTC
Хм
Тут, конечно, смотря что писать, но в общем, функциональная программа стремится инкапсулировать весь необходимый контекст, и до окончания вычисления никуда не обращаться. Другое дело что такие куски бывают небольшими и подвешены на события - но это уже вопрос организации программы в целом.
В общем получается что декларативность/императивность и интерактивность/неинтерактивность вполне ортогональны.

Reply

jayrandom July 23 2007, 13:05:09 UTC
"Классическая" функциональная программа - это набор функций, вызывающих друг дружку. Всякие циклы и прочие привнесённые императивные штуки будем считать происходящими от лукавого. Таким образом всё, что остаётся для организации течения времени, - это прямая или косвенная рекурсия. А каждый рекурсивный вызов - это потенциальная интеракция.

Если взять например рекурсивную функцию, вычисляющей факториал, вызов "факториал(6)" ничего не знает о собственной предыстории. Был ли он вызван средой, или являлся частью более глубокой рекурсии для вычисления факториала(10) ? Узнать это нет никакой возможности.

Если вернуться к нашей ассоциации с жизню, то время у соответствующего контексту исполнения субъекта не течёт. Значения параметров не меняются (т.е. время даже измерить нечем). Внешний стимул (=вызов) порождает реакцию (возвращаемое значение), и максимум за такую жизнь удаётся принять один-единственный выбор (уходить в рекурсию или нет).

Reply


faceted_jacinth July 23 2007, 13:46:19 UTC
Императивно:
switch (c)
{
case 'I': myDna.Add(Base.I); break;
case 'C': myDna.Add(Base.C); break;
case 'F': myDna.Add(Base.F); break;
case 'P': myDna.Add(Base.P); break;
}

Декларативно:

Dictionary c2p = new Dictionary();
c2p.Add('I', Pattern.I);
c2p.Add('C', Pattern.C);
c2p.Add('F', Pattern.F);
c2p.Add('P', Pattern.P);

... и где-то в конце опять условно-императивно es.Add(c2p[c]);

Разница вовсе не в объёме взаимодействия с окружающей средой. В конце концов и та, и другая программы исполняются на одном и том же фон-неймановском компе и даже написаны на одном и том же языке. Разница в другом: в том, что одна программа описывает последовательность действий, а другая -- результат.

Reply

jayrandom July 23 2007, 14:02:19 UTC
ЖЖ не любит темплейтовских угловых скобок, придётся поправить. И заодно не мешало бы откомментировать: чем занимается данный кусок кода далеко не самоочевидно.

Reply

faceted_jacinth July 23 2007, 15:29:39 UTC
Поправить комментарий невозможно! могу перезапостить, но, с другой стороны, надо ли?

Чем занимаются данные куски кода (на самом деле они занимаются разными вещами, но довольно похожими по сути): нужно превратить введённый снаружи символ А в один из символов Б. Императивный подход -- это когда программист в явном виде пишет, что, дескать, есть у нас символ А, пройдёмся по всем возможным вариантам А1 .. Ан и в каждом из них выведем соответствующий символ Б_и. А есть императивный подход, когда программист говорит, что символу А1 соответствует символ Б1 и так далее. В первом случае действие производится, во втором действие только подразумевается, и то со стороны, так-то у нас есть прекрасная табличка, которую только сильно извращённые умы могут воспринять как руководство к действию, а не как некую догму, которую можно сочетать с другими догмами чтобы получать новые догмы.

Reply

jayrandom July 23 2007, 15:56:12 UTC
Ок, спасибо. Не надо перезапощивать :)

Интересный пример. Получается, что "верх императивности" - это вообще даже не использовать никаких структур данных, вернее выразить любые нетривиальные данные (в данном примере - таблицу перевода) через граф перехода по коду.

"Верх декларативности" - наоборот, убрать весь код, оставить одну хеш-таблицу, а управление передать некоторой интерпретирующей среде. Настоящая декларативная программа (например, на Прологе) по сути и есть база данных, над которой по своим (императивным) правилам копается специальный интерпретатор.

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

Reply


Leave a comment

Up