Что такое декларативное программирование? [закрыто]

Я продолжаю слышать этот термин в нескольких различных контекстах. Что это такое?

 Shelby Moore III03 дек. 2011 г., 07:51
Ответ, выбранный вами как правильный (отмечен зеленой галочкой), неверен. Он не определяет, что отличает декларативное программирование от его антитезы - императивное программирование. Пожалуйста, рассмотрите возможность изменения вашего выбора.
 Shelby Moore III06 июл. 2012 г., 20:11
@ vivek.m я предоставил новыйответ сегодня.
 Dermot14 февр. 2012 г., 02:35
Да, ответ, помеченный как правильный, НЕ верен.
 vivek.m07 июн. 2012 г., 13:50
@ShelbyMooreIII Также укажите, какой ответ правильный, чтобы мы могли его прочитать!

Ответы на вопрос(17)

заполненными формулами для расчета налоговой декларации.

Вся логика делается объявленной в ячейках, порядок расчета определяется самой формулой, а не процедурно.

Это своего рода декларативное программирование. Вы объявляете проблемное пространство и решение, а не поток программы.

Пролог - единственный декларативный язык, который я использую. Это требует другого типа мышления, но хорошо учиться, если просто подвергнуть вас чему-то другому, кроме типичного процедурного языка программирования.

но я бы добавил Excel (или любую другую электронную таблицу) в список декларативных систем. Хороший пример этого данВот.

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

Независимость контекста

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

приниматьyacc В качестве примера. Это генератор парсеров ака. компилятор компилятор, внешний декларативный DSL для описания грамматики языка, так что анализатор для этого языка может автоматически генерироваться из описания. Из-за его независимости от контекста вы можете делать много разных вещей с такой грамматикой:

Создайте синтаксический анализатор C для этой грамматики (исходный вариант использования дляyacc)Создать синтаксический анализатор C ++ для этой грамматикиСоздайте синтаксический анализатор Java для этой грамматики (используя Jay)Создайте синтаксический анализатор C # для этой грамматики (используя GPPG)Создайте анализатор Ruby для этой грамматики (используя Racc)Создать визуализацию дерева для этой грамматики (используя GraphViz)просто сделайте красивую печать, необычное форматирование и подсветку синтаксиса самого исходного файла yacc и включите его в ваше Справочное руководство в качестве синтаксической спецификации вашего языка

И многое другое ...

оптимизация

Поскольку вы не прописываете компьютеру, какие шаги и в каком порядке выполнять, он может гораздо более свободно переставлять вашу программу, возможно, даже выполнять некоторые задачи параллельно. Хорошим примером является планировщик запросов и оптимизатор запросов для базы данных SQL. Большинство баз данных SQL позволяют отображать запрос, которым они являютсяфактически выполнение против запроса, который выспросил их выполнить. Часто эти запросы выглядятничего как друг друга Планировщик запросов принимает во внимание то, о чем вы даже не мечтали: например, задержку вращения диска, или тот факт, что какое-то совершенно другое приложение для совершенно другого пользователя просто выполнило аналогичный запрос и таблицу, которой вы являетесь соединение с тем, что вы так усердно работали, чтобы избежать загрузки, уже есть в памяти.

Здесь есть интересный компромисс: машина должна работать усерднее, чтобы разобратьсякак сделать что-то, чем это было бы в императивном языке, но когда этоделает понять это, у него гораздо больше свободы и гораздо больше информации для этапа оптимизации.

ASP.Net разметка для привязки данных. Например, он просто говорит: «Заполните эту сетку этим источником» и оставляет это системе, как это происходит.Выражения Linq

Декларативное программирование хорошо, потому что оно может помочьупростить вашу ментальную модель* кода, и потому что в конечном итоге он может быть более масштабируемым.

Например, допустим, у вас есть функция, которая делает что-то для каждого элемента в массиве или списке. Традиционный код будет выглядеть так:

foreach (object item in MyList)
{
   DoSomething(item);
}

