En informatique , la programmation purement fonctionnelle désigne généralement un paradigme de programmation — un style de construction de la structure et des éléments des programmes informatiques — qui traite tout calcul comme l’évaluation de fonctions mathématiques .
L'état du programme et les objets mutables sont généralement modélisés à l'aide de la logique temporelle , sous forme de variables explicites représentant l'état du programme à chaque étape de son exécution : une variable d'état est passée en paramètre d'une fonction de transformation d'état, laquelle renvoie l'état mis à jour. Ce style permet de gérer les changements d'état sans altérer la transparence référentielle des expressions du programme.
La programmation purement fonctionnelle consiste à garantir que les fonctions, au sein de ce paradigme , ne dépendent que de leurs arguments, indépendamment de tout état global ou local. Une sous-routine purement fonctionnelle n'a de visibilité que sur les changements d'état représentés par les variables d'état incluses dans sa portée.
les stratégies d'évaluation courantes (appel par nom, appel par valeur et appel par besoin) produisent le même résultat, en ignorant les stratégies qui génèrent des erreurs ou divergent.On dit généralement qu'un programme est fonctionnel lorsqu'il utilise certains concepts de la programmation fonctionnelle , tels que les fonctions de première classe et les fonctions d'ordre supérieur . Cependant, une fonction de première classe n'est pas nécessairement purement fonctionnelle ; elle peut en effet recourir à des techniques issues du paradigme impératif , comme les tableaux ou les méthodes d'entrée/sortie utilisant des cellules mutables, dont l'état est mis à jour par des effets de bord. De fait, les premiers langages de programmation considérés comme fonctionnels, IPL et Lisp , sont tous deux des langages fonctionnels « impurs » selon la définition de Sabry.
Propriétés de la programmation purement fonctionnelle
Évaluation stricte versus évaluation non stricte
Calcul parallèle
Dans un langage purement fonctionnel, les seules dépendances entre les calculs sont des dépendances de données, et les calculs sont déterministes. Par conséquent, pour programmer en parallèle, le programmeur n'a qu'à spécifier les parties à calculer en parallèle, et l'environnement d'exécution se charge de tous les autres détails, tels que la distribution des tâches aux processeurs, la gestion de la synchronisation et de la communication, et le nettoyage de la mémoire en parallèle. Ce style de programmation évite les problèmes courants tels que les conditions de concurrence et les interblocages, mais offre moins de contrôle qu'un langage impératif.
Pour garantir un gain de vitesse, la granularité des tâches doit être soigneusement choisie afin d'être optimale. En théorie, il est possible d'utiliser le profilage à l'exécution et l'analyse à la compilation pour déterminer si l'introduction de parallélisme accélérera le programme, et ainsi paralléliser automatiquement les programmes purement fonctionnels. En pratique, cette approche n'a pas été très concluante, et la parallélisation entièrement automatique reste difficilement réalisable.
structures de données
Les structures de données purement fonctionnelles sont souvent représentées différemment de leurs homologues impératives . Par exemple, les tableaux, avec accès et mise à jour en temps constant, constituent un composant de base de la plupart des langages impératifs, et de nombreuses structures de données impératives, telles que les tables de hachage et les tas binaires , sont basées sur des tableaux. Ces derniers peuvent être remplacés par des dictionnaires ou logarithmique . Par conséquent, les structures de données purement fonctionnelles peuvent être utilisées dans des langages non fonctionnels, mais elles ne constituent pas nécessairement l'outil le plus efficace, notamment si la persistance des données n'est pas requise.
En général, la conversion d'un programme impératif en un programme purement fonctionnel nécessite également de s'assurer que les structures autrefois mutables sont désormais explicitement renvoyées par les fonctions qui les mettent à jour, une structure de programme appelée style de passage de mémoire .