Comprendre - La Programmation Fonctionnelle - Big Things 2015

Posted on Aug 21, 2015 by Administrator

Le propos ne sera pas ici de démontrer mais de décrire et d'imager ce qui distingue les deux modèles qui pourraient être appelés à se succéder l'un à l'autre dans les années qui viennent.

A main gauche, c'est à partir de la deuxième moitié des années 80 que s'est imposé le paradigme de la "Programmation Orientée Objet", un modèle de développement informatique, conceptualisé par les Norvégiens Ole-Johan Dahl et Kristen Nygaard au début des années 1960 et par Alan Kay dans les années 1970, habituellement présenté comme constituant un ensemble méthodologique ordonné et cohérant.

 

 

A main droite, la "Programmation Fonctionnelle", un modèle de développement directement issu des travaux de recherche des pères fondateurs du calcul numérique en mode binaire (Alonzo Church, Alain Turing,...), aujourd'hui relayés par ceux de l'équipe de Martin Odersky, qui, depuis trop longtemps :

- peine à retenir l'intérêt des DSI, petites et grandes et, surtout, des ESN (ou SSII) auprès desquelles elles se fournissent et qui évitent, très attentivement, de les leur recommander;
- a, dans le même temps, été très vite reconnue comme la voie à privilégier pour tout ce qui touche au développement des systèmes exploités en propre ou en mode loué (Systèmes d'information déployés en mode SAAS, Intelligence Artificielle et Big Data, dans une moindre mesure : Contrôle de l'Intégrité des Systèmes d'Information) par les grands opérateurs mondiaux du secteur informatique (Google, Apple, FaceBook, Amazon, Microsoft, IBM, Oracle,...).

 

 

Si la Programmation Fonctionnelle permet d'inclure, avec une excellente flexibilité, les composants-clés (classes, objets) qui ont semblé devoir faire la spécificité des modèles de la Programmation Orientée Objet (nativement sous Scala et Livecode où tout est objet), l'inverse n'est pas vrai.

A main gauche, C++, Java et PHP5 constituent les langages de programmation orientée objet les plus utilisés aujourd'hui.

A main droite, Lisp, Haskell, ML, NetRexx, Scala et Livecode constituent les langages de programmation fonctionnelle les plus utilisés aujourd'hui.

 

Sapin de Noël ou Machine à Café ?

A main gauche, le paradigme orienté objet se propose d'ordonner les traitements applicables aux données entrantes en les faisant circuler dans un univers de calcul (le programme) organisé en arbre de décision. Tout au long de leur parcours dans l'arbre de décision, les données subissent les transformations prévues en mode synchrone (l'une après l'autre) avant de quitter le programme pour rejoindre leur destination finale de stockage.

A main droite, le paradigme fonctionnel est basé sur l'idée d'évaluer une formule, et d'utiliser le résultat comme valeur d'entrée du traitement suivant, selon le modèle du lambda-calcul. Tous les calculs sont faits en confiant à des fonctions la mission d'évaluer des expressions. Le résultat d'un calcul sert de matière première au calcul suivant, et ainsi de suite, jusqu'à ce que toutes les fonctions appelées au cours du traitement (sous-ensemble du programme) aient produit un résultat. 

 

D'autoroute en vicinale ou... 

A main gauche, si l'on devait considérer, en Programmation Orientée Objet, le tronc de l'arbre de décision comme une autoroute et les données à traiter comme une automobile y circulant, force est de constater que le voyage va se faire long et chaotique :

A chaque traitement applicable à la voiture pour qu'elle puisse poursuivre son trajet, elle va devoir sortir de l'autoroute trouver la classe et l'objet qui va lui appliquer le traitement prévu, retourner sur l'autoroute et recommencer ainsi autant de fois qu'il lui faudra recevoir de traitements consécutifs pour pouvoir terminer son voyage jusqu'à pouvoir resortir définitivement de l'autoroute figurant le tronc de l'arbre de décision du programme.

 

D'autoroute en parcours direct ?

A main droite, si l'on devait considérer, en Programmation Fonctionnelle, la pile des traitements à appliquer et les données à traiter comme une automobile y circulant, force est de constater que le voyage va être très direct et reposant :

A chaque traitement applicable à la voiture pour qu'elle puisse poursuivre son trajet, elle va tout simplement s'arrêter à chacune des stations service vouées à lui fournir un traitement, tandis qu'elle dépassera sans s'y arrêter celles qui n'auront pas été désignées pour en faire autant.

 

Modélisation

En programmation orientée objet, la modélisation du système d'information est une entreprise complexe et incertaine, l'arbre de décision permettant de représenter sa structure logique et son organisation fonctionnelle constituant, lui-même, un univers de relations et d'interactions en trois dimmensions. La méthodologie UML est, aujourd'hui, l'approche académique la plus couramment mise en œuvre pour modéliser le système d'information développé en programmation orientée objet. Elle repose sur l'utilisation de vues et de diagrammes censés permettre de proposer des éclatés de représentation structurée des objets et des ensembles d'objets constituant le programme en termes d'organisation statique et de relations d'interaction fonctionnelle.

En programmation fonctionnelle, la modélisation du système d'information est une entreprise plus naturelle et immédiatement pratique, la pile d'enchaînement des traitements fonctionnels applicables aux données entrantes pouvant être représentée en mode plan (2 dimensions). Il n'existe pas encore, à ce jour, de système de modélisation unifié commun aux principaux langages de programmation fonctionnelle, chacun proposant sa propre approche de la modélisation de la complexité des programmes qu'il permet de coder. La recherche progresse toutefois à grand pas (Ecole Polytechnique, EPFL,...) et l'on peut raisonnablement estimer que les approches liées aux concepts de la programmation sémantique opérationnelle pourraient devenir à brève échéance les fondements d'un solfège de représentation efficace de la complexité informatique des solutions modélisées et codées en programmation fonctionnelle.

 

Victoire par Knock Out de la Machine à Café

L'architecture des langages de Programmation Fonctionnelle (Empilement ordonné des traitements applicables, accès journalisé, au besoin récursif, aux fonctions avec ordre de rang modifiable,...) propose une syntaxe lexicologique et une flexibilité sémantique qui conditionnent une économie de moyens absolument inconnue en Programmation Orientée Objet :

- la Programmation Fonctionnelle offre au développeur l'opportunité de rédiger un code source très compact et structuré, par voie de conséquence, particulièrement lisible et sûr;
- en Programmation Fonctionnelle, les programmes exécutables issus de ce code source très compact et structuré sont, eux-même, très économiques en termes de ressources de calcul (processeur, jusqu'à 50 fois moins de ressources allouées*) et d'occupation mémoire (RAM, jusqu'à 30 fois moins de ressources allouées*);
- en Programmation Fonctionnelle, les programmes exécutables issus de ce code source très compact et structuré sont extrèmement véloces en termes de temps d'exécution (jusqu'à 35 fois plus rapide*);

* Système d'Information Web PHP5/CodeIgniter/MySQL5/InnoDB versus système dInformation Web Livecode6/RevIgniter/MySQL5/InnoDB

Note: La Programmation Fonctionnelle est une ressource rare, tant par le nombre de langages généralistes, multi-plateformes et matures capables de la mettre en oeuvre que par le nombre des experts qui en maîtrisent toutes les arcanes pour se l'être authentiquement appropriée par une pratique directe de 10 000 heures d'expérience au moins. Dans un contexte où 0.67% seulement des architectes et développeurs se disent bien préparés à piloter des projets sous Scala (données EPFL 2014), il convient de ne pas négliger les expertises disponibles, y compris quand elle se rapportent à des environnement de Programmation Fonctionnelle moins activement marketés. Livecode constitue, par exemple, une option régulièrement prise en considération par des opérateurs tels que la NASA, EADS, KLM, Deutsche Börse AG,...

 

Pour aller plus loin

https://fr.wikipedia.org/wiki/Programmation_orientée_objet
https://fr.wikipedia.org/wiki/Programmation_fonctionnelle
https://medium.com/@jugoncalves/functional-programming-should-be-your-1-priority-for-2015-47dd4641d6b9
https://fr.wikipedia.org/wiki/UML_(informatique)
https://fr.wikipedia.org/wiki/Sémantique_opérationnelle
http://www.scala-lang.org/
https://livecode.com/blog/