LINUX.ORG.RU

Декларативное программирование

 ,


0

1

Не стеба ради, а просвещения для.

Честное слово, вот не могу понять я такой вещи. Есть у нас разные языки, которые принято называть языки разметки, например xml. Очень похоже на декларативность, не правда-ли? Только вот я в толк никак не возьму, как на этом можно программировать? Чем принципиально отличается декларативный подход от подхода «гипертекстовой разметки» и прочего? Где грань?

ЗЫ Нет, ну ясно, что инструкция <something>something<something>, или something: something выведет на экран некий something. Это, кагбе можно, условно назвать программированием. Ну а дальше то что? Или это и есть то, что называют изоляция от побочных эффектов, типа мы командуем, а как реализовано, нас не волнует. Гипертекстовая разметка чиста?



Последнее исправление: avtoritetniy-expert (всего исправлений: 1)

Разница как между «Возьми кисть, окуни в ведро с краской, нанеси мазок, повтори» (императивный подход), «Покрась стену» (декларативный) и «Стена окрашена» (разметка).

keyran ★★
()
Ответ на: комментарий от yoghurt

Ну хорошо, это все-таки не только, и не столько декларативное, сколько логическое. Стоит под капотом движок, занимается логическим выводом. А если исключить логику?

avtoritetniy-expert
() автор топика

SQL довольно декларативен местами например. И да, Йогурт правильно упомянул Пролог — тоже весьма декларативненько. Собственно рекомендую первую (или вторую) лекцию SICP, там показывается наглядно на примере разница между декларативностью и императивностью.

korvin_ ★★★★★
()
Последнее исправление: korvin_ (всего исправлений: 1)

Честное слово, вот не могу понять я такой вещи. Есть у нас разные языки, которые принято называть языки разметки, например xml. Очень похоже на декларативность, не правда-ли?

Все верно, xml декларативен.

Только вот я в толк никак не возьму, как на этом можно программировать?

Это не относится к декларативности, это относится к полноте по Тьюрингу.

Xml - декларативный, не Тьюринг-полный. Haskell - декларативный, Тьюринг-полный. Си - не декларативный, Тьюринг-полный.

Kuzy ★★★
()

Очень похоже на декларативность, не правда-ли?

Не «похоже», а это она самая и есть.

Это, кагбе можно, условно назвать программированием.

Про Тьюринг-полноту слышал?

Apple-ch ★★
()
Ответ на: комментарий от keyran

Разница как между «Возьми кисть, окуни в ведро с краской, нанеси мазок, повтори» (императивный подход), «Покрась стену» (декларативный) и «Стена окрашена» (разметка).

То есть, если мне надо просто взять кисть, и не красить, я не смогу этого сделать, так?

BTW, большой разницы между последними двумя пунктами не вижу. Всего лишь, разница в словоформах, смысл одинаков, поскольку «покрась стену» автоматом превращается в «стена окрашена»

avtoritetniy-expert
() автор топика
Ответ на: комментарий от keyran

«Покрась стену» - императивщина. «Стена окрашена» - декларативщина.

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

Xml - декларативный, не Тьюринг-полный.

:'} А лисп тьюринг полный?

(* (+ 1 2) 3)

~~

<funcall name=«mul»>
  <arg id=«1»>
    <funcall name=«add»>
      <arg id=«1»>1</arg>
      <arg id=«2»>2</arg>
    </funcall>
  </arg>
  <arg id=«2»>
    3
  </arg>
</funcall>

Главное, вычислятор к нему написать.

yoghurt ★★★★★
()
Ответ на: комментарий от avtoritetniy-expert

Не слушай его. Аналогия не верна.

«покрась стену» - императивное действие.

Kuzy ★★★
()
Ответ на: комментарий от yoghurt

А лисп тьюринг полный?

А лисп не декларативный.

korvin_ ★★★★★
()
Ответ на: комментарий от Apple-ch

Про Тьюринг-полноту слышал?

