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


97

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

Які ще існують парадигми програмування?


2
Схожий питання: stackoverflow.com/questions/1784664 / ...
daCoda

Відповіді:


108

Імператив

Існує кілька підпарадигм імперативної парадигми програмування, таких як процедурна або об’єктно-орієнтована парадигми програмування.

У парадигмі імперативного програмування ви описуєте алгоритм поетапно на різних ступенях абстракції.

Приклади мов програмування, які підтримують процедурну парадигму:

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

Об’єктно-орієнтований

Зазвичай він відноситься до мов, які демонструють ієрархію типів, які успадковують як методи, так і стан від базових типів до похідних типів, але також включає незвичайний JavaScript на основі прототипів.

Приклади мов програмування, які підтримують парадигму ОО:

  • Java

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

Існує кілька суб-парадигм декларативної парадигми програмування, таких як функціональна або логічна парадигми програмування.

У декларативній парадигмі програмування ви описуєте результат або мету, і отримуєте їх через " чорний ящик ". Протилежність імперативу.

Приклади мов програмування, які підтримують декларативну парадигму програмування:

  • yacc
  • Верхівка дерева
  • SQL
  • Регулярні вирази
  • лекс
  • XSLT
  • розмітка, троф, CSS, VHDL

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

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

Приклади мов програмування, які підтримують декларативну функціональну парадигму:

  • Хаскелл
  • OCaml
  • Схема
  • Ерланг
  • F #
  • Скала

61

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

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


2
+1 для гарного прикладу на SQL. ми можемо отримати більше прикладів, будь ласка?
mauris

5
Моріс: Можливо, це не мова програмування, але HTML є декларативним, тому що ви описуєте те, що хочете (абзац із цим бітом напівжирним шрифтом), а не виписуєте "намалювати рядок, виміряти рядок, позицію пересування тощо". Інший приклад - Prolog, де "програма" - це декларативний набір фактів та відносин / відрахувань та запит. Механізм Prolog з’ясовує, як оцінити запит: вам не потрібно говорити йому, як це зробити. Нарешті, регулярні вирази: ви описуєте шаблон, а не прописуєте кроки для перевірки відповідності.
itowlson

MXML (частина фреймворку Flex) є декларативним: ви повідомляєте йому, в якому порядку ви хочете, щоб відображалися ваші об'єкти / контейнери, і він обробляє макет залежно від того, сказали ви йому розташуватись горизонтально чи вертикально. ActionScript 3 є процедурним із підтримкою парадигм ООП.
Hooray Im Helping

makefiles - ще одна досить відома декларативна мова
Стефано Боріні,

25

Дозвольте навести вам реальний приклад: мені потрібна чашка чаю.

Процедурні:

  1. Йди на кухню
  2. Отримайте цукор, молоко та чай,
  3. Змішайте їх і нагрівайте на вогні, поки він не закипить
  4. Покладіть це в чашку і принесіть мені

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

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

Мовою процедури ви визначаєте весь процес і надаєте кроки, як це зробити. Ви просто надаєте замовлення та визначаєте, як буде обслуговуватися процес.

Декларативною мовою ви просто встановлюєте команду або порядок і дозволяєте в системі отримувати інформацію про те, як виконати це замовлення. Вам просто потрібен ваш результат, не заглиблюючись у те, як це слід робити.


2
Цей надзвичайно спрощений приклад насправді (трохи) привів мене додому. Але одна річ все ще змушує мене намагатися зрозуміти різницю - а що, якщо немає команди "Принеси мені чашку чаю"? Вам тоді довелося б створити його самостійно? Якщо так, то чи не створили б ви функцію, подібну до процедурного прикладу? Я здогадуюсь, що мене бентежить, здається, що процедурні та декларативні не є фіксованими властивостями будь-якої конкретної мови , а скоріше як ви використовуєте цю мову? Можна сказати "Принеси мені чашку чаю" на Java, якщо це доступний метод ...
Magnus W

3
Цікаво, чи "1. Чай, Ерл Грей, Гарячий" буде кращим прикладом. Це декларування того, що потрібно виконати, а не які дії потрібно здійснити („
Зробити

Магнус, твоє запитання абсолютно правильне. На мою думку, декларативні мови є мовами більш високого рівня і походять від процедурних. Пам'ятаєте час, коли розробники повинні використовувати командні рядки для додавання двох чисел? Тепер ви можете отримати SUM двох або більше чисел за допомогою простої функції. Отже, з моєї точки зору, якщо немає команди "Принеси мені чашку чаю", її потрібно створити. Коли наступна людина спробує використовувати, вона буде там. Це згідно з моїми поганими знаннями. Подяка
Мухаммад Зеешан Тахір

5

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

У процедурному програмуванні, коли програма запускається, вона виконує набір інструкцій. Інструкції можуть змінюватися залежно від вмісту деяких файлів або пам'яті, але загалом вони не сильно відрізняються. введення в програму, як правило, здійснюється не з введення користувачем у реальному часі, а з попередньо зібраного набору даних.

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

У програмі, що керується Декларативною подією, централізується навколо масиву даних за допомогою необов’язкових дій, які програма може виконувати над ними. Наприклад, кожна "подія" в текстовому процесорі - це будь-які зміни миші чи клавіатури (або файлу), що впливають на дані, документ (и). Їх не потрібно виконувати в будь-якому порядку. Управління подіями програмування має форму невеликих програм (обробників подій), які всі працюють над загальним набором даних, так що кожна невелика програма може використовувати однакові дані, документ у цьому прикладі.


1

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


0

Щоб звернутися до коментаря, що відповідає, і, можливо, навести приклад між відмінностями цих двох. Ансибіл є процедурним, коли як щось на зразок маріонетки чи тераформи є декларативними. Наприклад, ви створюєте файл ansible 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, але все ще потрапляє в категорію процедурної мови.


Перегляньте цей щоденник linuxacademy.com/blog/linux-academy/ansible-vs-terraform-fight
Lijo Abraham

Це більше схоже на дуже
твердий

-2

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

Як ви могли б побачити на прикладі, в декларативному підході вам не потрібно вказувати ЯК вирішити проблему.


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