Thèse Année : 2024

Retrofitting and strengthening the ML module system

Mise à niveau et renforcement du système de module ML

Résumé

ML modules come as an additional layer on top of a core language to offer large-scale notions of abstraction and composition. They contributed to the success of OCaml and SML. While modules are easy to write for common cases, their advanced use may become tricky, as it is easy to run into edge cases and irregularities. Additionally, despite a long line of works, their meta-theory remains difficult to comprehend, with involved soundness proofs. In this thesis we propose a consolidation for the design of the type system of ML modules. To this aim, we developed two type systems for an OCaml-like language, including both applicative and generative functors, extended with transparent ascription signatures. The first type system is called Mω and is built on a prolific line of works that approached ML modules by translation to Fω, the higher-order polymorphic lambda calculus. Mω produces signatures in an OCaml-like syntax extended with Fω quantifiers. It treats abstraction via the introduction of quantified abstract types variables and the extrusion of the quantifiers to make them cover the right scope. We provide a reverse translation from Mω signatures to path-based source signatures along with a characterization of signature avoidance cases. The soundness of the type system is shown by elaboration in Fω. We improve over previous encodings of sealing within applicative functors, by the introduction of transparent existential types, a weaker form of existential types that can be lifted out of universal and arrow types. This shines a new light on the form of abstraction provided by applicative functors and brings their treatment much closer to those of generative functors. The second type system is called ZipML and is built on the path-based, fully-syntactic line of works. Unlike previous approaches, ZipML avoids the signature avoidance problem by introducing floating fields, which act as additional fields of a signature, invisible to the user but still accessible to the typechecker. In practice, they are handled as zippers on module signatures, and can be seen as a lightweight extension on existing signatures. Floating fields allow to delay the resolution of signature avoidance as long as possible or desired. Since they do not exist at runtime, they can be simplified along type equivalence, and dropped once they became unreachable. We give a simple criterion for the simplification of floating fields without loss of type-sharing. We present a principled strategy that implements this criterion and performs much better than OCaml. Remaining floating fields, instead of polluting the code, partially disappear at functor applications and fully disappear at signature ascription, including top-level interfaces. Residual unavoidable floating fields can be shown to the user as a last resort, either to be explicitly resolved by the user, or kept until link time. The correctness of the type system is proved by elaboration into Mω, which has itself been proved sound by translation to Fω. The language includes module type definitions that are returned in inferred types and kept as long as possible. ZipML has been designed to be a specification of an improvement over OCaml with transparent ascription, a better solution to signature avoidance, while staying close to the source language and to its implementation.

Cette thèse traite de la description formelle, de la conception et de la transformation de la couche modulaire des langages fonctionnels de la famille ML, en particulier du langage OCAML. Dans cette famille de langages, la modularité est fournie par une sur-couche spécifique séparée, qui constitue en soit un petit calcul. Bien que l'emploi courant des modules soit aisé, leur utilisation avancée révèle parfois des irrégularités et des cas limites. Par ailleurs, leur méta-théorie reste complexe, en particulier pour les preuves de sureté du typage. Dans l'objectif de proposer une amélioration de cette couche modulaire, cette thèse présente deux systèmes de types pour un langage proche d'OCaml, contenant à la fois des foncteurs applicatifs et génératifs, ainsi que des signatures ascriptions transparentes. Le premier système de types, M^('), s'appuie sur une ligne prolifique de travaux qui abordaient les modules ML par traduction vers F^('), le lambda-calcul polymorphique d'ordre supérieur. M^(')produit des signatures dans une syntaxe proche de OCAML, mais qui est étendue avec des quantificateurs de F^('). L'abstraction de types est traitée par l'introduction de variables de type quantifiées. L'extension de leur portée est simulée par un mécanisme d'extrusion. Une traduction inverse des signatures de M^(')vers des signatures sources est fournie, ainsi qu'une caractérisation des cas d'évitement de signature ' un problème classique des systèmes de modules. La sureté du typage est obtenue par une élaboration bien typée des termes de modules dans F^('). L'encodage de l'ascription dans le corps des foncteurs applicatifs est grandement simplifié par l'introduisant des types existentiels transparents, une forme plus faible de types existentiels qui peuvent être extraits au travers des quantifications universelles et des types de fonctions. Cela démontre que l'abstraction au sein des foncteurs applicatifs est en réalité une forme plus restreinte de types existentiels que ce qui était précédemment estimé. Le second système de types, ZIPML, est entièrement syntaxique et maintiens les chemins dans les signatures. ZIPML utilise une approche paresseuse et préventive du renforcement de signatures. Par ailleurs, ZIPML évite le problème d'évitement de signature en introduisant des champs flottants, qui agissent comme des champs supplémentaires d'une signature, invisibles pour l'utilisateur mais toujours accessibles par le vérificateur de types. En pratique, ils sont traités comme des zippeurs sur les signatures de modules, et constituent donc une extension relativement restreinte du langage de signatures. Les champs flottants permettent de retarder l'évitement de signature aussi longtemps que possible ou souhaité. Comme ils ne sont pas présent à l'exécution, ils peuvent être simplifiés, réordonnés ou supprimés une fois devenus inaccessibles. Cependant, la simplification des champs flottants se fait sans perte de partage. Nous présentons une stratégie qui implémente ce critère. Les champs flottants restants, au lieu de polluer le code, disparaissent lors de l'ascription, en particulier entre le fichier de code et celui d'interface. S'il reste malgré tout des champs flottants, ces derniers peuvent être présentés à l'utilisateur dans un message d'erreur. La correction du système de types est prouvée par une élaboration dans M^('), qui a elle-même été prouvée correcte par traduction vers F^('). Le langage inclut des définitions de types de modules qui sont retournées dans les types inférés et conservées aussi longtemps que possible. ZIPML a été conçu comme une spécification d'une amélioration par rapport à OCAML avec une ascension transparente, une meilleure solution au problème d'évitement de signature, tout en restant proche du langage source et de son implémentation.

Fichier principal
Vignette du fichier
va_Blaudeau_Clement.pdf (1.94 Mo) Télécharger le fichier
Origine Version validée par le jury (STAR)
Licence

Dates et versions

tel-05068118 , version 1 (14-05-2025)
tel-05068118 , version 2 (02-12-2025)

Licence

Identifiants

  • HAL Id : tel-05068118 , version 2

Citer

Clément Blaudeau. Retrofitting and strengthening the ML module system. Computer Science [cs]. Université Paris Cité, 2024. English. ⟨NNT : 2024UNIP7271⟩. ⟨tel-05068118v2⟩
223 Consultations
201 Téléchargements

Partager

  • More