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

Я постоянно слышу, как этот термин используется в разных контекстах. Что это?


person Brian G    schedule 24.09.2008    source источник
comment
Ответ, который вы выбрали как правильный (обозначен зеленой галочкой), неверен. Он не определяет, что отличает декларативное программирование от его антитезы - императивного программирования. Пожалуйста, подумайте об изменении вашего выбора.   -  person Shelby Moore III    schedule 03.12.2011
comment
Да, ответ, помеченный как правильный, НЕ правильный.   -  person Dermot    schedule 14.02.2012
comment
@ShelbyMooreIII Также укажите правильный ответ, чтобы мы могли его прочитать!   -  person vivek.m    schedule 07.06.2012
comment
@ vivek.m Сегодня я представил новый ответ.   -  person Shelby Moore III    schedule 06.07.2012


Ответы (18)


Декларативное программирование - это когда вы пишете свой код таким образом, чтобы он описывал то, что вы хотите сделать, а не то, как вы хотите это делать. Компилятор должен решить, как это сделать.

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

person 1800 INFORMATION    schedule 24.09.2008
comment
Вам еще предстоит выяснить, как сказать компьютеру, что вы хотите :) - person hasen; 15.05.2009
comment
@hasenj этот и другие ответы не определяют только атрибут, который не используется для императивного программирования, что является неизменяемостью < / b>. - person Shelby Moore III; 03.12.2011
comment
Было бы здорово, если бы вы могли упомянуть, чем оно отличается от императивного программирования (такие языки, как C, C ++, C #), тогда читателям будет легче уловить разницу. - person RBT; 08.12.2016
comment
программист: Я хочу поехать в Париж. декларативное (c): как вы хотите туда попасть? плыть на лодке? или лететь в самолете? может быть, проплыть половину пути, а потом долететь до конца? программист: Меня не интересует, как это делается. императив (sql): не волнуйтесь. Я могу запросить то, что вам нужно. (вот как я понимаю ответ) - person nate; 21.08.2017
comment
Как может SQL быть декларативным, если он поддерживает выражения, которые не являются ссылочно прозрачными? - person java-addict301; 15.09.2017

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

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

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

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

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

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

Оптимизация

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

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

person Jörg W Mittag    schedule 28.09.2008

Свободно:

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

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

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

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

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

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

person William Payne    schedule 20.07.2012
comment
Это правильный ответ. Нет ничего из этого бормотания выше - person Krzysztof Wende; 01.12.2017
comment
Спасибо, что не только ответили на вопрос, но и сделали это в стиле «Объясните, как я 5» с контекстом и практичностью. Отличный ответ. - person monsto; 15.12.2019

Вот пример.

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

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

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

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

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

person Niko Bellic    schedule 14.07.2014

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

Определение

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

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

Пример таблицы

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

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

person Shelby Moore III    schedule 03.12.2011

Декларативное программирование - это картина, а императивное программирование - это инструкции по рисованию этой картинки.

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

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

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

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

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

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

person Chris Wenham    schedule 24.09.2008
comment
Хотя XML является декларативным, я бы не стал называть его декларативным программированием просто потому, что с разметкой не связана активная семантика. Сказать, что что-то является адресом, не поможет понять, что вы хотите с ним делать. - person HenryR; 29.09.2008
comment
Должен быть базовый контекст (домен?), В котором используется декларативная программа. Таким образом, использование XML в сочетании с ANT можно рассматривать как декларативную программу. - person Gutzofter; 07.09.2009

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

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

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

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

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

person dmbarbour    schedule 06.08.2012
comment
Декларативные выражения влияют на предполагаемое поведение программы императив может способствовать преднамеренному или непреднамеренному. Декларативность не обязательно должна быть коммутативной и идемпотентной, если это намеренная семантика. - person Shelby Moore III; 28.02.2013

Описывать компьютеру то, что вы хотите, а не как что-то делать.

person denonde    schedule 24.09.2008

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

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

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

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

person paan    schedule 24.09.2008

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

Полная версия моего понимания (исследования) подробно описана в этой ссылке < / strong>, который вам следует прочитать, чтобы лучше понять содержание, которое я приведу ниже.

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

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

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

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

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

person Shelby Moore III    schedule 06.07.2012
comment
Обновление: см. Также более исчерпывающее объяснение в моем другом ответ на определение декларативного программирования. - person Shelby Moore III; 26.11.2015
comment
Functional programming - это модное слово в наши дни, которое по сути является подмножеством декларативного программирования. LINQ на языке C # является элементом функционального программирования, когда сам язык является императивным по своей природе. Таким образом, C # становится своего рода гибридом в соответствии с этим определением. - person RBT; 08.12.2016
comment
Ссылка compute.com мертва. - person Kedar Mhaswade; 23.07.2017

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

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

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

person Kevin Berridge    schedule 24.09.2008
comment
Мелкая придирка. WPF - это библиотека, а не язык или парадигма. Я думаю, вы действительно хотели сказать, что XAML - это пример декларативного языка. - person Nick; 10.10.2008
comment
А как бы вы описали программирование с использованием библиотеки / фреймворка? - person Gutzofter; 07.09.2009
comment
Утверждать, что декларативное программирование не может содержать выражений, неверно. Ключевым отличием является то, что выражения не могут изменять сохраненные значения. - person Shelby Moore III; 03.12.2011
comment
HTML - это не язык программирования - person lud; 07.01.2014

Поскольку я написал свой предыдущий ответ, я сформулировал новое определение понятия декларативное свойство, которое цитируется ниже. Я также определил императивное программирование как двойственное свойство.

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

Процитированное объяснение определения обсуждает роль, которую чистое функциональное программирование играет в декларативном программировании.

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

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

Было бы слишком упрощенно, технически неточно и часто двусмысленно определять декларативное как «что делать» и императивное как «как делать. Неоднозначным случаем является то, что «что» является «как» в программе, которая выводит программу - компилятор.

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

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

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

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


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

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


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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

person Shelby Moore III    schedule 13.03.2013

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

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

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

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

person dan_waterworth    schedule 20.07.2012

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

person Lunatik    schedule 01.05.2009

Я бы объяснил это, поскольку DP - это способ выразить

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

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

person epatel    schedule 29.09.2008

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

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

person Marcin    schedule 24.09.2008
comment
Между декларативным программированием Haskell и декларативным программированием HTML нет пропасти, потому что корневой атрибут декларативного программирования является неизменяемым. сохраненных значений. - person Shelby Moore III; 03.12.2011
comment
Как бы то ни было, существует значительная разница между предметно-ориентированным языком, который ограничен даже в своих неявных вычислениях, и полной системой программирования по Тьюрингу. - person Marcin; 04.12.2011
comment
Согласованный. Полнота по Тьюрингу ортогональна неизменности хранимых значений. Поэтому мы не должны объединять атрибуты декларативного и императивного характера. Спасибо, что продумали один из атрибутов (полнота по Тьюрингу), который может вызвать эту пропасть. - person Shelby Moore III; 04.12.2011
comment
Для полноты поворота требуется только неограниченная рекурсия. Неизменяемость хранимых значений не препятствует неограниченной рекурсии. Таким образом, они являются ортогональными атрибутами. - person Shelby Moore III; 04.12.2011

Еще пара примеров декларативного программирования:

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

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

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

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

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

MyList.ForEach(DoSometing);

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

  • Если вы перейдете по этой ссылке, вы попадете на запись в блоге моего друга. Весь пост получился длинноватым, но вы можете прокрутить вниз до заголовка «Проблема» _ и без проблем его найти. *
person Joel Coehoorn    schedule 24.09.2008
comment
Вы описываете функциональное программирование, а не декларативное программирование. Атрибут декларативного программирования заключается в том, что не изменяет сохраненные значения. - person Shelby Moore III; 03.12.2011
comment
Декларативное программирование может изменять сохраненные значения ... просто вы указываете (объявляете) то, которое вы хотите изменить, а не то, как именно это делать. Как вы думаете, что еще выполняет инструкция sql INSERT или UPDATE в sql? - person Joel Coehoorn; 04.04.2013
comment
Вы упускаете из виду, что если ваши функции не являются чистыми, то непреднамеренные побочные эффекты могут разрушить связь между тем, что вы объявили, и фактическим поведением программы. Я объяснил это более подробно в новом ответе . - person Shelby Moore III; 22.06.2013

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

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

person Danny Darrie    schedule 30.06.2014