Dans de nombreux articles, décrivant les avantages de la programmation fonctionnelle, j'ai vu des langages de programmation fonctionnels, tels que Haskell, ML, Scala ou Clojure, appelés "langages déclaratifs" distincts des langages impératifs tels que C / C ++ / C # / Java. Ma question est de savoir ce qui rend les langages de programmation fonctionnels déclaratifs par opposition à impératifs.
Une explication souvent rencontrée décrivant les différences entre la programmation déclarative et impérative est que, dans la programmation impérative, vous dites à l'ordinateur "Comment faire quelque chose" par opposition à "Que faire" dans les langages déclaratifs. Le problème que j'ai avec cette explication est que vous faites constamment les deux dans tous les langages de programmation. Même si vous descendez à l'assemblage de niveau le plus bas, vous dites toujours à l'ordinateur "Que faire", vous dites au CPU d'ajouter deux nombres, vous ne lui demandez pas comment effectuer l'ajout. Si nous allons à l'autre bout du spectre, un langage fonctionnel pur de haut niveau comme Haskell, vous dites en fait à l'ordinateur comment réaliser une tâche spécifique, c'est ce que votre programme est une séquence d'instructions pour réaliser une tâche spécifique que l'ordinateur ne sait pas réaliser seul. Je comprends que les langages tels que Haskell, Clojure, etc. sont évidemment de niveau supérieur à C / C ++ / C # / Java et offrent des fonctionnalités telles que l'évaluation paresseuse, les structures de données immuables, les fonctions anonymes, le curry, les structures de données persistantes, etc. programmation fonctionnelle possible et efficace, mais je ne les classerais pas comme des langages déclaratifs.
Un pur langage déclaratif pour moi serait un langage entièrement composé uniquement de déclarations, un exemple d'un tel langage serait CSS (Oui, je sais que CSS ne serait techniquement pas un langage de programmation). CSS contient juste des déclarations de style qui sont utilisées par le HTML et le Javascript de la page. CSS ne peut rien faire d'autre que faire des déclarations, il ne peut pas créer de fonctions de classe, c'est-à-dire des fonctions qui déterminent le style à afficher en fonction de certains paramètres, vous ne pouvez pas exécuter de scripts CSS, etc. Cela pour moi décrit un langage déclaratif (remarquez que je n'ai pas dit déclaratif langage de programmation ).
Mise à jour:
J'ai joué avec Prolog récemment et pour moi, Prolog est le langage de programmation le plus proche d'un langage entièrement déclaratif (du moins à mon avis), s'il n'est pas le seul langage de programmation entièrement déclaratif. Pour élaborer la programmation dans Prolog se fait en faisant des déclarations qui énoncent soit un fait (une fonction de prédicat qui renvoie vrai pour une entrée spécifique) ou une règle (une fonction de prédicat qui retourne vrai pour une condition / un modèle donné sur la base des entrées), des règles sont définis à l'aide d'une technique d'appariement de motifs. Pour faire quoi que ce soit dans prolog, vous interrogez la base de connaissances en remplaçant une ou plusieurs des entrées d'un prédicat par une variable et prolog essaie de trouver des valeurs pour la ou les variables pour lesquelles le prédicat réussit.
Mon point de vue est que dans prolog il n'y a pas d'instructions impératives, vous dites essentiellement (déclarant) à l'ordinateur ce qu'il sait, puis vous interrogez (interrogez) sur les connaissances. Dans les langages de programmation fonctionnels, vous donnez toujours des instructions, c'est-à-dire prenez une valeur, appelez la fonction X et ajoutez-y 1, etc., même si vous ne manipulez pas directement les emplacements de mémoire ou n'écrivez pas le calcul pas à pas. Je ne dirais pas que la programmation en Haskell, ML, Scala ou Clojure est déclarative dans ce sens, bien que je puisse me tromper. Est une programmation fonctionnelle correcte, vraie et pure déclarative dans le sens que j'ai décrit ci-dessus.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
( j'espère que vous l'avez compris, Clojure). Ma question initiale est de savoir ce qui le rend différent de cet int. x = 1; x += 2; x *= x; return x;
À mon avis, c'est essentiellement la même chose.