2025-11-23T09:55:17.068946

Extensibility in Programming Languages: An overview

Nicolajsen
I here conduct an exploration of programming language extensibility, making an argument for an often overlooked component of conventional language design. Now, this is not a technical detailing of these components, rather, I attempt to provide an overview as I myself have lacked during my time investigating programming languages. Thus, read this as an introduction to the magical world of extensibility. Through a literature review, I identify key extensibility themes - Macros, Modules, Types, and Reflection - highlighting diverse strategies for fostering extensibility. The analysis extends to cross-theme properties such as Parametricism and First-class citizen behaviour, introducing layers of complexity by highlighting the importance of customizability and flexibility in programming language constructs. By outlining these facets of existing programming languages and research, I aim to inspire future language designers to assess and consider the extensibility of their creations critically.
academic

L'extensibilité dans les langages de programmation : Un aperçu

Informations fondamentales

  • ID de l'article : 2510.13236
  • Titre : L'extensibilité dans les langages de programmation : Un aperçu
  • Auteur : Sebastian Mateos Nicolajsen (Université informatique de Copenhague)
  • Classification : cs.PL (Langages de programmation)
  • Date de publication : 15 octobre 2025 (prépublication arXiv)
  • Lien de l'article : https://arxiv.org/abs/2510.13236

Résumé

Cet article explore en profondeur l'extensibilité des langages de programmation, fournissant une argumentation pour des composantes souvent négligées dans la conception traditionnelle des langages. L'auteur identifie, par le biais d'une revue de littérature, quatre thèmes clés d'extensibilité : les macros, les modules, les types et la réflexion, mettant en évidence des stratégies diversifiées favorisant l'extensibilité. L'analyse s'étend également aux propriétés transversales, telles que la paramétrisation et le comportement de citoyen de première classe, en introduisant des niveaux de complexité supplémentaires par l'accent mis sur l'importance de la personnalisation et de la flexibilité dans les constructions de langages de programmation.

Contexte et motivation de la recherche

Questions de recherche

  1. Problème central : L'extensibilité des langages de programmation est souvent négligée dans la conception des langages, manquant d'une recherche systématique et d'une synthèse
  2. Définition ambiguë : Le concept d'extensibilité est défini de manière ambiguë dans la littérature, manquant d'un cadre de classification et de compréhension clair
  3. Besoins pratiques : Les langages de programmation existants sont souvent limités par leurs caractéristiques immuables face à de nouvelles exigences

Importance du problème

  1. Limitations des langages : La perspective traditionnelle considère les langages de programmation comme des artefacts immuables, ce qui limite la capacité du langage à s'adapter aux nouvelles exigences
  2. Efficacité du développement : L'extensibilité est le seul moyen d'améliorer la productivité des développeurs et de surmonter les limitations des langages
  3. Développement futur : Des chercheurs comme Guy Steele considèrent que la conception pour la croissance des langages (c'est-à-dire l'extensibilité) devrait être un élément fondamental des langages futurs

Limitations des approches existantes

  1. Recherche fragmentée : Bien que des concepts tels que les macros, la réflexion, les fonctions et les modules soient largement étudiés, l'accent est principalement mis sur la réutilisabilité, la modularité et l'abstraction, plutôt que sur l'extensibilité elle-même
  2. Manque de perspective globale : Les travaux existants se concentrent principalement sur l'amélioration de l'extensibilité ou les détails d'implémentation, manquant d'une étude systématique de l'extensibilité elle-même
  3. Fondements théoriques insuffisants : L'extensibilité manque de définitions explicites et de fondements théoriques comparés à des concepts tels que l'abstraction

Contributions principales

  1. Classification systématique : Identification de quatre thèmes d'extensibilité fondamentaux (macros, modules, types, réflexion) par revue de littérature
  2. Propriétés transversales : Découverte et analyse de deux propriétés transversales importantes (paramétrisation et comportement de citoyen de première classe)
  3. Cadre théorique : Fourniture d'un cadre structuré pour comprendre l'extensibilité des langages de programmation
  4. Orientation pratique : Fourniture de conseils aux futurs concepteurs de langages pour évaluer et considérer l'extensibilité des langages
  5. Identification des lacunes de recherche : Identification de concepts moins explorés tels que l'amorçage, les crochets de compilateur et les machines virtuelles

