Programmation fonctionnelle
Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.
Langages à objets
C++ - C# - D
Delphi - Eiffel - Groovy
Java - Python - Ruby
Simula - Smalltalk
Visual Basic - Lisaac - WinDev
Langages impératifs
APL - ASP - Assembleur
BASIC (En programmation, BASIC est un acronyme pour Beginner's All-purpose Symbolic Instruction Code. qui désigne une famille de langages de programmations de haut niveau.) - C - Cobol (COBOL est un langage de programmation de troisième génération créé en 1959 (officiellement le 18 Septembre 1959). Son nom est l'acronyme de COmmon Business Oriented Language qui révèle...)
Forth - Fortran - Limbo
Logo - Pascal - Perl - PHP (PHP (sigle de PHP: Hypertext Preprocessor), est un langage de scripts libre principalement utilisé pour produire des pages Web dynamiques via un serveur HTTP, mais pouvant également fonctionner comme n'importe quel...)
Langages fonctionnels
Haskell - ML/OCaml
Lisp/Common Lisp
Scheme - XSLT
Langages déclaratifs
Clips - Prolog
Langages concurrents
Ada 95 - Erlang
Voir aussi
Conception - Codage (De façon générale un codage permet de passer d'une représentation des données vers une autre.)
Tests - Optimisations

Un langage fonctionnel est un langage de programmation (Un langage de programmation est un langage informatique, permettant à un être humain d'écrire un code source qui sera analysé par une machine, généralement un...) dont la syntaxe et les caractéristiques encouragent la programmation fonctionnelle (Un langage fonctionnel est un langage de programmation dont la syntaxe et les caractéristiques encouragent la programmation fonctionnelle. Le langage fonctionnel le plus ancien est le...). Le langage fonctionnel le plus ancien est le Lisp, créé en 1958 par Mac Carthy. Lisp a donné naissance à des variantes plus récentes telles que le Scheme (1975), le Common Lisp (1984). D'autres langages fonctionnels récents incluent les langages ML (1973), Haskell (1987), Erlang, Clean et Oz ou CDuce (2003). Dans la catégorie des langages non ML, il ne faut pas oublier XSLT et Anubis.

Machine d'états et effets de bord

Programmation impérative (En informatique, la programmation impérative est un paradigme de programmation qui décrit les opérations en termes d'états du programme et de séquences d'instructions exécutées par l'ordinateur pour modifier l'état du...)

En programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent l'écriture des programmes informatiques. C'est une étape importante de la conception de logiciel (voire de...) impérative, on travaille sur le modèle des machines à états (cf Automate (Un automate est un dispositif se comportant de manière automatique, c'est-à-dire sans intervention d'un humain. Ce comportement peut être figé, le système fera toujours la même chose, ou bien peut s'adapter à son environnement.) fini, machine de Turing et Architecture (L’architecture peut se définir comme l’art de bâtir des édifices.) de von Neumann), avec une mémoire (D'une manière générale, la mémoire est le stockage de l'information. C'est aussi le souvenir d'une information.) centrale et des instructions qui modifient son état grâce à des assignations successives. On peut représenter un programme par une machine d'états qui représente les états successifs de la mémoire. Cela nécessite pour le programmeur (En informatique, un développeur (ou programmeur) est un informaticien qui réalise du logiciel en créant des algorithmes et en les mettant en œuvre dans un langage de programmation.) de connaître à tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou l'univers.) instant (L'instant désigne le plus petit élément constitutif du temps. L'instant n'est pas intervalle de temps. Il ne peut donc être considéré comme une...) un modèle exact de l'état de la mémoire que le programme modifie.

Afin de réduire la difficulté que représente cette tâche, de nombreuses techniques destinées à réduire le nombre (La notion de nombre en linguistique est traitée à l’article « Nombre grammatical ».) de variables à gérer sont utilisées. On peut citer parmi ces techniques les variables dites automatiques, dont la portée se limite à la procédure dans laquelle elles ont été définies et qui sont désallouées par le compilateur à la sortie de la procédure, l'encapsulation (L'encapsulation en général est la notion de mettre une chose dans une autre. En imageant, on peut voir que cette chose est mise dans une capsule. En particulier, on peut retrouver ce terme dans plusieurs domaines :) des données (Dans les technologies de l'information (TI), une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction d'affaire, d'un événement, etc.), à l'origine de la programmation structurée (La programmation structurée peut être vue comme un sous-ensemble, ou une branche, de la programmation impérative, un des paradigmes majeurs de la programmation.), et la programmation orientée objet (La programmation par objet (du terme anglo-saxon Object-Oriented Programming ou OOP), est un paradigme de programmation, il consiste en la définition et...).

Il arrive cependant que des procédures doivent mettre à jour (Le jour ou la journée est l'intervalle qui sépare le lever du coucher du Soleil ; c'est la période entre deux nuits, pendant laquelle les rayons du...) certaines variables ou zones de mémoire dans un but qui n'est pas directement lié à leur fonction, mais uniquement afin que les données partagées restent dans un état prévu par le programmeur. On regroupe ces modifications " à distance " sous le terme générique d'effets de bord. Les effets de bord, en programmation impérative, qui sont plus la règle que l'exception, compliquent grandement la compréhension des programmes et sont la source de nombreuses difficultés et de bogues : en effet, si on oublie de mettre à jour certaines données partagées, si l'ordre chronologique des assignations par les différentes parties du logiciel (En informatique, un logiciel est un ensemble d'informations relatives à des traitements effectués automatiquement par un appareil informatique. Y sont inclus les...) est incorrect, ou si une zone de mémoire a été désallouée au mauvais moment, le programme se retrouve dans un état imprévu.

Programmation fonctionnelle (En mathématiques, le terme fonctionnelle se réfère à certaines fonctions. Initialement, le terme désignait les fonctions qui en prennent d'autres en argument. Aujourd'hui, le terme a été étendu, et il...)

La programmation fonctionnelle s'affranchit de façon radicale des effets de bord en interdisant toute opération d'assignation.

Le paradigme fonctionnel n'utilise pas de machine d'états pour décrire un programme, mais un emboîtement de fonctions que l'on peut voir comme des " boîtes noires " que l'on peut imbriquer les unes dans les autres. Chaque boîte possédant plusieurs paramètres en entrée mais une seule sortie, elle ne peut sortir qu'une seule valeur possible pour chaque tuple de valeurs présentées en entrée. Ainsi, les fonctions n'introduisent pas d'effets de bord. Un programme est donc une application, au sens (SENS (Strategies for Engineered Negligible Senescence) est un projet scientifique qui a pour but l'extension radicale de l'espérance de vie humaine. Par une évolution progressive...) mathématique (Les mathématiques constituent un domaine de connaissances abstraites construites à l'aide de raisonnements logiques sur des concepts tels que les...), qui ne donne qu'un seul résultat pour chaque ensemble (En théorie des ensembles, un ensemble désigne intuitivement une collection d’objets (les éléments de l'ensemble), « une multitude...) de valeurs en entrée. Cette façon de penser, qui est très différente (En mathématiques, la différente est définie en théorie algébrique des nombres pour mesurer l'éventuel défaut de dualité d'une application définie à l'aide de la trace, dans...) de la pensée habituelle en programmation impérative est l'une des causes principales de la difficulté qu'ont les programmeurs formés aux langages impératifs pour aborder la programmation fonctionnelle. Cependant, il faut noter qu'elle ne pose généralement pas de difficultés particulières aux débutants qui n'ont jamais été exposés à des langages impératifs. Un avantage important des fonctions sans effet de bord est la facilité que l'on a à les tester unitairement. Par ailleurs, l'usage (L’usage est l'action de se servir de quelque chose.) généralisé d'une gestion de mémoire automatique (L'automatique fait partie des sciences de l'ingénieur. Cette discipline traite de la modélisation, de l'analyse, de la commande et, de la régulation des systèmes dynamiques. Elle a pour fondements théoriques...) par l'intermédiaire d'un ramasse-miettes (garbage collector en anglais) simplifie la tâche du programmeur.

En pratique, pour des raisons d'efficacité, et du fait que certains algorithmes s'expriment aisément avec une machine d'états, certains langages fonctionnels autorisent la programmation impérative en permettant de spécifier que certaines variables sont assignables (ou mutables selon la dénomination habituelle), et donc la possibilité d'introduire localement des effets de bord. Ces langages sont regroupés sous le nom de langages fonctionnels impurs.

Les langages dits purement fonctionnels n'autorisent pas la programmation impérative. De fait, ils sont dénués d'effets de bord et protégés contre les problèmes que pose l'exécution concurrente. On peut voir par exemple ce qu'il a été fait dans le cadre du langage Erlang.

L'implémentation (Le mot implantation peut avoir plusieurs significations :) des langages fonctionnels fait un usage sophistiqué de la pile, car afin de s'affranchir de la nécessité de stocker des données temporaires dans des tableaux, ils font largement appel à la récursivité, - le fait d'inclure l'appel d'une fonction dans sa propre définition (Une définition est un discours qui dit ce qu'est une chose ou ce que signifie un nom. D'où la division entre les définitions réelles et les définitions nominales.) -. La récursivité peut être rendue plus efficace à l'aide d'une technique dénommée récursion terminale (tail-recursion en anglais), qui consiste à accumuler les résultats intermédiaires dans une case mémoire de la pile et à la passer (Le genre Passer a été créé par le zoologiste français Mathurin Jacques Brisson (1723-1806) en 1760.) en paramètre (Un paramètre est au sens large un élément d'information à prendre en compte pour prendre une décision ou pour effectuer un calcul.) dans l'appel récursif. Ceci permet d'éviter d'empiler les appels récursifs dans la pile en les remplaçant par une simple succession de sauts. Le code généré par le compilateur est alors similaire à celui généré par une boucle en impératif. Certains langages comme Scheme, OCaml et Anubis optimisent automatiquement les appels récursifs de cette manière.