Ничего страшного там нет. Но что, если вы используете более декларативный синтаксис и вместо этого определяете DoSomething () как действие? Тогда вы можете сказать это так:

MyList.ForEach(DoSometing);

Это, конечно, более кратко. Но я уверен, что у вас больше проблем, чем просто сохранение двух строк кода здесь и там. Производительность, например. По старинке обработка должна была выполняться последовательно. Что если у метода .ForEach () есть способ сообщить о том, что он может обрабатывать обработку параллельно, автоматически? Внезапно вы сделали свой код многопоточным очень безопасным способом и изменили только одну строку кода. И, на самом деле, естьрасширение для .Net, который позволяет вам сделать это.

Если вы перейдете по этой ссылке, это приведет вас к сообщению в блоге моего друга. Весь пост немного длинный, но вы можете прокрутить вниз до заголовка "Проблема" _и поднять его там нет проблем. *
 Shelby Moore III22 июн. 2013 г., 18:41
Вы упускаете из виду тот факт, что если ваши функции не являются чистыми, то непреднамеренные побочные эффекты могут разрушить связь между тем, что вы объявили, и фактическим поведением программы. Я объяснил это более подробно вновый ответ.
 Joel Coehoorn04 апр. 2013 г., 17:13
Декларативное программированиеМожно мутировать сохраненные значения ... это просто, что вы указываете (объявить)что Вы хотите мутировать, а не точно, как именно мутировать его. Как вы думаете, что еще делает оператор SQL INSERT или UPDATE в SQL?
 Shelby Moore III03 дек. 2011 г., 07:38
Вы описываетефункциональное программирование, не декларативное программирование, Декларативное программирование имеет атрибут, что ононе изменяет сохраненные значения.

новое определение декларативной собственности, которая указана ниже. Я также определил императивное программирование как двойственное свойство.

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

В приведенном объяснении определения обсуждается рольчистый Функциональное программирование играет в декларативном программировании.

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

Декларативное свойство является странным, тупым, и его трудно уловить в технически точном определении, которое остается общим и не двусмысленным, потому что наивно полагать, что мы можем объявить смысл (семантику a.k.a) программы, не вызывая непреднамеренных побочных эффектов. Между выражением смысла и избеганием непреднамеренных последствий существует внутренняя напряженность, и эта напряженность фактически вытекает изтеоремы о неполноте программирования и нашей вселенной.

Упрощенно, технически неточно и часто неоднозначно определять декларативное как“что делать” и обязательно как“как сделать”, Неоднозначным случаем являетсячто" это "как”В программе, которая выводит программу - компилятор.

Очевидно,неограниченная рекурсия, делающая язык Тьюринга полнымтакже аналогично в семантике, а не только в синтаксической структуре оценки (например, операционная семантика). Это логически пример, аналогичный теореме Гёделя:любая полная система аксиом также противоречива». Обдумайте противоречивую странность этой цитаты! Это также пример, который демонстрирует, что выражение семантики не имеет доказуемой границы, поэтому мы не можем доказать2 что программа (и, аналогично, ее семантика) останавливаются, как теорема Остановки.

