В чем разница между парадигмами декларативного и процедурного программирования?


97

В чем разница между парадигмами декларативного и процедурного программирования? Не могли бы вы привести несколько примеров?

Какие еще существуют парадигмы программирования?


2
Аналогичный вопрос: stackoverflow.com/questions/1784664/…
daCoda 04

Ответы:


108

Императив

Есть несколько подпарадигм парадигмы императивного программирования, таких как парадигмы процедурного или объектно-ориентированного программирования.

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

Примеры языков программирования, поддерживающих процедурную парадигму:

  • C (и большинство других устаревших языков)
  • PHP, в основном
  • В некотором смысле все основные языки

Объектно-ориентированный

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

Примеры языков программирования, поддерживающих объектно-ориентированную парадигму:

  • Ява

Декларативная

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

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

Примеры языков программирования, поддерживающих парадигму декларативного программирования:

  • yacc
  • Верхушка дерева
  • SQL
  • Регулярные выражения
  • lex
  • XSLT
  • разметка, troff, CSS, VHDL

Функциональный

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

Примеры языков программирования, поддерживающих декларативную функциональную парадигму:

  • Haskell
  • OCaml
  • Схема
  • Erlang
  • F #
  • Scala

61

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

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


2
+1 за хороший пример на SQL. можно еще примеры?
mauris

5
Маурис: Возможно, это не язык программирования, но HTML декларативен, потому что вы описываете то, что хотите (абзац с этим битом выделен жирным шрифтом), а не пишете «рисовать строку, измерять строку, продвигать позицию и т. Д.» Другой пример - Пролог, где «программа» - это декларативный набор фактов и отношений / выводов, а также запрос. Механизм Prolog определяет, как оценивать запрос: вам не нужно указывать, как это делать. Наконец, регулярные выражения: вы описываете шаблон, а не описываете шаги для проверки совпадения.
itowlson,

MXML (часть инфраструктуры Flex) является декларативным: вы указываете ему, в каком порядке должны отображаться ваши объекты / контейнеры, и он обрабатывает макет в зависимости от того, сказали ли вы, чтобы он располагался горизонтально или вертикально. ActionScript 3 является процедурным с поддержкой парадигм ООП.
Ура, я помогаю,

makefiles - еще один довольно известный декларативный язык
Стефано Борини

25

Приведу реальный пример: мне нужна чашка чая.

Процедурные:

  1. Иди на кухню
  2. Возьми сахар, молоко и чай,
  3. Смешайте их и нагрейте на огне до кипения.
  4. Положи это в чашку и принеси мне

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

  1. Принеси мне чашку чая.

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

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


2
Этот чрезвычайно упрощенный пример на самом деле привел меня к сути (немного). Но одна вещь все еще беспокоит меня, пытаясь понять разницу - что, если нет команды «Дай мне чашку чая»? Придется ли вам тогда создать его самостоятельно? Если да, разве вы не создали бы функцию, аналогичную процедурному примеру? Я предполагаю, что меня смущает то, что кажется, что процедурные и декларативные - это не фиксированные свойства какого-либо конкретного языка , а скорее то, как вы используете этот язык? Вы могли бы сказать «Дайте мне чашку чая» на Яве, если это доступный метод ...
Магнус В.

4
Интересно, может ли «1. Tea, Earl Grey, Hot» быть лучшим примером. Он объявляет, что нужно доставить, а не какие действия нужно выполнить («Получите меня ...»)
JeffUK

Магнус, твой вопрос абсолютно правильный. На мой взгляд, декларативные языки являются языками более высокого уровня и являются производными от процедурных. Помните то время, когда разработчикам приходилось использовать командные строки для сложения двух чисел? Теперь вы можете получить СУММ двух или более чисел с помощью простой функции. Так что, с моей точки зрения, если нет команды «Дай мне чашку чая», тебе нужно ее создать. Когда следующий человек попытается использовать, он будет там. Это по моим плохим знаниям. Спасибо
Мухаммад Зишан Тахир

5

Процедурное программирование:

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

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

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


0

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


0

Чтобы обратиться к доступному комментарию и, возможно, предоставить пример различий между ними. Ansible является процедурным, в то время как что-то вроде puppet или terraform декларативно. Например, вы создаете доступный файл yaml для развертывания 10 экземпляров ec2 следующим образом:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Если бы вы дважды запускали этот файл, у вас бы получилось 20 экземпляров t2.micro ec2. Если бы вы написали эквивалент на декларативном языке, таком как terraform, и запустили его дважды, у вас будет запущено только 10 экземпляров t2.micro независимо от того, сколько раз вы его запускали. Декларативные языки определяют конечное состояние. Процедурные языки просто делают то, что вы им говорите, независимо от текущего или прошлого состояния.


-1

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

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



Это больше похоже на очень
твердый

-2

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

Как вы увидите в примере, при декларативном подходе вам не нужно указывать, КАК решить проблему.


Вы ссылаетесь на сторонние примеры, как если бы они были здесь написаны. Приведите свои примеры как часть ответа.
ChronoFish
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.