Des recettes pour les machines
Java, C++, Python, PHP, OCaml, Pharo... Il existe de nombreux langages de programmation informatique, chacun ayant ses spécificités et ses avantages, et la tendance à leur multiplication ne semble pas prête de s'arrêter. « On peut comparer un programme à une recette de cuisine, ou bien, pour mieux en suggérer la taille, à un livre de recettes. Chaque recette (par exemple, "faire un roux blanc") y est décomposée en une suite d'instructions simples qui doivent être effectuées pas à pas par la machine pour que l'on obtienne au dîner le plat souhaité », explique le chercheur François Pottier, responsable de l'équipe-projet Cambium, commune au centre Inria de Paris et au Collège de France (qui a succédé à Gallium en 2019).
« Un langage de haut niveau (Java, Python, Javascript...) permet d'écrire une instruction qui regroupe plusieurs étapes, sans en donner les détails : par exemple "faire fondre 100 grammes de beurre", précise-t-il. Au contraire, un langage de bas niveau (C, Ada, Fortran...) exige que chaque étape élémentaire soit explicitée : par exemple, "allumer la balance ; tant que la balance n'indique pas 100 grammes ou plus, ajouter un morceau de beurre sur la balance ; transférer ces morceaux de beurre dans une casserole ; poser la casserole sur la cuisinière ; allumer le feu", etc. » Rien ne doit être implicite. « Il faut penser au matériel qui va faire tourner ce programme, et spécifier dans le détail toutes les caractéristiques des ustensiles et des méthodes à utiliser », souligne le responsable de l’équipe-projet Cambium.
Un langage informatique ultrafiable
Au cours de ces 40 dernières années, OCaml s'est imposé comme l'un des langages les plus sûrs et performants pour les systèmes critiques et les applications de calcul symbolique (ou formel), qui effectuent des calculs sur la base d'expressions mathématiques. Il est par exemple utilisé par Meta (maison mère de Facebook) pour développer l'analyseur de programmes Infer, par AbsInt pour l'analyseur de programmes Astrée (qui est utilisé par Airbus), et par plusieurs équipes Inria, notamment pour développer l'assistant de preuve Coq.
Plus récemment, une partie des logiciels de Jane Street, une firme américaine de trading financier, et de LexiFi, un éditeur français de logiciels pour l'analyse et la gestion de produits financiers, ont été écrits en OCaml, de même que la blockchain d'origine française Tezos, spécialisée dans la gestion des « tokens » (actifs financiers numérisés). La raison ? « Le langage OCaml répond aux impératifs de fiabilité de ces entreprises, dont les logiciels sont utilisés pour manipuler des millions, voire des milliards d'euros », relève Florian Angeletti, ingénieur de recherche de l'équipe-projet Cambium, qui travaille à la fois sur le compilateur OCaml (traducteur en langage machine) et son système de types (détection d'erreurs). « Elles veulent être sûres que les ordres exécutés par les programmes sont conformes à leur intentions ».
37 années de développements open source
OCaml a dès le départ été pensé pour répondre à des exigences élevées. Les premières déclinaisons du langage ont été créées dans les années 1980, dans le sillage des travaux de Robin Milner, un chercheur de l'université d'Edimbourg, sur le langage ML (« Meta-Language »). « À l'époque, les chercheurs de l'équipe-projet Formel ont étudié ce langage innovant et contribué à son développement, avant d'en créer une déclinaison appelée CAML (prononcé camel) en 1987 », rappelle François Pottier.
À partir de 1990, le chercheur d’Inria Xavier Leroy repart quasiment de zéro et met au point Caml Light, puis Caml Special Light. En 1996, les recherches de Didier Rémy, toujours dans l'équipe Cambium, et de Jérôme Vouillon, chargé de recherche au CNRS, donnent ensuite naissance à la première version d'Objective Caml (renommée OCaml en 2011). Sa particularité est d'être orientée objets, ce qui signifie que les programmes écrits en OCaml comprennent des objets interagissant entre eux par le biais de messages.
Elle est aussi, comme ses aînées, publiée en open source par Inria, et donc enrichie par une communauté internationale de contributeurs professionnels et académiques. Un exemple ? Le compilateur, qui traduit les programmes en langage machine, a récemment bénéficié des innovations apportées par la société Tarides (qui a fusionné avec OCaml Labs en début d'année), et des chercheurs de l'université de Cambridge et de l'Institut indien de technologie (New-Delhi et Madras)...
Inria reste toutefois le principal contributeur de ce langage, qui « revêt une importance stratégique », pour François Pottier. « En plus de Coq, une trentaine de logiciels développés par les équipes-projets de l'institut sont implémentés en OCaml. » On peut également citer la startup OCamlPro, essaimée d'Inria, qui commercialise un environnement de développement professionnel pour la communauté des utilisateurs du langage OCaml.
Place à la version OCaml 5
Une nouvelle étape a été franchie fin 2022. Car dix ans après la dernière version majeure (OCaml 4), en juillet 2012, OCaml vient d'être publié dans une nouvelle version : OCaml 5. Florian Angeletti souligne :
La grande nouveauté d'OCaml 5 tient à la gestion du multicœur (les microprocesseurs dotés de plusieurs cœurs physiques).
« La plupart des machines actuelles sont équipées de ce type d'architecture, apte à mener plusieurs tâches simultanément. Il fallait donc que notre langage soit, lui aussi, capable de gérer directement cette façon de travailler sur plusieurs cœurs en même temps. » Un objectif atteint grâce à l'ajout d'outils qui permettent aux utilisateurs du langage de programmer des tâches s'exécutant sur plusieurs cœurs et de spécifier les éventuelles interactions souhaitées. Le compilateur a aussi été réécrit pour rendre possible la traduction en langage machine des nouvelles instructions données par les programmes développés en OCaml 5.
Nouveaux gestionnaires de mémoire et d'effets
Autre innovation importante : le gestionnaire de mémoire a été entièrement redéveloppé pour OCaml 5. « La mémoire est comme une feuille de papier sur laquelle on écrit des informations, explique François Pottier. Mais à la différence d'une feuille de papier, on ne veut pas jeter cette mémoire à la fin. On souhaite au contraire la réutiliser pour d'autres tâches et il faut donc pouvoir indiquer au programme qu'il peut la reprendre pour la réutiliser. »
Tandis qu'il ne dialoguait précédemment qu'avec une seule tâche, le gestionnaire de mémoire d'OCaml 5 a été mis en capacité d'échanger simultanément avec plusieurs tâches, dans des zones de mémoire privées ou partagées. Il a aussi été pensé pour la mémoire des machines actuelles dans lesquelles chaque processeur a accès à différentes zones de mémoire, plus ou moins lointaines. De ce fait, les informations ne circulent pas instantanément et tous les processeurs n'ont pas la même vision du contenu de la mémoire à un instant donné : on parle de cohérence faible de la mémoire. Florian Angeletti observe :
Notre objectif était de réduire la complexité induite par cette cohérence faible pour les programmeurs, en faisant de la mémoire un tout unifié au sein duquel plusieurs tâches peuvent s'exécuter simultanément avec des règles d'interaction bien définies.
OCaml 5.0 – disponible en téléchargement sur le site OCaml.org – est aussi équipé de gestionnaires d'effets (« effect handlers » en anglais). Avec ces gestionnaires, les tâches deviennent des objets que les développeurs peuvent manipuler explicitement. « Ils peuvent ainsi définir à quel moment celles-ci pourront être suspendues et à quel moment elles pourront redémarrer », indique François Pottier.
De quoi gagner encore en souplesse dans la programmation d'actions potentiellement gourmandes en ressources de calcul. D'autant que l'équipe-projet Cambium – entièrement dédiée à la conception, la formalisation et la mise en œuvre de langages et de systèmes de programmation – n'entend pas en rester là... Parmi les évolutions déjà à l'ordre du jour, elle prévoit d'optimiser prochainement l'ergonomie des nouveaux gestionnaires d'effets.
En savoir plus
Tous publics
- Pourquoi créer des nouveaux langages de programmation ?, Interstices, 28/01/2019.
- Xavier Leroy : Grand Prix – Académie des sciences, l’architecte notamment du langage de programmation Ocaml, Inria, 29/10/2018.
Pour les spécialistes
- Bounding data races in space and time, article en anglais sur le « modèle mémoire » adopté par OCaml 5, Université de Cambridge, 18/6/2018.
- Retrofitting effect handlers onto OCaml, IIT Madras et al., article en anglais sur les gestionnaires d'effets d'OCaml, 20/6/2021.
- Cosmo : A Concurrent Separation Logic for Multicore Ocaml (vidéo), présentation en anglais de Glen Mével, alors doctorant chez Inria (ICFP 2020), ACM SIGPLAN, 8/12/2020.
- A Separation Logic for Effect Handlers, Inria, article en anglais de François Pottier et Paulo Emílio de Vilhena sur la vérification des programmes comprenant des gestionnaires d'effets (ACM POPL 2021), 1/2021.