Теоремы о неполноте вытекают из фундаментальной природы нашей вселенной, которая, как указано во Втором законе термодинамики, «энтропия (a.k.a. # независимых возможностей)стремится к максимуму навсегда». Кодирование и дизайн программы никогда не заканчиваются - она жива! - потому что она пытается удовлетворить потребности реального мира, а семантика реального мира всегда меняется и стремится к большему количеству возможностей. Люди никогда не перестают открывать новые вещи (в том числе ошибки в программах ;-).

Чтобы точно и технически охватить это вышеупомянутое желаемое понятие в этой странной вселенной, которая не имеет границ (учтите, что «вне» нашей вселенной нет), требуется краткое, но обманчиво-непростое определение, которое будет звучать неправильно, пока оно не будет объяснено. глубоко.

Определение:

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

Императивная собственность3 является двойственным, где семантика противоречива по составу и / или может быть выражена с помощью вариаций наборов операторов.

Это определение декларативногоместный в семантической области, что означает, что требуется, чтобы модульная семантика сохраняла свое непротиворечивое значение независимо от того, где и как она была реализована и использована вГлобальный объем. Таким образом, каждая декларативная модульная семантика должна быть по сути ортогональной ко всем возможным другим, а не невозможной (из-за теорем о неполноте)Глобальный алгоритм или модель для подтверждения последовательности, которая также является точкой «Больше - не всегда лучшеРоберт Харпер, профессор компьютерных наук в Университете Карнеги-Меллона, один из разработчиков Standard ML.

Примеры этой модульной декларативной семантики включают в себя функторы теории категорий, например,Applicative, именная типизация, пространства имен, именованные поля и w.r.t. до операционного уровня семантики, то чисто функциональное программирование.

Таким образом, хорошо разработанные декларативные языки могутболее четко выразить смыслхотя и с некоторой потерей общности в том, что может быть выражено, но в то же время выигрыш в том, что может быть выражено с внутренней последовательностью.

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

Язык гипертекстовой разметки a.k.a. HTML - язык для статических веб-страниц - является примером очень (но не идеально)3) декларативный язык, который (по крайней мере, до HTML 5) не обладал способностью выражать динамическое поведение. HTML, пожалуй, самый простой язык для изучения. Для динамического поведения императивный язык сценариев, такой как JavaScript, обычно сочетался с HTML. HTML без JavaScript соответствует декларативному определению, потому что каждый номинальный тип (т. Е. Теги) сохраняет свое непротиворечивое значение под композицией в рамках правил синтаксиса.

Конкурентное определение для декларативногокоммутативной а такжеидемпотент свойства семантических утверждений, то есть то, что утверждения могут быть переупорядочены и дублированы без изменения значения. Например, операторы, присваивающие значения именованным полям, могут быть переупорядочены и продублированы без изменения смысла программы, если эти имена являются модульными w.r.t. к любому подразумеваемому заказу. Имена иногда подразумевают порядок, например, идентификаторы ячеек включают их столбцы и положение строк - перемещение итога по электронной таблице меняет его значение. В противном случае эти свойства неявно требуютГлобальный согласованность семантики. Как правило, невозможно разработать семантику операторов, чтобы они оставались непротиворечивыми при случайном порядке или дублировании, поскольку порядок и дублирование являются неотъемлемой частью семантики. Например, выражения «Foo существует» (или конструкция) и «Foo не существует» (и уничтожение). Если кто-то считает случайное несоответствие эндемичным для предполагаемой семантики, то он принимает это определение как достаточно общее для декларативного свойства. По сути, это определение является пустым как обобщенное определение, потому что оно пытается сделать последовательность ортогональной семантике, то есть игнорировать тот факт, что универсум семантики динамически неограничен и не может быть захвачен вГлобальный парадигма когерентности.

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

C, Java, C ++, C #, PHP и JavaScript не являются особенно декларативными. Синтаксис Copute и синтаксис Python более декларативныв сочетании с намеченными результатамито есть последовательная синтаксическая семантика, которая устраняет постороннее, так что можно легко понять код после того, как он его забыл. Copute и Haskell усиливают детерминизм операционной семантики и поощряют «не повторяйся”(СУХОЙ), потому что они допускают только чисто функциональную парадигму.

2 Даже там, где мы можем доказать семантику программы, например, с языком Coq это ограничено семантикой, которая выражается внабор текстаи ввод никогда не может охватить всю семантику программы - даже для языков, которые не являются полными по Тьюрингу, например с помощью HTML + CSS можно выражать несовместимые комбинации, которые, таким образом, имеют неопределенную семантику.

3 Многие объяснения неверно утверждают, что только императивное программирование имеет синтаксически упорядоченные операторы. Я уточнил этопутаница между императивным и функциональным программированием, Например, порядок операторов HTML не уменьшает согласованность их значения.

Изменить: я разместилследующий комментарий в блог Роберта Харпера:

в функциональном программировании ... диапазон изменения переменной является типом

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