Détails méthodologiques

Approche de recherche

Cet article emploie une méthode de revue systématique de la littérature, suivant le processus défini par Kitchenham et al., combiné avec les méthodes de codage de données de la théorie ancrée.

Stratégie de collecte de littérature

Ensemble de littérature initiale

  • Sources de données : 10 conférences et revues liées à l'ingénierie des langages
  • Conférences incluses : HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
  • Taille initiale : 7090 articles
  • Stratégie d'exclusion : Exclusion des conférences se concentrant sur des paradigmes de langage spécifiques

Processus de filtrage

  1. Filtrage par mots-clés : Extraction de 65 mots-clés à partir de 19 articles pertinents, générant 19 mots-clés supplémentaires
  2. Filtrage par titre : Comparaison des mots-clés avec les titres des articles, réduction à 648 articles
  3. Filtrage par résumé : Comparaison des mots-clés avec les résumés et conclusions, réduction supplémentaire à 223 articles
  4. Évaluation de la qualité : Classification en fortement pertinent (69 articles) et partiellement pertinent (64 articles) selon que l'article décrit ou discute l'extensibilité

Extraction et synthèse des données

  • Méthode d'extraction : Extraction de toutes les descriptions qualitatives et discussions sur l'extensibilité
  • Méthode de synthèse : Emprunt des méthodes de codage de données de la théorie ancrée, utilisant une approche inductive pour développer un système de classification
  • Amélioration itérative : Amélioration et réévaluation continues de la classification lors de la découverte de nouvelles informations

Configuration expérimentale

Caractéristiques de l'ensemble de données

  • Taille globale : 7090 articles initiaux
  • Période couverte : Données collectées à l'automne 2022
  • Analyse finale : 133 articles pertinents (69 hautement pertinents + 64 partiellement pertinents)

Critères d'évaluation de la qualité

Questions principales :

  • L'article discute-t-il de l'extensibilité ? (directement ou indirectement)
  • L'article discute-t-il de concepts d'extensibilité ?

Questions secondaires :

  • L'article discute-t-il de concepts d'extensibilité spécifiques ?
  • L'article discute-t-il de langages spécifiques et de l'extensibilité ?

Cadre d'analyse

Utilisation d'une approche inductive pour identifier les thèmes, par comparaison continue et raffinement de la classification, aboutissant finalement à un cadre de quatre thèmes principaux et deux propriétés transversales.

Résultats expérimentaux

Découvertes principales : Quatre thèmes fondamentaux

1. Macros

Motivation : Les macros permettent aux utilisateurs du langage de créer de nouveaux mécanismes de contrôle de formes syntaxiques presque arbitraires, augmentant ainsi l'extensibilité.

Classification des types :

  • Macros lexicales : Transformations basées sur des chaînes de caractères, indépendantes de la syntaxe mais ne garantissant pas la sécurité syntaxique
  • Macros syntaxiques : Opération sur les arbres de syntaxe abstraite (AST), garantissant la sécurité syntaxique
  • Macros sémantiques : Fourniture d'analyse sémantique, telle que la vérification de type

Implémentations représentatives :

  • Racket : Système de syntaxe modulaire
  • CPP : Moteur de macros lexicales pour le langage C
  • LISP : Système de macros syntaxiques
  • C++ : Modèles et concepts (fonctionnalités de type macro)

2. Modules

Motivation : Les modules sont utilisés pour structurer le code, permettant aux utilisateurs de regrouper le code afin de fournir des langages spécifiques à un domaine ou des cadres en tant que paquets.

Système de types :

  • Types existentiels : Permettent des modules de première classe mais masquent les détails d'implémentation
  • Types dépendants : Complètement transparents
  • Types explicites : Fournissent un compromis entre les deux

