TUTORIELS 
Caractéristiques des langages fonctionnels

Page 1 | 2

Déroutante peut-être, la programmation fonctionnelle est pourtant au coeur de langages comme le Lisp, CAML ou Erlang.
 (5 septembre 2003)
 

La plupart des développeurs ne manipulent (peut-être sans le savoir, du reste) qu'un seul type de langage de programmation : les langages impératifs, tels C/C++, Java, Delphi/Pascal, ECMAScript... Ceux-ci se caractérisent principalement par une description des différentes instructions à exécuter pour parvenir au résultat voulu.

Il ne s'agit pourtant pas de la seule approche de résolution de problèmes, comme entend le montrer cet article qui s'intéresse aux langages fonctionnels, lesquels peuvent dérouter les non-initiés mais disposent d'avantages certains et sont utilisés notamment au sein de la communauté scientifique.

Description
Il nous faut expliquer la classification entre les deux grandes familles de langages que sont les langages impératifs et les langages déclaratifs : la programmation fonctionnelle, avec la programmation dite "logique", est sous-jacente aux langages déclaratifs, tandis que la programmation procédurale (C, Pascal), la programmation Orientée-Objet (SmallTalk, Java) et la programmation "concurrente" sont au coeur des langages impératifs.
Notons que certains langages peuvent se retrouver dans plusieurs catégories : Java, par exemple, permet la programmation Orientée-Objet et concurrente. De même, certains langages procéduraux peuvent faire appel à des techniques issues des langages fonctionnels...

Comparons les deux types de langages en partant de leur dénomination même :
- un programme impératif est composé de différentes instructions indiquant de manière explicite comment résoudre un problème ;
- un programme déclaratif définit (ou "déclare") différentes entités et leurs relations, à charge ensuite pour le programme d'utiliser ces relations pour résoudre le problème.

Premières caractéristiques
En "programmation fonctionnelle", les entités sont des fonctions (au sens mathématique du terme). Le programme principal est lui-même considéré comme une fonction qui fait appel à d'autres fonctions qui elles-mêmes...
Ainsi l
es fonctions d'ordre supérieur prennent en entrée une ou plusieurs fonctions, et peuvent renvoyer en sortie des fonctions. Plus encore : les langages de programmation fonctionnelle dits "purs" ne proposent ni assignation de variable, ni allocation de mémoire, ni boucles itératives. Ces deux derniers procédés sont respectivement remplacés par les allocations automatiques et l'usage intensif de la récursivité.

Le but ultime ? Que le résultat de toute fonction soit uniquement défini par ses paramètres - en conséquence de quoi, la fonction renvoie toujours le même résultat (qui, donc, peut-être une nouvelle fonction) pour des paramètres donnés. On comprend vite, coté pratique, que ces langages ne peuvent être compilés, mais doivent être interprétés...
Il s'agit là du concept de transparence référentielle : le résultat d'une fonction sera le même si l'on remplace un argument par un autre argument, égal au premier. Entre autres choses, cela facilite largement la maintenance du programme.

Effets de bords
Les effets de bords (side effects) ne sont pas une spécificité de la programmation fonctionnelle - ce serait même plutôt l'inverse : on en trouve avant tout dans la programmation impérative où ils sont d'ailleurs sources de nombreux bogues...
Un effet de bord correspond à un résultat inattendu d'une fonction, et par extension à toute modification au sein de l'environnement (modification de la valeur d'une variable, par exemple). Pour bien comprendre l'effet de bord, replaçons-les dans leur contexte favori : la programmation impérative.
Dans ce cas de figure, la portée d'une variable est le plus souvent limitée à la procédure où elle est définie, le compilateur prenant en charge l'allocation/désallocation de mémoire. Cependant il peut arriver qu'une variable ou une zone mémoire dispose d'une portée qui dépasse la procédure qui la contient, ceci afin d'être accessible à partir d'autres procédures. Certaines procédures peuvent ainsi modifier une variable ou une zone mémoire dans le seul but de les maintenir dans un état donné, fixé par le développeur.
Cette capacité d'une fonction de modifier l'état d'une valeur (variable globale ou statique, argument d'une autre fonction, affichage ou écriture des données) autre que celle qu'elle renvoie définit l'effet de bord.

Ce mécanisme crée une sorte d'interdépendance entre les fonctions, rendant souvent plus complexe la compréhension d'un programme... D'autant que la modification d'une fonction peut dès lors avoir des conséquences inattendues sur le résultat d'autres fonctions "liées".
Mais la programmation impérative (comme les programmeurs OO le reconnaîtront) se base quasi uniquement sur les effets de bord. La programmation fonctionnelle pure les refuse pour sa part. Toutes les fonctions peuvent ainsi facilement être testées de manière unitaire, accélérant le déboguage et facilitant l'optimisation.

Page 1 | 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page