Scheme to JavaScript compilation
Institution:
NiceDisciplines:
Directors:
Abstract EN:
Cette thèse présente un compilateur de Scheme vers JavaScript. Bien que très proches, ces deux langages diffèrent dans des points majeurs. En particulier, les continuations et la récursivité terminale, qui n'existent que dans Scheme, sont importantes dans le contexte d'une telle compilation. Dans ces travaux nous montrons que, sans ces deux fonctionnalités, produit du code aussi efficace que du code écrit à la main. Cependant, ce langage réduit n'est pas conforme à R5RS, la spécification de Scheme, mais représente un sous-langage pragmatique. Dans cette configuration est utilisé quotidiennement dans notre projet. Bien que désactivé par défaut, permet aussi la récursivité terminale et les continuations. Nous présentons dans cette thèse une implémentation de la récursivité terminale qui se base sur la technique des trampolines. Elle a la propriété intéressante de faciliter la coexistence d'un code généré et d'un code JavaScript existant. Notre implémentation des continuations est une amélioration des continuation à base d'exceptions. Nous avons adapté des techniques développées pour des continuations 'one-shot' (utilisées par exemple pour la migration). Pour capturer l'essence de notre algorithme de compilation des continuations nous avons développé, une version canonique de notre implémentation. Indépendant des fonctionnalités non-standard de Scheme, comme les exceptions, nous proposons comme alternative à CPS. Pour une version simplifiée de Scheme nous avons prouvé que est correct.
Abstract FR:
This thesis presents a Scheme to JavaScript compiler. Scheme and JavaScript are similar in many respects but differ in some major points. In the context of a Scheme to JavaScript compilation JavaScript's lack of proper tail recursion and continuations is especially noticeable. In this work we first show that without these two features our compiler produces efficient code that rivals with handwritten JavaScript code. However, this reduced input language is not compliant to the Scheme specification but represents a pragmatical sub-language. In this configuration {\sc{Scm2Js}} has been successfully used on a daily basis within our team. Even though not enabled by default, provides proper tail recursion and continuations too. We present a trampoline based technique for proper tail recursion that has the distinct advantage of efficiently integrating with existing JavaScript code. Our continuations implementation is an improvement over existing exception based continuations. We have adapted previous techniques that were designed for one-shot continuations (designed for check-pointing and migration). In order to capture the essence of our continuation algorithm we have developed, a canonic version of our implementation. Without dependencies on non-standard Scheme features, like exceptions, we advertise as an alternative to CPS. We have proved the correctness of on a simplified version of Scheme.