Découvrir MetaOCaml dans son navigateur

Posté par  . Édité par ZeroHeure, bubar🦥, Benoît Sibaud, Davy Defaud et Pierre Jarillon. Modéré par Florent Zara. Licence CC By‑SA.
Étiquettes :
29
13
nov.
2016
Programmation fonctionnelle

OCaml est un langage de programmation généraliste, fonctionnel et statiquement typé. MetaOCaml est une extension. Le « Meta » dans le nom fait référence à la méta‐programmation, l’écriture de programmes qui manipulent des programmes.

Un cours sur MetaOCaml est disponible en ligne sur le site de l’université de Cambridge.

MetaOCaml est donc une extension d’OCaml, un dialecte non standard du langage qui a une longue histoire. Dérivée de MetaML il y a environ 15 ans, c’est toujours resté un prototype de recherche, avec une base d’utilisateurs petite mais active au fil des années — au contraire de la plupart des prototypes de recherche qui meurent de mort naturelle assez vite. Le « Meta » dans le nom fait référence à la méta‐programmation, c’est‐à‐dire l’écriture de programmes qui manipulent des programmes. MetaML et MetaOCaml sont dans la catégorie de la méta‐programmation « étagée » (staged), où il y a un nombre arbitraire de « niveaux d’exécution » qui construisent des morceaux de programme des niveaux précédents et les font tourner. Par opposition, il y a des langages avec un nombre fixe de niveaux, par exemple « statique, à la compilation » et « dynamique, à l’exécution », comme en C++ ou D, beaucoup de langages à « macros » où la méta‐programmation se résume à une passe de réécriture de code, et des langages où la notion de niveaux est plus floue, plus complexe et combinée avec des réécritures syntactiques de nature un peu différente et moins structurée, comme en Scheme, Lisp ou Racket).

Une façon de penser à MetaOCaml est que c’est un langage pour décrire des optimisations de la forme « et si on spécialise comme ci ou comme ça à la compilation, on peut obtenir du super code au final », mais où la distinction entre ce qui est spécialisé « à la compilation » et ce qui est exécuté au final est explicite. Elle ne repose pas sur l’intelligence du compilateur, mais sur des marqueurs explicites insérés par le programmeur ou la programmeuse (il y a eu beaucoup de recherche sur l’évaluation partielle comme super‐optimisation et le consensus de la communauté c’est que c’est puissant mais trop fragile ou difficile à prévoir pour qu’on puisse laisser le compilateur le faire sans guidage humain).

Un exemple récent d’utilisation de la technique est Stream Fusion, to Completeness, un article qui utilise cette forme de méta‐programmation pour optimiser des programmes décrivant des manipulations de flots de données, avec une version en OCaml (utilisant MetaOCaml) et une version en Scala (utilisant LMS, Lightweight Modular Staging, une autre approche de la méta‐programmation par étage). Ils implémentent comme une bibliothèque des optimisations puissantes de « fusion » qui sont traditionnellement espérées par le compilateur.
Ce travail va être présenté à Paris en janvier 2017, puisque les universités Paris 6 et Paris 7 accueillent et organisent cette année une des principales conférences de recherche en langages de programmation et, d’ailleurs, si vous êtes étudiant et que vous voulez y aller et manger sur place sans payer les frais d’inscription, vous pouvez vous proposer comme volontaire pour aider.

Ne nous laissons pas distraire. Le sujet de cette dépêche c’est un cours sur MetaOCaml disponible en ligne, créé par Jeremy Yallop à l’université de Cambridge. C’est une sous‐partie du cours Advanced Functional Programming qui s’adresse à des gens connaissant déjà la programmation fonctionnelle, mais pas forcément ses aspects les plus avancés. La partie sur MetaOCaml est à la fin et elle est disponible (comme le reste) sous la forme de cahiers interactifs dans le navigateur (ça utilise IOCamlJS, un noyau IPython / Jupyter pour OCaml).

Voilà, bonne lecture.

Aller plus loin

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.