Notes de conception de X : unification des modules OCaml

2025-09-09

L'auteur conçoit un nouveau langage de programmation, X, visant à combiner l'inférence de type et la sous-typage structurel de PolySubML avec la plupart des fonctionnalités d'OCaml, en s'attaquant notamment aux différences syntaxiques et conceptuelles entre le système de modules d'OCaml et les valeurs ordinaires. L'article détaille comment les modules OCaml sont unifiés dans X, couvrant des aspects tels que les membres d'alias dans les enregistrements, la syntaxe struct et sig, l'ouverture et l'inclusion de modules, l'extension de modules et l'abstraction avec les types existentiels. Il propose des améliorations au système de modules d'OCaml, comme éviter les importations génériques. L'objectif final est un langage de programmation plus simple, plus facile à comprendre et plus puissant.

Lire plus
Développement

Au-delà de Hindley-Milner : Tutoriel sur le compilateur Cubiml avec sous-typage algébrique

2025-06-13

Cette série d’articles de blog présente Cubiml, un tutoriel de compilateur basé sur un nouveau système d’inférence de types appelé « cubic biunification », une amélioration du sous-typage algébrique. Il traite des limites du manque de prise en charge du sous-typage dans le système Hindley-Milner, offrant une inférence de types plus puissante et intuitive. Le tutoriel explique l’implémentation de Cubiml à l’aide d’exemples de code détaillés, couvrant les booléens, les instructions conditionnelles, les enregistrements, les fonctions, les liaisons let, les liaisons let récursives, la récursion mutuelle et la correspondance de types de cas. L’objectif final est un compilateur qui vérifie les types des programmes sans nécessiter d’annotations de type manuelles.

Lire plus
Développement inférence de types

Au revoir, erreurs de type mystérieuses : comment PolySubML améliore les messages d’erreur d’inférence de type

2025-05-23

PolySubML est un langage de programmation combinant l’inférence de type globale, la sous-typage et le polymorphisme avancé. Cet article explore la manière dont PolySubML conçoit de bons messages d’erreur de type et explique pourquoi les langages existants sont souvent insuffisants pour améliorer les messages d’erreur d’inférence de type. L’auteur propose cinq règles : 1. Ne jamais deviner ni revenir en arrière ; 2. Ne pas tirer de conclusions hâtives ; 3. Demander à l’utilisateur de clarifier son intention ; 4. Permettre à l’utilisateur d’écrire des annotations de type explicites ; 5. Ne pas inclure l’inférence de type statique dans le modèle d’exécution. En suivant ces règles, PolySubML résout avec succès de nombreux problèmes courants liés à l’inférence de type, améliorant ainsi considérablement la capacité de débogage du code.

Lire plus
Développement inférence de type

Au-delà de la POO : L’évolution du sous-typage dans les langages de programmation

2025-03-29

Cet article explore le rôle crucial du sous-typage dans la conception des langages de programmation. L’auteur, s’appuyant sur son expérience dans le développement de plusieurs langages de programmation, explique que le sous-typage ne se limite pas à l’héritage des classes en programmation orientée objet, mais est une notion beaucoup plus fondamentale : le type X est un sous-type du type Y si une valeur de type X peut être utilisée partout où une valeur de type Y est attendue. L’article explique clairement pourquoi le sous-typage est crucial même dans les langages de bas niveau orientés performances, permettant au compilateur de vérifier statiquement les valeurs nulles, les alias et d’autres problèmes, améliorant ainsi la fiabilité du code et, finalement, stimulant l’évolution des langages de programmation.

Lire plus
Développement sous-typage

Quatre limitations surprenantes du vérificateur d'emprunts de Rust

2024-12-24

Cet article explore quatre limitations surprenantes du vérificateur d'emprunts de Rust, rencontrées même par des programmeurs Rust expérimentés. La première limitation concerne l'incapacité du vérificateur d'emprunts à prendre pleinement en compte les instructions match et return, ce qui conduit à des vérifications redondantes lors du travail avec les HashMaps. La deuxième limitation concerne la programmation asynchrone, où Rust manque actuellement de la capacité d'exprimer certaines signatures de type de rappel asynchrone. La troisième se concentre sur les fermetures FnMut qui ne permettent pas le réemprunt de variables capturées, ce qui restreint l'accès aux états mutables dans les opérations asynchrones. Enfin, le manque de prise en compte du flux de contrôle du vérificateur Send entraîne que certains Futures qui devraient être Send sont incorrectement marqués comme non Send. L'auteur illustre ces limitations et leurs défis avec des exemples de code concrets et des solutions de contournement, plaidant pour des améliorations du système de types de Rust afin d'améliorer la productivité des développeurs.

Lire plus