Слышал, но не совсем понятно, что это значит в данном контексте. Возьмем ту же стену. Допустим, у нас есть алгоритм перекрашивания стены в другой цвет. Как мы можем сделать это без деструктивного присваивания? Хорошо, мы можем скопировать весь «мир» и связать стену с другим цветом и затереть старый кадр новым, при этом, сам процесс перекрашивания невыразим. Считать ли это тем же самым, вопрос философский...

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

Императивный подход: перекрашиваешь стену из старого цвета в новый.

Декларативный подход: у тебя есть стена нужного цвета.

PolarFox ★★★★★
()
Ответ на: комментарий от avtoritetniy-expert

скопировать

Императивное действие.

Kuzy ★★★
()
Ответ на: комментарий от PolarFox

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

avtoritetniy-expert
() автор топика

html (по крайней мере в старых версиях) - не тьюринг-полный язык программирования.

чистый html может решить задачу с конечным числом возможных ответов (одна страница = один возможный ответ)

на нем действительно трудновато решать большинство задач

MyTrooName ★★★★★
()

GNU Make видел? CMake, даже scons? Вот оно и есть декларативное программирование. А теперь иди учить уроки, сопля.

anonymous
()
Ответ на: комментарий от keyran

«Покрась стену» (декларативный)

нет. просто другой уровень абстракции. следующий уровень, например, «построй дворец».

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

нет. просто другой уровень абстракции. следующий уровень, например, «построй дворец».

Имхо, «покрась стену» и «построй дворец» находятся в пределах одного уровня абстракции.

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

окей, справедливо. ну сути это не отменяет, все равно императивно.

val-amart ★★★★★
()
Ответ на: комментарий от avtoritetniy-expert
func Покрась_стену() { 
 Возьми_кисть(); 
 окуни_в_ведро_с_краской();
 нанеси_мазок();
 повтори(); 
}

func построй_дворец() {
 ...
 Покрась_стену();
 ...
}

Так понятней?

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

Да, здесь будет, но только в том случае, если в дальнейшем мы будем манипулировать такими понятиями как построй дворец, построй дом и т.д. А если просто: «покрась стену» «построй дворец» «построй город» - здесь это сущности одного порядка - «do anything».

avtoritetniy-expert
() автор топика

Императивный подход:

скопируй файл A в директорию B

Декларативный:

В директории B лежит копия файла A

Как можно заметить:

  • декларативный подход не обязательно означает меньше кода
  • разница с императивным подходом заключается исключительно в выборе точки зрения
lovesan ★★
()
Ответ на: комментарий от lovesan

Спасибо, очень наглядно.

Насколько я понял, 2 кусок означает, что «под капотом» файл копируется, но мы абстрагированы от этого «грязного действа»?

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

Вот такой пример еще.

Скопировать A в A1;
Скопировать B в B1;
Объединить A1 и B1 в C;
Файл C это объединение файлов A1 и B1, где A1 - это копия A, B1 - это копия файла B

Принципиальная разница между первым и вторым подходом, в том, что мы не описываем явно control flow, позволя это делать самой среде. Например компилятор может скопировать файлы параллельно. Мы задаем только отношения между входами и выходами.

dizza ★★★★★
()
Ответ на: комментарий от lovesan

Декларативный: В директории B лежит копия файла A

Это не декларативное программирование, а самовнушение.

Декларативный код должен отвечать на классический вопрос: «Что делать». Императивный - на вопрос: «Как делать».

Чем дальше читаю этот тред, тем более отчетливо ощущается приближение Первомая. :)

С праздником, коллеги.

anonymous
()

XSLT — вполне себе декларативный ЯП

anonymous
()
Ответ на: комментарий от anonymous

Декларативный код должен отвечать на классический вопрос: «Что делать»

шаг 1: Что делать? Скопировать A в A1;
шаг 2: Что делать? Скопировать B в B1;
шаг 3: Что делать? Объединить A1 и B1 в C;

Это по-Вашему декларативный код? А что же тогда вот это:

Файл C это объединение файлов A1 и B1, где A1 - это копия A, B1 - это копия файла B

avtoritetniy-expert
() автор топика
Ответ на: комментарий от Kuzy

Xml - декларативный, не Тьюринг-полный.

