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 les
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
|