Transparence (Un matériau ou un objet est qualifié de transparent lorsqu'il se laisse traverser par la lumière. Cette notion dépend de la longueur d'onde de la lumière : ainsi, le verre est transparent dans le visible (on voit à travers), mais il...) référentielle

Les langages fonctionnels ont comme autre propriété la transparence référentielle. Ce terme recouvre le principe simple selon lequel le résultat du programme ne change pas si on remplace une expression par une expression de valeur égale. Ce principe est violé dans le cas de procédures à effets de bord puisqu'une telle procédure ne dépendant pas uniquement de ses arguments d'entrée, ne se comporte pas forcément de façon identique à deux instants donnés du programme. Pourtant, la transparence référentielle est, comme nous allons le voir, une propriété extrêmement utile.

Prenons un exemple. En C, si n désigne une variable (En mathématiques et en logique, une variable est représentée par un symbole. Elle est utilisée pour marquer un rôle dans une formule, un prédicat ou un...) globale contenant un entier à incrémenter (donc une case mémoire visible par tout le programme), et inc(k) une fonction qui augmente la valeur de n de la quantité (La quantité est un terme générique de la métrologie (compte, montant) ; un scalaire, vecteur, nombre d’objets ou d’une autre manière de dénommer la valeur d’une collection ou un...) k :

 
 int n = 2; 
 int inc(int k) { n = n + k; return n; } /* incrémentation par effet de bord */ 
 f(inc(1) + inc(1)); 
 

