par , 25/03/2015 à 12h43 (1006 Affichages)
Introduction
NDLA: Le titre de ce blog est un clin d’œil au blog de François (s’il me permet de l’appeler par son prénom), Reac’ programming, qui m’a donné l’envie d’en commencer un à mon tour.
J’ai trouvé, lorsque je me suis intéressé à la programmation fonctionnelle il y a quelques mois de cela, une documentation abondante : en particulier, pour chaque langage fonctionnel, des tutoriels très bien faits. Mais il sont le plus souvent en anglais, plutôt massifs, parfois obscurs, se répètent entre eux et je voudrais plutôt présenter la programmation fonctionnelle par dose homéopathique en m’appuyant sur différents langages, pour la rendre plus agréable d’accès, et plus funky.
Qu’est-ce que la programmation fonctionnelle ?
La programmation fonctionnelle, essentiellement, est un paradigme de programmation dans lequel on ne manipule pas des variables et des instructions, mais des fonctions. Si vous y croisez une variable ou même une valeur littérale, il faut l’envisager comme une fonction sans argument qui retourne toujours la même valeur, par exemple :
int x = 0 ; // <=> int x() { return 0 } ;
La première conséquence, la plus étonnante aussi pour les habitués de la programmation impérative, c’est qu’on ne peut pas modifier la valeur d’une variable :
x = x + 1 ; // <=> x() = x() + 1 ; gloups
La seconde conséquence, c’est que le programme n’est plus un flux d’instructions, où l’on passe d’un état à un autre en fonction de ces instructions. Le programme devient plutôt une liste d’équations qui sont simultanément vraies. Pour prendre l’exemple de l’instruction canonique « if then » :
1 2 3 4
| // où lon voit bien quévaluer isOdd ne renvoie pas la même valeur selon létat du programme
int x = 3;
bool isOdd = false ; // état n° 1
if ( x % 2 == 1) isOdd = true ; // état n° 2 |
<=>
1 2 3
| // où lon voit bien quévaluer isOdd retournera toujours la même valeur
int x() { return 3 ; }
bool isOdd () { if ( x() % 2 == 1 ) return true ; else return false ; } |
Pourquoi la programmation fonctionnelle ?
A ce stade, vous sentez bien que toutes vos habitudes héritées de la programmation impérative seraient chamboulées en adoptant un paradigme fonctionnel. Alors pourquoi changer ? La programmation fonctionnelle apporte de nombreux avantages : les programmes sont plus faciles à tester, puisqu’ils sont constitués de fonctions qui renvoient toujours la même valeur, et qu’il n’y a plus une succession d’états à tester (attendez, quelle est la valeur de cette variable à ce moment-là déjà ?) ; il est plus facile de les paralléliser (pour les mêmes raisons) ; mais surtout, si vous cherchez un nouveau défi, une nouvelle jeunesse dans votre vie de programmeur, la programmation fonctionnelle est faite pour vous.
J’ajoute que, comme tous les langages rajoutent des aspects fonctionnels à leur standard en ce moment, comme C++ ou Java, c’est un détour intéressant même pour ceux qui ne souhaitent pas perdre leur productivité sur leur langage de prédilection.
Quel langage pour la programmation fonctionnelle ?
Vaste choix. On peut faire de la programmation fonctionnelle en C ou bien dans un langage purement fonctionnel, comme Haskell. On peut en faire dans un langage mixte, comme à leurs façons respectives LISP ou Scala. On peut écrire tout ou partie d’un programme dans un style fonctionnel. On peut écrire un programme dans des langages interopérables, certains fonctionnels, d’autre non, comme Java et Clojure qui sont compilés pour la JVM et peuvent faire appel l’un à l’autre de façon transparente.
Dans ce blog je ne m’interdirai aucun langage, au contraire.
Exercices :
1) rappelez-vous quelques uns des bugs que vous avez rencontrés parce que vous vous mépreniez sur l’état d’une variable (variable non initialisée, variable incrémentée au mauvais endroit de la boucle, variable partagée entre des threads, etc.)
2) énumérez quelques techniques de programmation impérative qui ne seront plus possibles si vous adoptez un style fonctionnel
3) jetez un œil aux articles de Wikipedia de quelques langages fonctionnels (Haskell, Ocaml , Scala, Clojure, Scheme, Erlang…)