У багатьох статтях, що описують переваги функціонального програмування, я бачив мови функціонального програмування, такі як Haskell, ML, Scala або Clojure, які називаються "декларативними мовами", відмінні від імперативних мов, таких як C / C ++ / C # / Java. Моє питання - що робить функціональні мови програмування декларативними, а не імперативними.
Пояснення, що описує відмінності між декларативним та імперативним програмуванням, часто зустрічається в тому, що в режимі імперативного програмування ви кажете комп'ютеру "Як щось робити" на відміну від "Що робити" в декларативних мовах. Проблема, яку я маю з цим поясненням, полягає в тому, що ви постійно робите обидва на всіх мовах програмування. Навіть якщо ви спускаєтесь до складання найнижчого рівня, ви все ще говорите комп’ютеру "Що робити", ви говорите процесору додати два числа, ви не вказуєте, як виконати додавання. Якщо ми підемо на інший кінець спектру, чистий функціональний мова високого рівня, як Haskell, ти насправді кажеш комп’ютеру, як досягти конкретного завдання, це те, що ваша програма - це послідовність інструкцій для досягнення конкретного завдання, якого комп'ютер не знає, як досягти самостійно. Я розумію, що такі мови, як Haskell, Clojure тощо, явно вищий рівень, ніж C / C ++ / C # / Java, і пропонують такі функції, як ледача оцінка, незмінні структури даних, анонімні функції, currying, стійкі структури даних тощо. функціональне програмування можливе та ефективне, але я б не класифікував їх як декларативні мови.
Чистою мовою декларацій для мене була б така, яка повністю складається лише з декларацій, прикладом таких мов є CSS (Так, я знаю, що CSS технічно не була б мовою програмування). CSS просто містить декларації стилів, які використовуються HTML та Javascript сторінки. CSS не може робити нічого іншого, крім робити декларації, він не може створювати функції класу, тобто функції, які визначають стиль відображення на основі якогось параметра, ви не можете виконувати сценарії CSS тощо. мова програмування ).
Оновлення:
Я нещодавно зіграв із Prolog, і для мене Prolog - це найближча мова програмування до повністю декларативної мови (принаймні, на мою думку), якщо це не єдина повністю декларативна мова програмування. Розробка програмування в Prolog робиться шляхом декларації, яка констатує або факт (предикатну функцію, яка повертає істину для конкретного вводу), або правило (функцію предиката, яка повертає істину для заданої умови / шаблону на основі вхідних даних), правил визначаються за допомогою техніки узгодження зразків. Щоб зробити що-небудь в пролозі, ви запитуєте базу знань, замінюючи один або кілька входів присудка змінною, а пролог намагається знайти значення для змінної (змін), для якої добігає успіх предикат.
Моя думка в тому, що в пролозі немає ніяких імперативних вказівок, ви в основному розповідаєте (декларуєте) комп'ютеру те, що він знає, а потім запитуєте (запитуєте) про знання. У функціональних мовах програмування ви все ще даєте вказівки, тобто приймаєте значення, викликаєте функцію X і додаєте до неї 1 тощо, навіть якщо ви безпосередньо не маніпулюєте місцями пам'яті або виписуєте обчислення покроково. Я б не сказав, що програмування в Haskell, ML, Scala або Clojure є декларативним у цьому сенсі, хоча я можу помилятися. Чи належне, правдиве, чисте функціональне програмування декларативне в тому сенсі, який я описав вище.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(сподіваюся, ви це зрозуміли, Clojure). Моє оригінальне запитання - чим це відрізняється від цього int x = 1; x += 2; x *= x; return x;
На мою думку, це здебільшого те саме.