Я продолжаю слышать этот термин в нескольких разных контекстах. Что это?
programming-languages
declarative
glossary
Брайан Дж.
источник
источник
Ответы:
Декларативное программирование - это когда вы пишете свой код таким образом, что он описывает то, что вы хотите сделать, а не то, как вы хотите это сделать. Это зависит от компилятора, чтобы выяснить, как.
Примерами декларативных языков программирования являются SQL и Prolog.
источник
Другие ответы уже проделали фантастическую работу, объясняя, что такое декларативное программирование, поэтому я просто приведу несколько примеров того, почему это может быть полезно.
Независимость контекста
Декларативные программы не зависят от контекста . Поскольку они объявляют только то, что является конечной целью, но не промежуточные шаги для достижения этой цели, одну и ту же программу можно использовать в разных контекстах. Это трудно сделать с императивными программами , потому что они часто зависят от контекста (например, скрытого состояния).
Взять хотя
yacc
бы пример. Это генератор парсеров ака. compiler compiler, внешний декларативный DSL для описания грамматики языка, так что анализатор для этого языка может автоматически генерироваться из описания. Из-за его независимости от контекста вы можете делать много разных вещей с такой грамматикой:yacc
)И многое другое ...
оптимизация
Поскольку вы не прописываете компьютеру, какие шаги и в каком порядке предпринять, он может гораздо более свободно переставлять вашу программу, возможно, даже выполнять некоторые задачи параллельно. Хорошим примером является планировщик запросов и оптимизатор запросов для базы данных SQL. Большинство баз данных SQL позволяют отображать запрос, который они фактически выполняют, по сравнению с запросом, который вы просили их выполнить. Часто эти запросы ничего не выглядяткак друг друга Планировщик запросов принимает во внимание то, о чем вы даже не мечтали: например, задержку вращения диска, или тот факт, что какое-то совершенно другое приложение для совершенно другого пользователя только что выполнило аналогичный запрос и таблицу, которой вы являетесь. соединение с тем, что вы так усердно работали, чтобы избежать загрузки, уже есть в памяти.
Существует интересный Компромисс здесь: машина должна работать , чтобы выяснить , как сделать что - то , чем это было бы в императивном языке, но когда это делает фигуру его, он имеет гораздо больше свободы и гораздо больше информации для оптимизации этап.
источник
Неплотно:
Декларативное программирование имеет тенденцию к:
Императивное программирование имеет тенденцию к: -
В результате императивный стиль помогает читателю понять механику того, что система на самом деле делает, но может дать мало понимания проблемы, которую она призвана решить. С другой стороны, декларативный стиль помогает читателю понять предметную область и подход, который система использует для решения проблемы, но менее информативен в механике.
Реальные программы (даже написанные на языках, которые поддерживают концы спектра, такие как ProLog или C) имеют тенденцию к тому, чтобы оба стиля присутствовали в различной степени в разных точках, чтобы удовлетворить различные сложности и коммуникационные потребности произведения. Один стиль не превосходит другой; они просто служат различным целям, и, как и во многих вещах в жизни, умеренность является ключевым фактором.
источник
Вот пример.
В CSS (используется для стилизации HTML-страниц), если вы хотите, чтобы элемент изображения имел высоту 100 пикселей и ширину 100 пикселей, вы просто «объявляете», что вы хотите следующее:
Вы можете считать CSS декларативным языком «таблиц стилей».
Движок браузера, который читает и интерпретирует этот CSS, свободен, чтобы изображение выглядело таким высоким и таким широким, как ему хочется. Различные движки браузера (например, движок для IE, движок для Chrome) будут выполнять эту задачу по-разному.
Их уникальные реализации, конечно, НЕ написаны на декларативном языке, а на процедурном, таком как Assembly, C, C ++, Java, JavaScript или Python. Этот код представляет собой набор шагов, которые необходимо выполнить шаг за шагом (и может включать вызовы функций). Это может делать такие вещи, как интерполяция значений пикселей и рендеринг на экране.
источник
Извините, но я должен не согласиться со многими другими ответами. Я хотел бы остановить это запутанное недопонимание определения декларативного программирования.
Определение
Ссылочная прозрачность (RT) подвыражений является единственным обязательным атрибутом декларативного выражения программирования , поскольку это единственный атрибут, который не используется в императивном программировании.
Другие процитированные атрибуты декларативного программирования происходят из этого RT. Пожалуйста, нажмите гиперссылку выше для подробного объяснения.
Пример электронной таблицы
В двух ответах упоминается программирование электронных таблиц. В случаях, когда программирование электронных таблиц (или формул) не имеет доступа к изменяющемуся глобальному состоянию, тогда это декларативное программирование. Это потому , что изменяемые значения ячеек являются монолитным вводом и выводом из
main()
(всей программы). Новые значения не записываются в ячейки после выполнения каждой формулы, поэтому они не изменяются в течение всего срока действия декларативной программы (выполнение всех формул в электронной таблице). Таким образом, по отношению друг к другу формулы рассматривают эти изменчивые клетки как неизменные. RT-функции разрешен доступ к неизменяемому глобальному состоянию (а также к изменяемому локальному состоянию ).Таким образом, способность изменять значения в ячейках при завершении программы (как вывод из
main()
) не делает их изменяемыми хранимыми значениями в контексте правил. Ключевым отличием является то, что значения ячеек не обновляются после выполнения каждой формулы электронной таблицы, поэтому порядок выполнения формул не имеет значения. Значения ячеек обновляются после выполнения всех декларативных формул.источник
Декларативное программирование - это картинка, где императивное программирование - это инструкции для рисования этой картины.
Вы пишете в декларативном стиле, если вы «рассказываете, что это такое», а не описываете шаги, которые компьютер должен предпринять, чтобы добраться туда, куда вы хотите.
Когда вы используете XML для разметки данных, вы используете декларативное программирование, потому что вы говорите: «Это человек, у которого день рождения, и у него есть уличный адрес».
Некоторые примеры, где декларативное и императивное программирование объединяются для большего эффекта:
Windows Presentation Foundation использует декларативный синтаксис XML для описания того, как выглядит пользовательский интерфейс и каковы связи (привязки) между элементами управления и базовыми структурами данных.
Структурированные файлы конфигурации используют декларативный синтаксис (так же просто, как пары «ключ = значение»), чтобы определить, что означает строка или значение данных.
HTML отмечает текст тегами, которые описывают роль каждого фрагмента текста по отношению ко всему документу.
источник
Декларативное программирование - это программирование с декларациями, то есть декларативными предложениями. Декларативные предложения имеют ряд свойств, которые отличают их от императивных предложений. В частности, декларации:
Важным моментом является то, что все это структурные свойства и они ортогональны предмету. Декларативный не о «Что против как» . Мы можем объявить (представить и ограничить) «как» так же легко, как и «что» . Декларативный - это структура, а не содержание.Декларативное программирование оказывает существенное влияние на то, как мы абстрагируем и рефакторизируем наш код, и на то, как мы его модульно превращаем в подпрограммы, но не так сильно на модель предметной области.
Часто мы можем перейти от императивного к декларативному, добавив контекст. Например, из "Поверните налево. (... подождите ...) Поверните направо". to «Боб повернет налево на пересечении Фу и Бара в 11:01. Боб повернет направо на пересечении Бара и Бэза в 11:06». Обратите внимание, что в последнем случае предложения являются идемпотентными и коммутативными, тогда как в первом случае перестановка или повторение предложений сильно изменили бы смысл программы.
Что касается монотонности , объявления могут добавлять ограничения, которые вычитают возможности . Но ограничения по-прежнему добавляют информацию (точнее, ограничения - это информация). Если нам нужны изменяющиеся во времени объявления, типично моделировать это с явной временной семантикой - например, от «шар плоский» к «шар плоский в момент времени T». Если у нас есть две противоречивые декларации, у нас есть несовместимая декларативная система, хотя это может быть решено путем введения мягких ограничений (приоритетов, вероятностей и т. Д.) Или использования паранепротиворечивой логики.
источник
Описывать компьютеру, что вы хотите, а не как что-то делать.
источник
представьте себе страницу Excel. С колонками, заполненными формулами для расчета налоговой декларации.
Вся логика объявлена в ячейках, порядок вычисления определяется самой формулой, а не процедурно.
Это своего рода декларативное программирование. Вы объявляете проблемное пространство и решение, а не поток программы.
Пролог - единственный декларативный язык, который я использую. Это требует другого типа мышления, но хорошо учиться, если просто подвергнуть вас чему-то другому, кроме типичного процедурного языка программирования.
источник
Я усовершенствовал свое понимание декларативного программирования с декабря 2011 года, когда дал ответ на этот вопрос. Здесь следует мое текущее понимание.
Длинная версия моего понимания (исследования) подробно описана по этой ссылке , которую вы должны прочитать, чтобы получить глубокое понимание резюме, которое я приведу ниже.
В императивном программировании изменяемое состояние хранится и читается, поэтому упорядочение и / или дублирование инструкций программы может изменить поведение (семантику) программы (и даже вызвать ошибку, то есть непреднамеренное поведение).
В самом наивном и крайнем смысле (который я утверждал в моем предыдущем ответе) декларативное программирование (DP) избегает всех сохраняемых изменяемых состояний, поэтому упорядочение и / или дублирование программных инструкций НЕ МОЖЕТ изменить поведение (семантику) программы. ,
Однако такое экстремальное определение не будет очень полезным в реальном мире, так как почти каждая программа использует хранимое изменяемое состояние. В примере таблицы соответствует этому определению крайнего ДП, потому что весь программный код выполняется до завершения одной статической копии входного состояния, до того , как новые состояния сохраняются. Затем, если какое-либо состояние изменяется, это повторяется. Но большинство реальных программ не могут быть ограничены такой монолитной моделью изменений состояния.
Более полезное определение DP заключается в том, что упорядочение и / или дублирование инструкций программирования не изменяет никакой непрозрачной семантики. Другими словами, не происходит скрытых случайных изменений в семантике - любые изменения в порядке команд программы и / или дублировании вызывают только предполагаемые и прозрачные изменения в поведении программы.
Следующим шагом было бы поговорить о том, какие модели программирования или парадигмы помогают в DP, но это не вопрос здесь.
источник
Functional programming
это модное слово в наши дни, которое по сути является подмножеством декларативного программирования. LINQ в языке C # является элементом функционального программирования, когда сам язык является обязательным по своей природе. Таким образом, C # становится своего рода гибридом в соответствии с этим определением.Это метод программирования, основанный на описании того, что что- то должно делать или быть, а не на том, как это должно работать.
Другими словами, вы не пишете алгоритмы, составленные из выражений, вы просто размечаете, как вы хотите, чтобы все было. Два хороших примера - это HTML и WPF.
Эта статья в Википедии - хороший обзор: http://en.wikipedia.org/wiki/Declarative_programming
источник
Поскольку я написал свой предыдущий ответ, я сформулировал новое определение декларативного свойства, которое приводится ниже. Я также определил императивное программирование как двойственное свойство.
Это определение лучше того, которое я дал в моем предыдущем ответе, потому что оно лаконично и носит более общий характер. Но это может быть более трудным для понимания, потому что значение теорем о неполноте, применимых к программированию и жизни в целом, людям трудно обернуть вокруг себя.
В приведенном объяснении этого определения обсуждается роль, которую чисто функциональное программирование играет в декларативном программировании.
Изменить: я разместил следующий комментарий в блоге Роберта Харпера:
источник
Декларативное программирование - это «акт программирования на языках, которые соответствуют ментальной модели разработчика, а не операционной модели машины».
Разница между декларативным и императивным программированием хорошо иллюстрируется проблемой анализа структурированных данных.
Императивная программа будет использовать взаимно рекурсивные функции для потребления ввода и генерации данных. Декларативная программа выражает грамматику, которая определяет структуру данных, чтобы затем их можно было проанализировать.
Разница между этими двумя подходами заключается в том, что декларативная программа создает новый язык, который более точно сопоставлен с ментальной моделью проблемы, чем с ее основным языком.
источник
Это может показаться странным, но я бы добавил Excel (или любую другую электронную таблицу) в список декларативных систем. Хороший пример этого приведен здесь .
источник
Я бы объяснил это, так как DP - это способ выразить
... и там, где есть механизм вычитания, обычно работающий с алгоритмом унификации , чтобы найти цели.
источник
Насколько я могу судить, он начал использоваться для описания систем программирования, таких как Пролог, потому что пролог (предположительно) предназначен для объявления вещей абстрактно.
Это все больше значит очень мало, поскольку имеет определение, данное пользователями выше. Должно быть ясно, что существует декларация между декларативным программированием на Haskell, в отличие от декларативного программирования на HTML.
источник
Пара других примеров декларативного программирования:
Декларативное программирование - это хорошо, потому что оно может помочь упростить вашу ментальную модель * кода и потому, что оно может в конечном итоге стать более масштабируемым.
Например, допустим, у вас есть функция, которая делает что-то для каждого элемента в массиве или списке. Традиционный код будет выглядеть так:
Ничего страшного там нет. Но что, если вы используете более декларативный синтаксис и вместо этого определяете DoSomething () как действие? Тогда вы можете сказать это так:
Это, конечно, более кратко. Но я уверен, что у вас больше проблем, чем просто сохранение двух строк кода здесь и там. Производительность, например. По старинке обработка должна была выполняться последовательно. Что если у метода .ForEach () есть способ сообщить о том, что он может обрабатывать обработку параллельно, автоматически? Внезапно вы сделали свой код многопоточным очень безопасным способом и изменили только одну строку кода. И, собственно, есть расширение для .Net, которое позволяет вам это делать.
источник
Это зависит от того, как вы отправляете ответ на текст. В целом вы можете посмотреть на программу с определенной точки зрения, но это зависит от того, под каким углом вы смотрите на проблему. Я начну с программы: Dim Bus, Car, Time, Height As Integr
Опять же, это зависит от того, что проблема в целом. Возможно, вам придется сократить его из-за программы. Надеюсь, что это помогает и нужна обратная связь, если это не так. Спасибо.
источник