In molti articoli, che descrivono i vantaggi della programmazione funzionale, ho visto linguaggi di programmazione funzionale, come Haskell, ML, Scala o Clojure, definiti "linguaggi dichiarativi" distinti da linguaggi imperativi come C / C ++ / C # / Java. La mia domanda è cosa rende i linguaggi di programmazione funzionale dichiarativi anziché imperativi.
Una spiegazione spesso riscontrata che descrive le differenze tra la programmazione dichiarativa e quella imperativa è che nella programmazione imperativa si dice al computer "Come fare qualcosa" anziché "Cosa fare" nei linguaggi dichiarativi. Il problema che ho con questa spiegazione è che stai facendo costantemente entrambi in tutti i linguaggi di programmazione. Anche se si scende all'assemblaggio di livello più basso, si sta ancora dicendo al computer "Cosa fare", si dice alla CPU di aggiungere due numeri, non si istruisce su come eseguire l'aggiunta. Se andiamo dall'altra parte dello spettro, un linguaggio funzionale puro di alto livello come Haskell, in realtà stai dicendo al computer come realizzare un compito specifico, questo è ciò che il tuo programma è una sequenza di istruzioni per realizzare un compito specifico che il computer non sa come realizzare da solo. Comprendo che linguaggi come Haskell, Clojure, ecc. Sono ovviamente di livello superiore rispetto a C / C ++ / C # / Java e offrono funzionalità come valutazione pigra, strutture di dati immutabili, funzioni anonime, curry, strutture di dati persistenti, ecc. Tutto ciò che rende programmazione funzionale possibile ed efficiente, ma non li classificherei come linguaggi dichiarativi.
Un linguaggio dichiarativo puro per me sarebbe uno che è composto esclusivamente da dichiarazioni, un esempio di tali linguaggi sarebbe CSS (Sì, lo so che CSS non sarebbe tecnicamente un linguaggio di programmazione). CSS contiene solo dichiarazioni di stile utilizzate da HTML e Javascript della pagina. Il CSS non può fare nient'altro oltre a fare dichiarazioni, non può creare funzioni di classe, ovvero funzioni che determinano lo stile da visualizzare in base ad alcuni parametri, non è possibile eseguire script CSS, ecc. Che per me descrive un linguaggio dichiarativo (nota che non ho detto dichiarativo linguaggio di programmazione ).
Aggiornare:
Ho giocato con Prolog di recente e per me Prolog è il linguaggio di programmazione più vicino a un linguaggio pienamente dichiarativo (almeno secondo me), se non è l'unico linguaggio di programmazione pienamente dichiarativo. Elaborare la programmazione in Prolog è fatto facendo dichiarazioni che affermano o un fatto (una funzione predicata che ritorna vera per un input specifico) o una regola (una funzione predicata che ritorna vera per una data condizione / modello basata sugli input), regole sono definiti usando una tecnica di corrispondenza del modello. Per fare qualsiasi cosa in prolog, è necessario interrogare la knowledge base sostituendo uno o più input di un predicato con una variabile e prolog cerca di trovare valori per le variabili per cui il predicato ha esito positivo.
Il mio punto è nel prologo: non ci sono istruzioni imperative, in sostanza stai dicendo (dichiarando) al computer ciò che sa e poi chiedendo (interrogando) sulla conoscenza. Nei linguaggi di programmazione funzionale stai ancora dando istruzioni, cioè prendi un valore, chiama la funzione X e aggiungi 1 ad essa, ecc., Anche se non stai manipolando direttamente le posizioni di memoria o scrivendo il calcolo passo dopo passo. Non direi che la programmazione in Haskell, ML, Scala o Clojure sia dichiarativa in questo senso, anche se potrei sbagliarmi. È vera, vera, pura programmazione funzionale dichiarativa nel senso che ho descritto sopra.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(spero che tu l'abbia capito, Clojure). La mia domanda originale è ciò che rende questo diverso da questo int x = 1; x += 2; x *= x; return x;
Secondo me è principalmente lo stesso.