Единственное неразборчивое определение, которое я в настоящее время ценю для функционального программирования, - это: а) функции в качестве объектов и типов первого класса, б) предпочтение рекурсии над циклами и / или в) чистые функции, то есть те функции, которые не влияют на желаемую семантику программы, когда запомнил (таким образом, совершенно чистого функционального программирования не существует в денотационной семантике общего назначения из-за воздействий операционной семантики, например, выделение памяти).

Идемпотентное свойство чистой функции означает, что вызов функции для ее переменных может быть заменен ее значением, что обычно не относится к аргументам императивной процедуры. Чистые функции кажутся декларативными w.r.t. на несоставленные переходы между типами ввода и результата.

Но состав чистых функций не поддерживает такую согласованность, потому что можно моделировать императивный процесс побочного эффекта (глобального состояния) на чистом функциональном языке программирования, например, IOMonad на Haskell и, более того, совершенно невозможно предотвратить это в любом полностью чистом функциональном языке программирования Тьюринга.

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

Таким образом, я пришел к выводу, что только полные языки, не являющиеся тьюринговыми, могут быть декларативными.

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

Так что мне кажется, что декларативные языки являются противоположностьюнеограниченная рекурсиясогласно второй теореме Гёделя о неполноте, самореференциальные теоремы не могут быть доказаны.

Лези Лампортписал сказка о том, как Евклид мог обойти теоремы Гёделя о неполноте, примененные к математическим доказательствам в контексте языка программирования, путем сравнения типов и логики (соответствие Карри-Ховарда и т. д.).

Вот пример.

В CSS (используется для стилизации HTML-страниц), если вы хотите, чтобы элемент изображения имел высоту 100 пикселей и ширину 100 пикселей, вы просто «объявляете», что вы хотите следующее:

#myImageId {
height: 100px;
width: 100px;
}

Вы можете считать CSS декларативным языком «таблиц стилей».

Движок браузера, который читает итолкует этот CSS свободен, чтобы изображение выглядело таким высоким и таким широким, как ему хочется. Различные движки браузера (например, движок для IE, движок для Chrome) будут выполнять эту задачу по-разному.

Их уникальные реализации, конечно, НЕ написаны на декларативном языке, а на процедурном, таком как Assembly, C, C ++, Java, JavaScript или Python. Этот код представляет собой набор шагов, которые необходимо выполнить шаг за шагом (и может включать вызовы функций). Это может делать такие вещи, как интерполяция значений пикселей и рендеринг на экране.

как вы отправляете ответ на текст. В целом вы можете посмотреть на программу с определенной точки зрения, но это зависит от того, под каким углом вы смотрите на проблему. Я начну с программы: Dim Bus, Car, Time, Height As Integr

Опять же, это зависит от того, что проблема в целом. Возможно, вам придется сократить его из-за программы. Надеюсь, что это помогает и нужна обратная связь, если это не так. Благодарю вас.

кабря 2011 года, когда я предоставилответ на этот вопрос. Здесь следует мое текущее понимание.

Длинная версия моего понимания (исследования) подробно наэта ссылка, который вы должны прочитать, чтобы получить глубокое понимание резюме, которое я приведу ниже.

В императивном программировании изменяемое состояние хранится и читается, поэтому упорядочение и / или дублирование инструкций программы могут изменить поведение (семантику) программы (и даже вызвать ошибку, то есть непреднамеренное поведение).

В самом наивном и крайнем смысле (который я утверждал в моем предыдущем ответе) декларативное программирование (DP) избегает всех сохраняемых изменяемых состояний, таким образом упорядочение и / или дублирование программных инструкций можетНЕ изменить поведение (семантику) программы.

Однако такое экстремальное определение не будет очень полезным в реальном мире, поскольку почти каждая программа включает в себя сохраняемое изменяемое состояние.пример электронной таблицы соответствует этому предельному определению DP, поскольку весь программный код выполняется до завершения с одной статической копией состояния ввода перед сохранением новых состояний. Затем, если какое-либо состояние изменяется, это повторяется. Но большинство реальных программ не могут быть ограничены такой монолитной моделью изменений состояния.

