Tierless Web Programming in ML Gabriel Radanne
Total Page:16
File Type:pdf, Size:1020Kb
Tierless Web programming in ML Gabriel Radanne To cite this version: Gabriel Radanne. Tierless Web programming in ML. Programming Languages [cs.PL]. Université Paris Diderot (Paris 7), 2017. English. tel-01788885 HAL Id: tel-01788885 https://hal.archives-ouvertes.fr/tel-01788885 Submitted on 9 May 2018 HAL is a multi-disciplinary open access L’archive ouverte pluridisciplinaire HAL, est archive for the deposit and dissemination of sci- destinée au dépôt et à la diffusion de documents entific research documents, whether they are pub- scientifiques de niveau recherche, publiés ou non, lished or not. The documents may come from émanant des établissements d’enseignement et de teaching and research institutions in France or recherche français ou étrangers, des laboratoires abroad, or from public or private research centers. publics ou privés. Distributed under a Creative Commons Attribution - NonCommercial - ShareAlike| 4.0 International License Thèse de doctorat de l’Université Sorbonne Paris Cité Préparée à l’Université Paris Diderot au Laboratoire IRIF Ecole Doctorale 386 — Science Mathématiques De Paris Centre Tierless Web programming in ML par Gabriel Radanne Thèse de Doctorat d’informatique Dirigée par Roberto Di Cosmo et Jérôme Vouillon Thèse soutenue publiquement le 14 Novembre 2017 devant le jury constitué de Manuel Serrano Président du Jury Roberto Di Cosmo Directeur de thèse Jérôme Vouillon Co-Directeur de thèse Koen Claessen Rapporteur Jacques Garrigue Rapporteur Coen De Roover Examinateur Xavier Leroy Examinateur Jeremy Yallop Examinateur This work is licensed under a Creative Commons “Attribution- NonCommercial-ShareAlike 4.0 International” license. Abstract Eliom is a dialect of OCaml for Web programming in which server and client pieces of code can be mixed in the same file using syntactic annotations. This allows to build a whole application as a single distributed program, in which it is possible to define in a composable way reusable widgets with both server and client behaviors. Eliom is type-safe, as it ensures that communications are well-behaved through novel language constructs that match the specificity of Web programming. Eliom is also efficient, it provides static slicing which separates client and server parts at compile time and avoids back-and-forth communications between the client and the server. Finally, Eliom supports modularity and encapsulation thanks to an extension of the OCaml module system featuring tierless annotations that specify whether some definitions should be on the server, on the client, or both. This thesis presents the design, the formalization and the implementation of the Eliom language. Résumé Eliom est un dialecte d’OCaml pour la programmation Web qui permet, à l’aide d’annotations syntaxiques, de déclarer code client et code serveur dans un même fichier. Ceci permet de construire une application complète comme un unique programme distribué dans lequel il est possible de définir des widgets aisément composables avec des comportements à la fois client et serveur. Eliom assure un bon comportement des communications grâce à un système de type et de nouvelles constructions adaptés à la programmation Web. De plus, Eliom est efficace : un découpage statique sépare les parties client et serveur durant la compilation et évite de trop nombreuses communications entre le client et le serveur. Enfin, Eliom supporte la modularité et l’encapsulation grâce à une extension du système de module d’OCaml permettant l’ajout d’annotations indiquant si une définition est présente sur le serveur, le client, ou les deux. Cette thèse présente la conception, la formalisation et l’implémention du langage Eliom. Remerciements Ceux qui me connaissent savent que je ne suis pas particulièrement expansif, je serai donc bref: je remercie ma famille, mes amis, mes collègues et l’univers. 5 Remerciements, Deuxième essai Je voudrais tout d’abord remercier mes deux directeurs de thèse, Roberto et Jérôme, qui ont formé une paire remarquablement complémentaire et m’ont beaucoup aidé dans tous les aspects de ma recherche, scientifiques ou non. Je remercie l’équipe Ocsigen et les membres de l’Irill pour leur compagnie, conseils et pour avoir pris le temps d’écouter mes idées farfelues sur les prochaines fonctionnalités révolutionnaires qui vont faire d’Eliom le langage de programmation Web le plus mieux au monde! Je remercie Jacques, pour cette petite remarque pendant ICFP 2015: “Tu devrais parler avec Oleg, ce que tu fais ressemble à MetaOCaml”. Merci également à Oleg, pour ses remarques et ses encouragements. Avant de commencer cette thèse, j’ai eu la chance de faire de nombreux stages. Je voudrais remercier tous les gens avec qui j’ai pu interagir à Édimbourg, Gotheborg et Grenoble. Ces stages m’ont beaucoup appris et surtout, je m’y suis énormément amusé! Merci également aux membres d’OCamllabs qui m’ont donné l’occasion de m’échapper de ma thèse pendant 3 mois pour faire joujou avec Mirage et boire du cidre dans les pubs de Cambridge. En parlant de cidre, merci à tous les potes de promo de Rennes: Benoit, Simon, Nicolas, Clément, Gael et tous les autres. Merci également à David pour son encadrement pendant mes études et pour m’avoir orienté vers d’excellents stages. Merci aux membres de l’IRIF avec qui j’ai pu interagir, notamment Vincent, Ralf, Jean-Baptiste et Michele avec qui j’ai eu le plaisir de faire mes enseignements et Alexis et Delia, pour leurs discussions et coups de pouce occasionnels. Je remercie particulière- ment Odile, sans qui, soyons honnête, je n’aurais jamais réussi à faire quoi que ce soit. Merci à tous les doctorants de PPS, en particulier la folle équipe du bureau 3026: Clé- ment, Yann, Rémi, Pierre, Amina, Charles, Léo, mon quotidien aurait été nettement plus terne sans vous. Enfin, je remercie ma famille, pour à peu près tout. 7 Contents 1 Introduction 13 1.1 On Web programming languages....................... 15 1.1.1 The client-server dichotomy...................... 15 1.1.2 Tierless programming languages.................... 16 1.1.3 Functional programming........................ 16 1.1.4 Static type systems........................... 17 1.1.5 Modularity and encapsulation..................... 17 1.2 Eliom ...................................... 19 1.2.1 The Ocsigen project......................... 19 1.2.2 Principles of the Eliom language................... 19 1.3 Plan....................................... 20 1.4 Contributions.................................. 21 2 Programming with Eliom 23 2.1 Core concepts.................................. 23 2.1.1 Sections................................. 23 2.1.2 Client fragments............................ 24 2.1.3 Injections................................ 24 2.2 Client-server behaviors............................. 24 2.2.1 Introducing side effects......................... 25 2.2.2 Communication and execution scheme................ 26 2.3 Heterogeneous datatypes............................ 26 2.3.1 Remote procedure calls........................ 27 2.3.2 Converters................................ 28 2.3.3 Client-server reactive broadcasts................... 29 2.4 Modules and signatures............................ 30 2.4.1 A primer on OCaml modules..................... 30 2.4.2 Modules and locations......................... 32 2.4.3 OCaml integration........................... 33 2.4.4 Heterogeneous implementations.................... 33 2.5 Mixed client-server data structures...................... 34 2.5.1 HTML ................................. 34 2.6 Shared values.................................. 35 2.6.1 Shared data-structures......................... 36 2.6.2 Mixed functors............................. 37 2.7 A sophisticated example: accordions..................... 37 2.8 Going further.................................. 40 9 3 The ML programming language 41 3.1 Syntax...................................... 41 3.2 Type system................................... 43 3.2.1 The expression language........................ 43 3.2.2 The module language......................... 45 3.2.3 Inference................................ 49 3.3 Semantics.................................... 49 3.3.1 Traces and Printing.......................... 52 3.3.2 Modules................................. 53 3.3.3 Notes on Soundness.......................... 56 3.4 Related works.................................. 56 4 The Eliom programming language 59 4.1 Syntax...................................... 60 4.1.1 Locations................................ 60 4.1.2 Expression language.......................... 61 4.1.3 Module language............................ 61 4.2 Type system................................... 62 4.2.1 Expressions............................... 62 4.2.2 Modules................................. 65 4.3 Interpreted semantics.............................. 72 4.3.1 Generated client programs....................... 72 4.3.2 Base, Client and Server declarations................. 73 4.3.3 Mixed modules............................. 77 4.4 Results on locations.............................. 81 4.4.1 Relation between ML and Eliom ................... 81 4.4.2 Notes on soundness........................... 83 5 Compilation of Eliom programs 85 5.1 Target languages MLs and MLc ....................... 85 5.1.1 Converters................................ 85 5.1.2 Injections................................ 86 5.1.3 Fragments................................ 87 5.1.4 Modules................................. 88 5.1.5 Type system rules........................... 89 5.1.6 Semantics rules............................