In molti articoli, che descrivono i vantaggi della programmazione funzionale, ho visto linguaggi di programmazione funzionali, come Haskell, ML, Scala o Clojure, denominati "linguaggi dichiarativi" distinti dai linguaggi imperativi come C / C ++ / C # / Giava. La mia domanda è ciò che rende i linguaggi di programmazione funzionale dichiarativi rispetto all'imperativo.
Una spiegazione spesso incontrata che descrive le differenze tra la programmazione dichiarativa e quella imperativa è che nella programmazione imperativa si dice al computer "Come fare qualcosa" invece di "Cosa fare" nelle lingue dichiarative. Il problema che ho con questa spiegazione è che tu 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 ottenere un compito specifico, cioè quello che il tuo programma è una sequenza di istruzioni per raggiungere un compito specifico che il computer non sa come ottenere da solo. Comprendo che linguaggi come Haskell, Clojure, ecc. Sono ovviamente di livello superiore a C / C ++ / C # / Java e offrono funzionalità come valutazione lazy, strutture dati immutabili, funzioni anonime, curry, strutture dati persistenti, ecc. programmazione funzionale possibile ed efficiente, ma non li classificherei come linguaggi dichiarativi.
Un puro linguaggio dichiarativo per me sarebbe uno che è interamente composto solo da dichiarazioni, un esempio di tali linguaggi sarebbe CSS (Sì, so che CSS non sarebbe tecnicamente un linguaggio di programmazione). Il CSS contiene solo dichiarazioni di stile che vengono utilizzate dall'HTML e Javascript della pagina. I CSS non possono fare altro che fare dichiarazioni, non possono creare funzioni di classe, cioè 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 (avviso non ho detto dichiarativo programmazione lingua).
Aggiornamento:
Recentemente ho giocato con Prolog 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 avviene facendo dichiarazioni che dichiarano un fatto (una funzione di predicato che restituisce true per un input specifico) o una regola (una funzione di predicato che restituisce true per una data condizione / modello in base agli input), regole sono definiti utilizzando una tecnica di abbinamento del modello. Per fare qualsiasi cosa in prolog, si interroga la knowledge base sostituendo uno o più input di un predicato con una variabile e prolog prova a trovare i valori per la variabile o le variabili per le quali il predicato ha successo.
Il mio punto è in prolog non ci sono istruzioni imperative, fondamentalmente stai dicendo (dichiarando) al computer quello che sa e poi chiedendo (interrogando) sulla conoscenza. Nei linguaggi di programmazione funzionale date ancora delle istruzioni, cioè prendete un valore, chiamate la funzione X e aggiungetene 1, ecc., Anche se non state manipolando direttamente le posizioni di memoria o scrivendo il calcolo passo dopo passo. Non direi che la programmazione in Haskell, ML, Scala o Clojure è dichiarativa in questo senso, anche se potrei sbagliarmi. È corretto, vero, puro programmatore funzionale dichiarativo nel senso che ho descritto sopra.