Более полезное определение DP состоит в том, что упорядочение и / или дублирование инструкций программирования не изменяет никакой непрозрачной семантики. Другими словами, не происходит скрытых случайных изменений в семантике - любые изменения в порядке команд программы и / или дублировании вызывают только предполагаемые и прозрачные изменения в поведении программы.

Следующим шагом было бы поговорить о том, какие модели программирования или парадигмы помогают в DP, но это не вопрос здесь.

 Kedar Mhaswade23 июл. 2017 г., 15:14
Ссылка на compute.com не работает.
 RBT08 дек. 2016 г., 00:42
Functional programming это модное слово в наши дни, которое по сути является подмножеством декларативного программирования. LINQ в языке C # является элементом функционального программирования, когда сам язык является обязательным по своей природе. Таким образом, C # становится своего рода гибридом в соответствии с этим определением.
 Shelby Moore III25 нояб. 2015 г., 23:06
Обновление: пожалуйста, обратитесь к более исчерпывающему объяснению на моемдругой ответ по определению декларативного программирования.

что что-то должно делать или быть вместо описаниякак он должен работать.

Другими словами, вы не пишете алгоритмы, составленные из выражений, вы просто размечаете, как вы хотите, чтобы все было. Два хороших примера - это HTML и WPF.

Эта статья в Википедии - хороший обзор:http://en.wikipedia.org/wiki/Declarative_programming

 niahoo07 янв. 2014 г., 15:40
HTML не является языком программирования
 Nick10 окт. 2008 г., 15:36
Незначительная болтовня. WPF - это библиотека, а не язык или парадигма. Я думаю, что вы действительно хотели сказать, что XAML является примером декларативного языка.
 Shelby Moore III03 дек. 2011 г., 07:08
Неверно утверждать, что декларативное программирование не может содержать выражений. Ключевым отличием являются выраженияне может изменить сохраненные значения.
 Gutzofter07 сент. 2009 г., 08:42
А как бы вы описали программирование с использованием библиотеки / фреймворка?

где императивное программирование - это инструкции для рисования этой картины.

Вы пишете в декларативном стиле, если вы «рассказываете, что это такое», а не описываете шаги, которые компьютер должен предпринять, чтобы добраться туда, куда вы хотите.

Когда вы используете XML для разметки данных, вы используете декларативное программирование, потому что вы говорите: «Это человек, у которого день рождения, и у него есть уличный адрес».

Некоторые примеры, где декларативное и императивное программирование объединяются для большего эффекта:

Windows Presentation Foundation использует декларативный синтаксис XML для описания того, как выглядит пользовательский интерфейс и каковы связи (привязки) между элементами управления и базовыми структурами данных.

Структурированные файлы конфигурации используют декларативный синтаксис (так же просто, как пары «ключ = значение»), чтобы определить, что означает строка или значение данных.

HTML помечает текст тегами, которые описывают роль каждого фрагмента текста по отношению ко всему документу.

 Gutzofter07 сент. 2009 г., 08:41
Должен быть базовый контекст (домен?), В котором используется декларативная программа. Таким образом, использование XML в сочетании с ANT может быть истолковано как декларативная программа.
 HenryR29 сент. 2008 г., 13:35
Хотя XML декларативен, я бы не сказал, что он декларативенпрограммирование просто потому, что нет активной семантики, связанной с разметкой. Сказать, что что-то является адресом, не помогает понять, что вы хотите с ним делать.

которые соответствуют ментальной модели разработчика, а не операционной модели машины».

Разница между декларативным и императивным программированием хорошо иллюстрируется проблемой анализа структурированных данных.

Императивная программа будет использовать взаимно рекурсивные функции, чтобы потреблять ввод и генерировать данные. Декларативная программа выражает грамматику, которая определяет структуру данных, чтобы затем их можно было проанализировать.