Considérations de conception :

  • Hiérarchie et relations de dépendance
  • Traitement des modules imbriqués
  • Résolution des dépendances circulaires

3. Types

Motivation : Les systèmes de types permettent aux utilisateurs de faire des garanties dans le langage, combinant la polymorphie et la programmation générique et autres attributs, fournissant aux utilisateurs la prévisibilité et la sécurité pour développer des programmes.

Classification de la polymorphie :

  • Polymorphie ad hoc : Le type dépend des paramètres
  • Polymorphie universelle :
    • Polymorphie paramétrique : Permet tout type comme paramètre
    • Polymorphie de sous-typage : Permet la substitution de types

Programmation générique :

  • Différentes approches d'implémentation : Support de machine virtuelle (C#) vs effacement de type (Java)
  • Correspondance structurelle : ML, C++, OCaml, etc.

4. Réflexion

Motivation : La réflexion permet aux utilisateurs de modifier de manière programmatique d'autres constructions de programmation, augmentant la modifiabilité et la flexibilité des concepts autrement immuables.

Portée des capacités :

  • Introspection et modification de programme
  • Clonage et extension de classes
  • Fourniture d'interfaces claires pour les machines virtuelles

Défis :

  • Coût de performance
  • Violation de l'encapsulation
  • Problèmes de métastabilité

Propriétés transversales

1. Paramétrisation

Motivation : La paramétrisation augmente la capacité de personnalisation des constructions, permettant une plus grande réutilisation et abstraction.

Domaines d'application :

  • Paramétrisation de modules : Tels que les constructions de foncteur de Standard ML et OCaml
  • Paramétrisation de types : Implémentée par la polymorphie, tels que les concepts de C++ et les classes de types de Haskell

2. Comportement de citoyen de première classe

Motivation : L'attribut de citoyen de première classe permet aux utilisateurs d'utiliser les constructions comme ils utilisent d'autres valeurs, permettant la modification dynamique des constructions de programmation.

Méthodes d'implémentation :

  • Modules de première classe : Peuvent être manipulés comme des structures de données
  • Types de première classe : Mécanismes tels que les générateurs de types

Concepts moins explorés

  1. Amorçage (Bootstrapping) : Auto-amorçage du langage, éliminant la notion d'immuabilité du langage
  2. Crochets de compilateur (Compiler hooks) : Permettre aux utilisateurs d'injecter des crochets dans le compilateur
  3. Machines virtuelles (Virtual machines) : Fournir des fonctionnalités riches et la portabilité pour l'expérimentation des langages

Travaux connexes

Recherche sur l'amélioration de l'extensibilité

  • Daniel Zingaro : Application des concepts de paraphrase, orthophrase et métaphrase de Standish aux ensembles de langages
  • Sebastian Erdweg et Felix Rieger : Proposition du cadre Sugar* pour raisonner sur l'extensibilité des langages

Problèmes d'expressivité

  • Philip Wadler : Proposition du problème d'expressivité dans la liste de diffusion Java, utilisé pour mesurer l'extensibilité des langages de programmation

Ressources pédagogiques

  • Robert Tennent : Principes des langages de programmation, décrivant différentes composantes des langages
  • Peter Sestoft : Concepts des langages de programmation, couvrant des sujets similaires et des décisions de conception

Conclusion et discussion

Conclusions principales

  1. Importance de l'extensibilité : L'extensibilité est un facteur clé pour surmonter les limitations des langages et promouvoir le développement piloté par la communauté
  2. Cadre systématique : Les quatre thèmes (macros, modules, types, réflexion) et deux propriétés transversales fournissent un cadre structuré pour comprendre l'extensibilité
  3. Considération équilibrée : L'extensibilité doit être équilibrée avec d'autres attributs de qualité tels que la performance, la sécurité et la prévisibilité

Défis et compromis