Dans cet exemple, la fonction inc(i) ne retourne pas la même valeur lors des deux appels : l'un des arguments de la fonction f vaudra 2 + 1 = 3 et l'autre 3 + 1 = 4. Il s'avère donc impossible de remplacer inc(i) + inc(i) par 2 * inc(i) car la valeur de inc(i) diffère à chaque appel. Ce comportement est fondamentalement différent de celui d'une fonction mathématique. À l'échelle d'un programme important, cela signifie que le remplacement d'une fonction par une autre peut nécessiter des modifications à d'autres endroits du programme, et qu'il peut s'avérer nécessaire de retester l'intégralité du système, car on n'est pas assuré qu'un tel remplacement n'a pas modifié son comportement global. Au fur (Fur est une petite île danoise dans le Limfjord. Fur compte environ 900 hab. . L'île couvre une superficie de 22 km². Elle est située...) et à mesure que la complexité (La complexité est une notion utilisée en philosophie, épistémologie (par exemple par Anthony Wilden ou Edgar Morin), en physique, en biologie...) du système augmente, le coût d'un changement s'accroît aussi. A l'inverse (En mathématiques, l'inverse d'un élément x d'un ensemble muni d'une loi de composition interne · notée multiplicativement, est un élément y tel que x·y = y·x = 1, si 1 désigne...), la propriété de transparence référentielle permet d'assurer que le remplacement d'une fonction par une autre équivalente ne risque pas de modifier le comportement global du programme. Autrement dit, elles sont mathématiquement égales. Cette propriété facilite la maintenance logicielle. Elle permet aussi d'appliquer de façon automatique des preuves de fonctionnement. Elle a enfin pour autre avantage de sensiblement réduire l'importance de l'ordre d'exécution, celui-ci étant assuré par l'ordre d'appel des fonctions ; un corollaire (Un théorème est une proposition qui peut être mathématiquement démontrée, c'est-à-dire une assertion qui peut être établie comme vraie au travers d'un raisonnement...) est que la parallélisation d'un programme fonctionnel peut être réalisée de façon automatique.

Une plus grande expressivité

Les langages fonctionnels emploient des types et des structures de données de haut niveau comme les listes extensibles. Il est ainsi généralement possible de réaliser facilement des opérations comme la concaténation (Le terme concaténation est issu du latin cum (avec) et catena (chaîne), il désigne l'action de mettre bout à bout deux chaînes.) de liste, ou l'application d'une fonction à une liste - le parcours de la liste se faisant de façon récursive -, en une seule ligne de code.

Un mécanisme puissant des langages fonctionnels est l'usage des fonctions d'ordre supérieur. Une fonction est dite d'ordre supérieur lorsqu'elle peut prendre des fonctions comme argument (aussi appelées callback) et/ou retourner une fonction comme résultat. On dit aussi que les fonctions sont des objets de première classe (Dans un moyen de transport (avion, train ou bateau), la première classe est la classe la plus confortable et celle offrant généralement le plus de prestations. En outre, l'ambiance y est...), ce qui signifie qu'elles sont manipulables aussi simplement que les types de base. Elles correspondent, en mathématiques, aux fonctionnelles. Les opérations de dérivation et d'intégration en sont deux exemples simples. Les fonctions d'ordre supérieur ont été étudiées par Alonzo Church (Alonzo Church 14 juin 1903 - 11 août 1995 fut un mathématicien (logicien) américain à qui l'on doit certains des fondements de l'informatique théorique.) et Stephen Kleene dans les années 1930, à partir du formalisme du lambda-calcul (Le lambda-calcul (ou λ-calcul) est un langage de programmation théorique inventé par Alonzo Church dans les années 1930. Ce langage a été le premier utilisé pour définir et caractériser les fonctions récursives et il...), un formalisme qui a grandement influencé le design (Le design (la stylique en français) est un domaine visant à la création d'objets, d'environnements ou d'œuvres graphiques, à la fois...) de nombreux langages fonctionnels, en particulier Haskell. Toutefois, la Théorie (Le mot théorie vient du mot grec theorein, qui signifie « contempler, observer, examiner ». Dans le langage courant, une théorie est une idée ou une connaissance spéculative, souvent basée sur l’observation ou...) des Catégories Cartésiennes Fermées caractérise les fonctions d'une façon plus moderne à l'aide de la notion de problème universel.

Popularité du paradigme fonctionnel

Nombreux sont les programmeurs expérimentés qui pensent que la programmation fonctionnelle offre des avantages sans équivalent en impératif. Malgré cela, elle reste peu utilisée en dehors du milieu universitaire et des hobbyistes. Dans le milieu industriel, les langages Erlang (développé par Ericsson pour des besoins de programmation concurrentielle et des impératifs de robustesse), Common Lisp et Scheme sont utilisés. Mais le développement des langages fonctionnels est limité par le déficit en outils et en bibliothèques de qualité commerciale et surtout par le manque de programmeurs formés.

Enfin, les langages fonctionnels souffrent encore d'une réputation de lenteur aujourd'hui complètement (Le complètement ou complètement automatique, ou encore par anglicisme complétion ou autocomplétion, est une fonctionnalité informatique permettant à l'utilisateur de limiter la quantité d'informations...) injustifiée : certains compilateurs Scheme, comme les compilateurs Stalin ou Bigloo, les compilateurs pour Common Lisp, les langages dans la lignée de ML, tels que Objective Caml, ou encore Haskell produisent des exécutables dont les performances moyennes sont comparables ou supérieures à ceux produits par les compilateurs C ou C++.

En dehors des universités et de secteurs industriels spécifiques, XSLT est peut être un vecteur (En mathématiques, un vecteur est un élément d'un espace vectoriel, ce qui permet d'effectuer des opérations d'addition et de multiplication par un scalaire. Un n-uplet peut constituer un exemple de...) de popularisation du paradigme fonctionnel. Dédié au traitement XML, il permet à un programmeur de conserver ses langages impératifs ou objets, tout en découvrant une autre logique (La logique (du grec logikê, dérivé de logos (λόγος), terme inventé par Xénocrate signifiant à la fois raison,...), selon une élégance et une clarté qu'il ne peut pas obtenir dans ses syntaxes habituelles.

Page générée en 0.203 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique