Cet article fait suite à un précédent consacré aux technologies de blockchain développées par OCamlPro.
II Programmation fonctionnelle avec OCaml
Comme son nom l’indique, la société OCamlPro a construit ses compétences et son activité autour d’OCaml, un langage de programmation qui appartient à la famille de la programmation fonctionnelle, issu de plus de trente années de recherche publique française notamment à l’Inria, dont nous allons examiner les qualités éminentes. Ce sont ces qualités qui ont permis aux ingénieurs d’OCamlPro d’utiliser la programmation fonctionnelle pour construire leur blockchain, et qui ont convaincu leurs clients.
Par ailleurs OCamlPro a un lien privilégié avec un client important, Jane Street, une entreprise financière de la place de New York qui a fait très tôt le choix de la programmation fonctionnelle en OCaml pour des raisons de qualité de la programmation et des revues de code et de la facilité de son adaptation aux évolutions du marché et de la législation.
Qu’est-ce que la programmation fonctionnelle ?
Un programme en style fonctionnel (écrit dans un langage fonctionnel), plutôt que d’exécuter des instructions qui modifient des données dans la mémoire de l’ordinateur (style impératif), calcule la valeur d’expressions. Les expressions sont en général des compositions de fonctions, à l’image des expressions mathématiques. Pour représenter les états successifs de la mémoire dont l’enchaînement mène au résultat désiré du calcul, le style impératif procède par modification explicite de zones de mémoire au moyen de l’instruction d’affectation, cependant que le style fonctionnel préfère les appels récursifs de fonctions, lors desquels les variables du calcul qui doivent évoluer sont passées en arguments à chaque appel avec leur nouvelle valeur (à noter que dans le cas, qui est le plus fréquent, de récursion terminale [1], cette cascade d’appels de fonction n’impose pas de coût mémoire).
Élimination des effets de bord et calcul dans les nuages
Le style de programmation fonctionnel permet ainsi, dans la plupart des cas, d’éviter la modification de la mémoire par l’affectation, ce que l’on appelle un effet de bord. Cette élimination des effets de bord procure aux langages fonctionnels des avantages décisifs que nous allons exposer (schématiquement).
Aujourd’hui, et ce sera de plus en plus le cas à l’avenir, beaucoup de programmes ne se contentent pas d’un fil d’exécution linéaire, mais lancent plusieurs fils (threads) d’exécution en parallèle. Ainsi, lorsque vous ouvrez plusieurs onglets dans votre navigateur, à chaque onglet correspond un sous-processus qui vit sa vie sans trop se soucier de ce qui se passe dans les autres (sauf s’il déclenche un script JavaScript écrit avec les pieds qui monopolise le temps de calcul au détriment des autres tâches).
Si l’on considère maintenant un programme en style impératif dont les sous-processus partagent une zone mémoire qu’ils sont appelés à modifier, il va falloir des mécanismes de synchronisation pour éviter que deux sous-processus ne tentent de modifier la même variable au même instant. Pratiquement cela va se traduire par un verrou qui va bloquer tous les sous-processus concurrents sauf celui qui détiendra, à cet instant, le droit d’accès à cette variable. C’est une cause de ralentissement du programme. Imaginons maintenant que ce vaste programme, comme cela devient de plus en plus courant, se déroule dans les nuages (Cloud Computing), ce qui signifie que tous les sous-processus ne sont pas nécessairement sur le même site géographique (certains en Suède, d’autres en France, oui c’est possible) : là, la synchronisation va devenir très coûteuse.
La programmation de style fonctionnel avec la récursion terminale élimine ces inconvénients : chaque fonction appelée s’active et se déplace avec ses arguments, si l’on peut l’exprimer ainsi, et les verrous et autres dispositifs coûteux de synchronisation ne sont plus nécessaires. C’est pourquoi de nombreux experts préconisent le recours à ce style de programmation, ce que mettent en pratique les ingénieurs d’OCamlPro.
« Votre ordinateur n’est pas un PDP-11 rapide »
J’emprunte ce titre à un article de David Chisnall dans les Communications of the ACM, qui plaide pour un renouvellement des modèles de calcul. Les langages C et C++, avec lesquels sont construits les systèmes d’exploitation contemporains et une grande part des logiciels que nous utilisons tous les jours, ont été conçus en fonction d’un modèle d’ordinateur populaire dans les années 1970, le PDP-11 de Digital Equipment. J’en garde un souvenir nostalgique, mais il fait figure de pièce de musée : adresses sur 16 bits, mémoire de quelques centaines de koctets, pas de microprocesseur... À l’époque, pas de réseau, pas de traitements répartis, possibilités rudimentaires de multiprogrammation. Le système de cette époque qui possédait les bonnes propriétés était Multics, hélas trop lourd pour les ordinateurs de son temps. Bref, les systèmes informatiques d’alors avaient été conçus en fonction d’un matériel aujourd’hui complètement archaïque et David Chisnall propose de remettre les choses à plat pour partir vers de meilleurs modèles de calcul.
Avec le développement des traitements répartis, des applications multi-threads et des déploiements à la demande dans les nuages (Cloud Computing et orchestration par Kubernetes), le modèle linéaire de programmation est remis en question, et nous avons vu que dans ce contexte la programmation fonctionnelle avait de beaux jours devant elle. Ainsi l’agence de voyage en ligne Expedia loue à Amazon des sous-programmes (lambda-expressions en langage fonctionnel) au compteur : “Expedia did over 2.3 billion Lambda calls per month back in December 2016. That number jumped 4.5 times year-over-year in 2017 (to 6.2 billion requests) and continues to rise in 2018. Example applications include integration of events for their CI/CD platforms, infrastructure governance and autoscaling.” Les développeurs de Facebook écrivent en Haskell, un langage fonctionnel, mais aussi en OCaml - OCamlPro ayant d’ailleurs porté Hack et Flow sous Windows. AWS et Microsoft ont par ailleurs annoncé leur soutien au développement de Rust.
Bref, OcamlPro est positionné sur un créneau technologique d’avenir, qui permet également d’aborder des domaines de pointe tels que la preuve formelle, qui seront toujours plus demandés à mesure que les réseau d’objets nécessitent toujours plus de garanties en termes de sûreté et sécurité.