IRILL - Research and Innovation on Free Software
Jussieu, Paris

Une boucle d’exécution OCaml pour la calculatrice Numworks

Objectifs

Le projet OMicroB [1, 2] est un environnement d’exécution pour le langage de programmation fonctionnel OCaml. Par rapport à l’environnement OCaml standard, OMicroB est optimisé pour s’exécuter sur des systèmes à faibles ressources et sans système d’exploitation (”bare-metal”). OMicroB supporte par exemple l’architecture AVR (cartes Arduino, etc), PIC32, ainsi que la carte éducative micro:bit, basée sur l’architecture ARM. Ces systèmes sont généralement programmés dans des langages de bas niveau, comme C. Cependant, utiliser un langage de plus haut niveau comme OCaml permet de gagner en expressivité, en sécurité, en particulier au niveau de la mémoire, et de profiter de bibliothèques OCaml existantes. Par ailleurs, OMicroB a aussi une vocation pédagogique : il a été établi que l’aspect ludique de la programmation de systèmes basés sur des cartes électroniques peut stimuler l’apprentissage de la programmation [3]. De la même manière, on peut espérer utiliser OMicroB pour stimuler l’apprentissage d’OCaml. Plus récemment, OMicroB a été porté sur la calculatrice graphique NumWorks, qui utilise un microprocesseur ARMv7 cadencé à 216MHz, avec 256kb de mémoire RAM et 8Mo de mémoire flash. Ces caractéristiques font de la Numworks l’appareil le plus puissant sur lequel OMicroB ait été porté à ce jour. Par ailleurs, une calculatrice offre, par nature, des possibilités d’interaction très différentes d’une carte électronique. Ces deux points ouvrent un nouveau champ d’applications possibles pour OMicroB.

L'objectif de ce stage est d'étudier les différentes pistes de portage de la boucle d'interaction (toplevel) OCaml sur calculatrice Numworks.

Une piste pour accomplir cet objectif ambitieux est d’utiliser OMicroB pour exécuter le compilateur OCaml, qui est lui même essentiellement un programme OCaml, sur la calculatrice. Des travaux préliminaires dans cette direction ont toutefois identifié certaines difficultés. 1. Le compilateur OCaml s’appuie plusieurs fonctions “externes” implémentées en C, qui dépendent parfois de certaines fonctionnalités du système d’exploitation : ces fonctions doivent être réécrites pour pouvoir s’exécuter sur Numworks. 2. L’analyse de type du compilateur charge des fichiers pré-compilés qui contiennent une sérialisation de la représentation des valeurs d’OCaml. La représentation des valeurs d’OMicroB étant différente (pour des raisons de performances), il n’est pas possible de manipuler ces fichiers directement. 3. L’interpréteur embarqué dans le compilateur OCaml, que nous souhaiterions utiliser, s’appuie directement sur la machine virtuelle OCaml, qui suit des conventions très différentes de celle d’OMicroB.

Le stagiaire travaillera donc au portage du compilateur OCaml sur la calculatrice Numworks, en s’attaquant à ces difficultés. Le compilateur étant un logiciel conséquent, il serait raisonnable d’en traiter les différents composants un par un, en testant le logiciel obtenu à chaque étape.

Tâches à réaliser

Une première tâche sera de tester la chaîne de compilation OMicroB sur Numworks en particulier pour une application simple avec interactions, entrées/sorties textuelles, en utilisant les primitives de la calculatrice. Ce sera l'occasion de mesurer l'occupation mémoire (Flash et Ram) de programmes existants (mini-prolog, mini-caml).

Une deuxième tâche préliminaire sera de tester la possibilité d'exécuter un programme OCaml compilé en byte-code directement sur la calculatrice et pour cela d'avoir une machine virtuelle OCaml (ocamlrun) sur la calcultrice. On pourra utiliser une VM simple écrite en OCaml qui pourra être alors compilée par OMicroB en embarquant les fonctions d'accès au fichier byte-code du programme.

Les autres tâches sont plus exploratoires.

  • Le premier composant du compilateur est l’analyseur syntaxique, qui reçoit le texte du programme et construit un arbre de syntaxe non typé. Pour ce composant, on s’attends à ce que la principale difficulté vienne du point (1) décrit ci-dessus, puisque l’analyseur syntaxique repose essentiellement sur un moteur implémenté en C.
  • Le deuxième composant est l’analyseur de type, qui élabore l’arbre de syntaxe non-typé en un arbre de syntaxe typé. Pour ce composant, la difficulté principale sera le point (2). Une solution naive serait de réécrire “à la main” le contenu des fichiers sérialisés dans des fichiers sources OCaml. Une meilleur solution serait d’écrire un logiciel simple accomplissant cette réécriture. Viennent ensuite plusieurs passes de compilation qui convertissent le programme dans une série de représentations intermédiaires, jusqu’au code-octet. Nous ne pensons pas que ces passes poserons de difficultés particulières.
  • Enfin vient l’interpréteur, qui exécute effectivement le programme. Comme expliqué dans le point (3), il ne sera sans doute pas possible d’utiliser l’interpréteur basé sur la machine virtuelle OCaml directement. Plusieurs solutions alternatives peuvent être considérées. La première serait d’utiliser Camlboot [4], un interpréteur pour l’arbre de syntaxe non-typé. Une seconde serait d’écrire un interpréteur pour le langage intermédiaire du compilateur OCaml, Lambda. Le stagiaire étudiera les avantages et les inconvénients de ces approches, et implémentera la plus prometteuse.

Le résultat de ces travaux sera une application Numworks pouvant exécuter des programmesOCaml écrits directement sur la calculatrice. Pour faciliter l’interaction avec le code OCaml sur calculatrice, le stagiaire pourra implémenter une boucle d’évaluation : l’utilisateur entre une expression OCaml, appuie sur “entrée” ce qui déclenche l’évaluation de l’expression et l’affichage du résultat. Cette boucle pourra aussi permettre de charger du code OCaml enregistré dans la mémoire de la calculatrice (similaire au #use de l’exécutable ocaml).

Prérequis

  • avoir des bases de programmation en C et en OCaml
  • des connaissances en compilation et en programmation des microcontrôleurs sont un plus

Références

  1. Steven Varoumas, Benoı̂t Vaugon et Emmanuel Chailloux. “A Generic Virtual Machine Approach for Programming Microcontrollers : the OMicroB Project”. In : 9th European Congress on Embedded Real Time Software and Systems (ERTS’18). 2018, p. 1-10.
  2. Steven Varoumas et al. “Programming microcontrollers through high-level abstractions : The OMicroB project”. In : J. Comput. Lang. 77 (2023), p. 101228. doi : 10.1016/J.COLA.2023.101228. url : https://doi.org/10.1016/j.cola.2023.101228.
  3. Jonny Austin et al. “The BBC micro:bit : from the UK to the world”. In : Communications of the ACM 63.3 (2020), p. 62-69. 4.
  4. Nathanaëlle Courant, Julien Lepiller et Gabriel Scherer. “Debootstrapping without Archeology - Stacked Implementations in Camlboot”. In : Art Sci. Eng. Program. 6.3 (2022), p. 13. doi : 10 . 22152 / PROGRAMMING - JOURNAL . ORG / 2022 / 6 / 13. url : https://doi.org/10.22152/programming-journal.org/2022/6/13.

Le stagiaire devra être d'accord pour que ses contributions soient distribuées sous licence libre.

Contacts : Basile Pesin & Emmanuel Chailloux & Lilian Besson & Loïc Sylvestre