Sujet de stage M2 recherche
Encadrant : Vincent Balat
Lieu : Laboratoire Preuves, Programmes et Systèmes, Université Paris Diderot (13e arrondissement de Paris)
Mots-clés : Programmation Fonctionnelle, Objective Caml, Programmation Web, Ocsigen, Normalisation par évaluation, Évaluation partielle dirigée par les types, Lambda-calcul
Pré-requis : Bonne connaissance d'Objective Caml (ou de langages fonctionnels)
Contact : vincent.balat(remplacer ça par @)univ-paris-diderot.fr
Résumé : La normalisation par évaluation est une technique qui permet de générer le code source en forme normale d'un lambda-terme en l'évaluant. Le but du stage est d'explorer une application assez inattendue de cet algorithme : la génération de Javascript depuis un programme OCaml. Cela pourrait permettre, dans le cadre d'une application Web, de générer dynamiquement côté serveur des versions spécialisées du code à exécuter dans un navigateur. Nous essaierons de voir jusqu'à quel point cette idée peut être poussée dans ce cas concret, et si l'on peut étendre la technique à un sous-ensemble intéressant du langage. Nous réfléchirons aussi à la manière d'intégrer au projet Ocsigen des techniques de génération dynamique de code. Le stage devrait déboucher également sur la réalisation d'un prototype.
Le but de ce stage est d'explorer une application assez inattendue de l'algorithme de normalisation par évaluation : la génération de Javascript depuis un programme OCaml.
La Normalisation par Évaluation (NBE) est généralement vue comme une technique permettant d'obtenir la forme normale d'un lambda-terme en extrayant un représentant canonique de son interprétation dans un modèle dénotationnel. Mais cette technique peut être implémentée concrètement et a déjà été utilisée pour faire de l'évaluation partielle de programmes (c'est-à-dire créer des versions spécialisées de programmes). C'est ce que l'on appelle l'Évaluation Partielle Dirigée par les Types (TDPE). Dans cette utilisation, un algorithme de quelques lignes seulement permet de générer un code source en forme normale à partir d'un programme compilé ! L'outil de normalisation par évaluation a donc la propriété (assez magique !) de décompiler les programmes. Alors que l'on peut l'implémenter sans rien connaître du langage machine ou du bytecode...
Nous souhaitons exploiter ces propriétés de décompilation afin de générer du code à exécuter dans un navigateur, dans le cadre d'une application Web distribuée. Le but est de construire des applications client-serveur avec interface Web. Sur le serveur Web tourne une application qui génère des pages dans lesquelles sont inclus des exécutables (par exemple du Javascript). Nous souhaitons programmer les deux côtés de l'application dans un seul langage (OCaml) et comme une seule application. Pour l'instant le module Eliom d'Ocsigen génère statiquement les portions de code à exécuter dans le navigateur (en utilisant un compilateur vers Javascript). L'alternative que nous souhaitons explorer est la génération dynamique de code spécialisé pour le client. Et plutôt qu'embarquer le compilateur OCaml dans le serveur Web, nous souhaitons voir s'il est possible de faire de la décompilation vers Javascript par évaluation. Cela devrait permettre en théorie d'envoyer sur le client des fonctions dont on ne dispose pas du code (par exemple des fonctions de bibliothèques déjà compilées).
L'application de la normalisation par évaluation à un cas aussi concret pose de nombreux problèmes :
Tous ces problèmes rendent très difficile l'utilisation de TDPE dans des cas réels. Mais nous espérons que certaines solutions soient envisageables dans ce cadre précis et permettent de progresser dans la recherche sur cette technique de normalisation.
Enfin nous nous pencherons sur l'intégration à Eliom de techniques de génération dynamique de code.
Le stage devrait déboucher sur l'écriture d'un prototype.