octobre
2011
Les lambda expression se font petit à petit une place dans le monde des langages orientés objets. C’est ainsi qu’on les retrouve dans le framework .NET à partir de la version 3 et dans le JDK dans sa future version 8.
Définitions
- Une expression lambda est une fonction anonyme qui peut contenir des expressions et des instructions, et peut être utilisée pour créer des délégués ou des types d’arborescence d’expression (MSDN).
- Lambda expressions are anonymous functions, aimed at addressing the « vertical problem » by replacing the machinery of anonymous inner classes with a simpler mechanism (OpenJDK).
- Une expression lambda est une fonction anonyme qui capture son environnement : λ xy.5+x capture x et y.
Un peu d’histoire
Historiquement, les lambda expressions nous arrivent tout droit du lambda calcul.
Le lambda-calcul (ou λ-calcul) est un système formel inventé par Alonzo Church dans les années 1930, qui fonde les concepts de fonction et d’application. Il a été le premier formalisme utilisé pour définir et caractériser les fonctions récursives et donc il a une grande importance dans la théorie de la calculabilité, à l’égal des machines de Turing et du modèle de Herbrand-Gödel.
Le lambda calcul définit des entités syntaxiques que l’on appelle des lambda-termes (ou parfois aussi des lambda expressions) et qui se rangent en trois catégories :
- les variables : x, y… sont des lambda-termes ;
- les applications : u v est un lambda-terme si u et v sont des lambda-termes ;
- les abstractions : λ x.v est un lambda-terme si x est une variable et v un lambda-terme.
L’application peut être vue ainsi : si u est une fonction et si v est son argument, alors u v est le résultat de l’application à v de la fonction u. L’abstraction λ x.v peut être interprétée comme la formalisation de la fonction qui, à x, associe v, où v contient en général des occurrences de x (wikipédia).
Le lambda-calcul est à l’origine du paradigme fonctionnel qui s’est illustré au début de l’informatique par les langages suivants (entre autres) :
- Lisp (1959)
- Scheme (1975)
- ML (1897)
- Erlang (1987)
- Haskell (1990)
Après avoir été délaissé au profit de langages orientés objets tels que C++, Java et C#, le paradigme fonctionnel revient sur le devant de la scène. C’est ainsi que chacun de ces langages se dote à son tour de traits fonctionnels (closure pour Java 8, lambda pour .NET 3).
Pourquoi ce retour ?
Si les langages les plus utilisés se dotent de traits fonctionnels, ce n’est pas par hasard. Ceci est étroitement lié à la multiplication des nombres de processeurs dans les machines actuelles.
Le paradigme fonctionnel (pur) permet d’écrire du code dénué d’effets de bords, ce qui le rend sûr, prouvable mais surtout facile à paralléliser. L’absence d’effets de bords permet d’éliminer une partie des problèmes inhérents à la programmation concurrente. C’est ce qui fait le succès d’Erlang (RabbitMQ, Riak, Zotonic, …).
Scénarios types des langages fonctionnels :
- Calcul formel
- Compilation/Interprétation
- Structures de données arborescentes
Conclusion
Je ne pense pas que les langages fonctionnels puissent vraiment revenir dans une industrie où C++, Java et .NET sont aussi présents. Nous assistons pour le moment à l’arrivée de traits fonctionnels dans ces langages et cela s’arrêtera probablement à la notion de fonction anonyme et de fermeture. En revanche, avec le niveau de sûreté nécessaire dans certains systèmes, le paradigme fonctionnel a encore de beaux jours devant lui.
Pour l’anecdote de fin, le concept de map/reduce, utilisé dans les bases de données est une notion empruntée aux langages fonctionnels.