Разница между этими двумя подходами заключается в том, что декларативная программа создает новый язык, который более точно сопоставлен с ментальной моделью проблемы, чем с ее основным языком.

Решение Вопроса

разом, что он описывает то, что вы хотите сделать, а не то, как вы хотите это сделать. Это зависит от компилятора, чтобы выяснить, как.

Примерами декларативных языков программирования являются SQL и Prolog.

 java-addict30115 сент. 2017 г., 17:35
Как SQL может быть декларативным, если он поддерживает выражения, которые не являются ссылочно прозрачными?
 nate21 авг. 2017 г., 09:05
программист: «Я хочу поехать в Париж».декларативный (с): "Как бы вы хотели туда добраться? Плыть на лодке? Или лететь на самолете? Может быть, плыть на полпути, а затем долететь до конца?"программист: «Меня не интересует, как это делается».императив (SQL): «Не волнуйтесь. Я могу запросить то, что вам нужно». (вот как я понимаю ответ)
 hasen14 мая 2009 г., 23:14
Вам еще предстоит разобраться, «как» сказать компьютеру «что» вы хотите :)
 RBT08 дек. 2016 г., 00:44
Было бы здорово, если бы вы упомянули, чем оно отличается от императивного программирования (такие языки, как C, C ++, C #), тогда читателям будет легче разобраться в разнице.
 Shelby Moore III03 дек. 2011 г., 06:56
@hasenj этот и другие ответы не определяютединственный атрибут, не используемый в императивном программировании-- которыйнеизменность.

то есть декларативными предложениями. Декларативные предложения имеют ряд свойств, которые отличают их от императивных предложений. В частности, декларации:

коммутативный (может быть переупорядочен)ассоциативный (можно перегруппировать)идемпотент (может повторяться без изменения значения)монотонный (декларации не вычитают информацию)

Важным моментом является то, что все это структурные свойства и они ортогональны предмету. Декларативный не о«Что против как», Мы можем объявить (представить и ограничить)"как" так же легко, как мы объявляем"что". Декларативный - это структура, а не содержание. Декларативное программирование оказывает существенное влияние на то, как мы абстрагируем и рефакторизируем наш код, и на то, как мы его модульно превращаем в подпрограммы, но не так сильно в модели предметной области.

Часто мы можем перейти от императивного к декларативному, добавив контекст. Например. от "Поверните налево. (... подождите ...) Поверните направо". to «Боб повернет налево на пересечении Фу и Бара в 11:01. Боб повернет направо на пересечении Бара и Бэза в 11:06». Обратите внимание, что в последнем случае предложения являются идемпотентными и коммутативными, в то время как в первом случае перестановка или повторение предложений может серьезно изменить смысл программы.

относительномонотонный, объявления могут добавитьограничения что вычестьвозможности, Но ограничения по-прежнему добавляют информацию (точнее, ограничения - это информация). Если нам нужны изменяющиеся во времени объявления, типично моделировать это с явной временной семантикой - например, от «мяч плоский» до «мяч плоский в момент времени Т». Если у нас есть две противоречивые декларации, у нас есть противоречивая декларативная система, хотя это может быть решено путем введениямягкий ограничения (приоритеты, вероятности и т. д.) или использование паранепротиворечивой логики.

 Shelby Moore III28 февр. 2013 г., 08:54
Декларативные выражения способствуютпредназначены Поведение программы императивно может способствовать предполагаемому или непреднамеренному. Декларативный не должен быть коммутативным и идемпотентным, если это преднамеренная семантика.

Декларативное программирование имеет тенденцию к:

Наборы объявлений или декларативных операторов, каждое из которых имеет значение (часто в проблемной области) и может быть понято независимо и изолированно.

Императивное программирование имеет тенденцию к: -

Последовательности команд, каждая из которых выполняет определенное действие; но которые могут иметь или не иметь значение в проблемной области.

В результате императивный стиль помогает читателю понять механику того, что система на самом деле делает, но может дать мало понимания проблемы, которую она призвана решить. С другой стороны, декларативный стиль помогает читателю понять проблемную область и подход, который система использует для решения проблемы, но менее информативен в механике.

Реальные программы (даже написанные на языках, которые поддерживают концы спектра, такие как ProLog или C), как правило, имеют оба стиля, представленные в различной степени в разных точках, чтобы удовлетворить различные сложности и коммуникационные потребности произведения. Один стиль не превосходит другой; они просто служат различным целям, и, как и во многих вещах в жизни, умеренность является ключевым фактором.

 Krzysztof Wende01 дек. 2017 г., 13:52
Это правильный ответ. Ни один из этого бормотания выше

но я должен не согласиться со многими другими ответами. Я хотел бы остановить это запутанное недопонимание определения декларативного программирования.

Определение

Ссылочная прозрачность (RT) подвыражений являетсятребуется только атрибут декларативного программного выраженияпотому что это единственный атрибут, который не используется императивным программированием.

Другие процитированные атрибуты декларативного программирования происходят из этого RT. Пожалуйста, нажмите гиперссылку выше для подробного объяснения.

Пример электронной таблицы

В двух ответах упоминается программирование электронных таблиц. В тех случаях, когда программирование электронных таблиц (формул a.k.a.) не имеет доступа к изменяемымГлобальный государство, то это декларативное программирование. Это потому, что значения изменяемой ячейки являются монолитнымивход а такжевыход изmain() (вся программа). Новые значения не записываются в ячейки после выполнения каждой формулы, поэтому они не изменяются в течение всей жизни декларативной программы (выполнение всех формул в электронной таблице). Таким образом, по отношению друг к другу формулы рассматривают эти изменчивые клетки как неизменные. Доступ к функции RT разрешеннеизменный глобальное состояние (а такжеизменчивыйместный государство).

Таким образом, возможность изменять значения в ячейках при завершении программы (как вывод изmain()), не делает их изменяемыми хранимыми значениями в контексте правил. Ключевым отличием является то, что значения ячеек не обновляются после выполнения каждой формулы электронной таблицы, поэтому порядок выполнения формул не имеет значения. Значения ячеек обновляются после выполнения всех декларативных формул.

 Shelby Moore III22 июн. 2013 г., 18:44
Непреднамеренные побочные эффекты могут разрушить связь между тем, что было объявлено, и фактическим поведением программы. Я объяснил это более подробно вновый ответ.

он начал использоваться для описания систем программирования, таких как Пролог, потому что пролог (предположительно) предназначен для объявления вещей абстрактно.

Это все больше значит очень мало, поскольку имеет определение, данное пользователями выше. Должно быть ясно, что существует пропасть между декларативным программированием на Haskell, в отличие от декларативного программирования на HTML.

 Shelby Moore III03 дек. 2011 г., 07:14
Нет "пропасти между декларативным программированием на Haskell, в отличие от декларативного программирования на HTML", потому чтокорневой атрибут декларативного программирования является неизменностью хранимых значений.
 Shelby Moore III04 дек. 2011 г., 17:41
Полнота поворота требует только неограниченной рекурсии, Неизменность хранимых значений не исключает неограниченную рекурсию. Таким образом, они являются ортогональными атрибутами.
 Marcin04 дек. 2011 г., 11:41
Как бы то ни было, существует существенная разница между предметно-ориентированным языком, который ограничен даже в неявных вычислениях, по сравнению с системой программирования, полной по Тьюрингу.
 Shelby Moore III04 дек. 2011 г., 17:25
Согласовано. Полнота по Тьюрингу ортогональна неизменности хранимых значений. Таким образом, мы не должны сравнивать декларативный и императивный атрибут. Спасибо за размышление об одном из атрибутов (полнота Тьюринга), которые могут вызвать эту «пропасть».

A выражение целиУсловия для - то, что мы ищем. Есть один, может быть, или много?Некоторые известные фактыПравила, расширяющие известные факты

... и где есть двигатель вычитания, обычно работающий собъединение алгоритм поиска целей.

Ваш ответ на вопрос