Зато XSLT Тьюринг-полный %)

Deleted
()

переносите это в лолксы сразу, засрут как обычно
и да, на прологе напиши уже чегонить, перестанешь задавать глупые вопросы
зы, я видел этот тред на 1 странице

TERRANZ ★★★★
()
Ответ на: комментарий от avtoritetniy-expert

Это по-Вашему декларативный код?

А почти любой код на каком-то уровне декларативен. Например:

foo = bar(0);

этот фрагмент можно считать декларативным кодом, ставящим цель «занести значение функции bar от аргумента 0 в переменную foo». Как это будет сделано - отдается на откуп компилятору: он может вызвать bar, может подставить тело функции в место вызова, может сам на этапе компиляции посчитать значение.

И, естественно, этот же фрагмент можно считать обычным исперативным кодом, изменяющим значение переменной foo.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Этот код можно считать декларативным, но он не отвечает на вопрос «как делать», он, как раз отвечает на вопрос «что это?» (что такое foo?).

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

Этот код можно считать декларативным, но он не отвечает на вопрос «как делать»,

Декларативный код вообще не отвечает на вопрос «как?».

как раз отвечает на вопрос «что это?» (что такое foo?).

Не отвечает, но это нерелевантно.

tailgunner ★★★★★
()
Ответ на: комментарий от avtoritetniy-expert

шаг 1 ... шаг 3 - Это по-Вашему декларативный код?

По-моему, каждый шаг декларативен. А их последовательность - императивщина.

А что же тогда вот это: Файл C это объединение файлов A1 и B1, где A1 - это копия A, B1 - это копия файла B

Это определение. Чтобы его превратить в декларативную программу надо указать (пусть неявно), что делать с файлом С. Если еще добавить последовательность действий, то получим императивную программу.

anonymous
()
Ответ на: комментарий от tailgunner

Нет, я к тому, что вы сказали, что приведенный Вами код можно рассматривать двояко: как им императивный (что делать? — присвоить) или как декларативный (что это? - значение bar()). Я с этим не спорю. Но я отвечал на:

Декларативный код должен отвечать на классический вопрос: «Что делать». Императивный - на вопрос: «Как делать».

Как делать? — этот вопрос к вашему коду вообще никак не клеется. С этой точки зрения он по-любому декларативен.

Я говорил про то, что «что делать?» — это не признак декларативности. ИМХО, декларативность - это как раз констатация факта, lovesan, ранее правильный пример приводил, демонстрирующий отличие подходов.

avtoritetniy-expert
() автор топика
Ответ на: комментарий от anonymous

каждый шаг декларативен. А их последовательность - императивщина.

Вне зависимости от конкретного списка шагов, дискуссию можно закрывать, ибо тема раскрыта.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

См. выше.

Нет, компилятор — это вопрос реализации, к парадигме он отношения не имеет. Юзер ЯП не должен думать, как компилятор «сделает это». Поэтому, еще раз, вопрос «Как?» тут не стоит вообще.

avtoritetniy-expert
() автор топика
Ответ на: комментарий от anonymous

По-моему, каждый шаг декларативен. А их последовательность - императивщина.

ИМХО, в декларативном коде не должно быть последовательности шагов. Например: 1. деревья зеленые

2. кора их — серая

3. крона их — развесистая

Где тут шаги? На уровне реализации — это мож шаги, но не на уровне семантики.

avtoritetniy-expert
() автор топика
Ответ на: комментарий от tailgunner

Декларативный код вообще не отвечает на вопрос «как?».

Я бы сказал, что «найди решение задачи ABC по методу XYZ» вполне декларативное задание, хотя вопрос «как» здесь уместен. Чтобы превратить его в императивное, надо явно расписать все шаги метода XYZ.

anonymous
()
Ответ на: комментарий от anonymous

Я бы сказал, что «найди решение задачи ABC по методу XYZ

Где Вы тут нашли декларативность я хз. Декларативно было бы так: «решением задачи ABC по методу XYZ является...»

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

Здесь ровно столько же декларативности, как и в запросе:

select * from ABC where f=XYZ

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.