Coûts de l'extensibilité

  1. Impact sur la performance : L'abstraction et l'extensibilité de Java et C# les rendent moins performants que le langage C
  2. Risques de sécurité : Les extensions développées par les utilisateurs peuvent introduire des vulnérabilités de sécurité
  3. Augmentation de la complexité : Peut entraîner une prolifération du langage et des solutions spécifiques au contexte
  4. Fuite d'abstraction : Les abstractions dans la plupart des langages fuient les détails d'implémentation

Recommandations de conception

  • L'extensibilité devrait être une partie intégrée de la conception globale du langage
  • Les ingénieurs de langages devraient considérer les défis soulignés
  • Il est nécessaire de trouver un équilibre entre l'extensibilité et d'autres attributs de qualité

Directions futures

  1. Exploration approfondie : Les concepts tels que l'amorçage, les crochets de compilateur et les machines virtuelles nécessitent une recherche supplémentaire
  2. Développement théorique : Nécessité de définitions plus claires de l'extensibilité et de fondements théoriques
  3. Application pratique : Fourniture de conseils de conception d'extensibilité plus concrets aux concepteurs de langages

Évaluation approfondie

Points forts

  1. Force systématique : Première revue systématique de la littérature et classification de l'extensibilité des langages de programmation
  2. Cadre clair : Fourniture d'un cadre d'analyse clair de quatre thèmes plus deux propriétés transversales
  3. Valeur pratique élevée : Fourniture de références et d'orientations précieuses aux concepteurs de langages
  4. Méthodologie rigoureuse : Utilisation de méthodes standard de revue systématique de la littérature, processus transparent et traçable
  5. Couverture large : Couverture de multiples langages et technologies, de l'historique aux approches modernes

Limitations

  1. Définition ambiguë : Bien que l'article identifie l'ambiguïté dans la définition de l'extensibilité, il ne fournit pas non plus une définition plus précise
  2. Insuffisance empirique : Manque de recherche empirique quantifiée, s'appuyant principalement sur l'analyse qualitative
  3. Critères d'évaluation : Manque de normes objectives pour évaluer l'efficacité des différents mécanismes d'extensibilité
  4. Limitations de portée : L'exclusion de certaines conférences importantes pourrait entraîner l'omission de recherches pertinentes
  5. Biais du chercheur : L'analyse par un seul chercheur peut introduire des biais subjectifs

Impact

  1. Contribution académique : Fourniture d'une nouvelle perspective de recherche et d'un cadre pour le domaine de la recherche sur les langages de programmation
  2. Valeur pratique : Importance de la référence pour les concepteurs de langages et les développeurs d'outils
  3. Signification inspirante : Peut inspirer une recherche plus approfondie sur l'extensibilité des langages de programmation
  4. Valeur éducative : Peut servir de référence importante pour les cours de langages de programmation

Scénarios d'application

  1. Conception de langages : Conception de nouveaux langages de programmation et amélioration des langages existants
  2. Développement d'outils : Conception de mécanismes d'extension pour les outils de développement tels que les IDE et les compilateurs
  3. Recherche académique : Recherche supplémentaire en théorie et pratique des langages de programmation
  4. Formation et éducation : Développement de cours et de matériel de formation sur les langages de programmation

Références

L'article contient 135 références, couvrant l'histoire des langages de programmation, les principes de conception, les implémentations spécifiques et d'autres aspects, fournissant une base de littérature complète pour la recherche sur l'extensibilité. Les références clés incluent :

  • Standish (1975) : Travaux précoces sur la conception de langages de programmation extensibles
  • Steele (1998) : Perspectives importantes sur la croissance des langages
  • Divers articles HOPL : Fournissant des matériaux précieux sur l'histoire et les idées de conception des langages

Évaluation générale : Ceci est un article de synthèse de haute qualité qui fournit un cadre théorique important et des orientations pratiques pour la recherche sur l'extensibilité des langages de programmation. Bien qu'il présente certaines limitations, sa approche systématique et son cadre d'analyse clair en font une contribution importante au domaine. Il possède une valeur de référence importante pour les concepteurs de langages, les chercheurs et les étudiants.