Programmation fonctionnelle avec Haskell, Clojure, Scala

Il y a beaucoup de buzz aujourd’hui autour de la programmation fonctionnelle. Je vais essayer de présenter simplement ce que c’est et pourquoi c’est utile.

Les paradigmes de la programmation

Il existe 3 principaux paradigmes de programmation. La programmation impérative, fonctionnelle et logique.

La programmation impérative est celle qui vous est sans doute la plus familière puisque la plupart des langages de programmation suivent ce paradigme (Java, C, Python, Ruby, etc.). En programmation impérative, tout tourne autours du temps. On commence par créer une variable, on assigne une valeur à cette variable, on utilise des boucles for et while pour réaliser des actions on fait des test avec if then. Ces variables sont muables (mutable en anglais), c’est à dire qu’on peut leur donner de nouvelles valeurs dans le temps.

La programmation logique associe des règles de logique. Elle est particulièrement adaptée au monde de l’intelligence artificielle.

Enfin, la programmation fonctionnelle, utilise comme objet principal des fonctions. Les fonctions peuvent retourner des fonctions, prendre d’autres fonctions en paramètre. Les variables sont immuables (immutable en anglais). La logique est totalement différente de la programmation impérative et l’on résonne plus en terme d’espace que de temps.

La programmation orientée objet n’est pas un paradigme en soit. Elle est très utilisée avec les langages impératifs tels que Java ou C++ et permet de représenter des concepts en lien avec le monde réel.

Pourquoi la programmation fonctionnelle

Dans une présentation à la conférence O’Reilly OSCON Java 2011, Martin Odersky, créateur du langage Scala, résume bien l’intérêt de la programmation fonctionnelle en programmation parallèle et et en programmation concurrente (ie. par thread).

Aujourd’hui, de plus en plus de machines sont dotées de plusieurs microprocesseurs. De plus avec l’émergence du cloud computing, il est très aisé d’avoir plusieurs machines à sa disposition.
D’autre part, de nombreuses applications ont besoin d’une grande capacité de calcul. Twitter par exemple doit gérer plusieurs centaines de milliers de tweets par seconde.

C’est là que la programmation parallèle et la programmation concurrente (voire ici la différence entre les deux) entrent en jeu. Or il est compliqué dans un langage impératif de gérer plusieurs threads. Il faut notamment faire attention aux fameux points de blocages (deadlocks).
De plus, en programmation parallèle avec des types muables, des phénomènes non-déterministes apparaissent…

C’est ici que la force de la programmation fonctionnelle et ses types immuables entre en jeu.

La programmation fonctionnelle est déjà utilisée par les plus grandes startups webs, comme Twitter et Linkedin justement pour gérer les problématiques de croissance (scalability en anglais).

Quels langages: Clojure, Scala, Haskell, Lisp, Scheme, etc.

Il existe de nombreux langages fonctionnels, le plus ancien étant Lisp. Voici un petit historique.

Les plus populaires aujourd’hui sont Haskell, Clojure, Scala, Scheme, F# de Microsoft, Lisp.

Scala, par exemple, permet de garder le meilleur de la programmation orientée objet et de la programmation fonctionnelle.

Clojure et Scala reposent sur la machine virtuelle Java et s’avèrent donc être de bons choix pour les développeurs Java.

Clojure reprend le dialecte de Lisp tout en étant aujourd’hui plus populaire que ce dernier.

Les puristes seront sans doute plus séduits par Haskell et Erlang. Le second est très utilisé notamment dans les télecoms.

Mais javascript peut également être vu comme un langage fonctionnel dans un certain sens, tout comme Ruby avec les blocks. Java 8 et ses lambdas offre aussi un nouveau champ d’action!

En conclusion, apprendre la programmation fonctionnelle vous permettra également d’être un meilleur développeur Javascript ou Java…

Pour aller plus loin

Programmation fonctionnelle avec Haskell, Clojure, Scala

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *