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

Erweiterbarkeit in Programmiersprachen: Ein Überblick

Grundlegende Informationen

  • Paper-ID: 2510.13236
  • Titel: Extensibility in Programming Languages: An overview
  • Autor: Sebastian Mateos Nicolajsen (IT University of Copenhagen)
  • Klassifizierung: cs.PL (Programmiersprachen)
  • Veröffentlichungsdatum: 15. Oktober 2025 (arXiv-Preprint)
  • Paper-Link: https://arxiv.org/abs/2510.13236

Zusammenfassung

Dieser Artikel untersucht die Erweiterbarkeit von Programmiersprachen eingehend und liefert eine Begründung für Komponenten, die in der traditionellen Sprachgestaltung häufig übersehen werden. Der Autor identifiziert durch eine Literaturübersicht vier Schlüsselthemen zur Erweiterbarkeit: Makros (Macros), Module (Modules), Typen (Types) und Reflexion (Reflection), und hebt diverse Strategien zur Förderung der Erweiterbarkeit hervor. Die Analyse erstreckt sich auch auf themenübergreifende Eigenschaften wie Parametrisierung (Parametricism) und Verhalten als Bürger erster Klasse (First-class citizen behaviour), wobei die Bedeutung von Anpassungsfähigkeit und Flexibilität in Programmiersprachenkonstrukten durch mehrere Komplexitätsebenen verdeutlicht wird.

Forschungshintergrund und Motivation

Forschungsfragen

  1. Kernproblem: Die Erweiterbarkeit von Programmiersprachen wird in der Sprachgestaltung häufig übersehen und es mangelt an systematischer Forschung und Zusammenfassung
  2. Vage Definition: Das Konzept der Erweiterbarkeit ist in der Literatur unscharf definiert und es fehlt ein klares Klassifizierungs- und Verständnisrahmen
  3. Praktische Anforderungen: Bestehende Programmiersprachen sind bei neuen Anforderungen oft durch ihre unveränderlichen Eigenschaften begrenzt

Bedeutung des Problems

  1. Sprachbegrenzungen: Die traditionelle Ansicht betrachtet Programmiersprachen als unveränderliche Artefakte, was die Fähigkeit der Sprache, sich neuen Anforderungen anzupassen, einschränkt
  2. Entwicklungseffizienz: Erweiterbarkeit ist der einzige Weg, um die Produktivität von Entwicklern zu erhöhen und Sprachbegrenzungen zu überwinden
  3. Zukünftige Entwicklung: Wissenschaftler wie Guy Steele vertreten die Ansicht, dass die Gestaltung für Sprachwachstum (d. h. Erweiterbarkeit) ein grundlegendes Element zukünftiger Sprachen sein sollte

Einschränkungen bestehender Ansätze

  1. Verteilte Forschung: Obwohl Konzepte wie Makros, Reflexion, Funktionen und Module weit erforscht sind, konzentrieren sie sich hauptsächlich auf Wiederverwendbarkeit, Modularität und Abstraktion, nicht auf Erweiterbarkeit selbst
  2. Fehlende Gesamtperspektive: Bestehende Arbeiten konzentrieren sich hauptsächlich auf die Verbesserung der Erweiterbarkeit oder Implementierungsdetails und ermangeln einer systematischen Untersuchung der Erweiterbarkeit selbst
  3. Theoretische Unzulänglichkeit: Erweiterbarkeit mangelt es im Vergleich zu Konzepten wie Abstraktion an klaren Definitionen und theoretischen Grundlagen

Kernbeiträge

  1. Systematische Klassifizierung: Identifizierung von vier Kernthemen zur Erweiterbarkeit durch Literaturübersicht (Makros, Module, Typen, Reflexion)
  2. Themenübergreifende Eigenschaften: Entdeckung und Analyse von zwei wichtigen themenübergreifenden Eigenschaften (Parametrisierung und Verhalten als Bürger erster Klasse)
  3. Theoretischer Rahmen: Bereitstellung eines strukturierten Rahmens zum Verständnis der Erweiterbarkeit von Programmiersprachen
  4. Praktische Anleitung: Bereitstellung von Orientierungshilfen für zukünftige Sprachgestalter zur Bewertung und Berücksichtigung der Spracherweiterbarkeit
  5. Identifizierung von Forschungslücken: Aufzeigung weniger erforschter Konzepte wie Bootstrapping, Compiler-Hooks und virtuelle Maschinen

Methodische Details

Forschungsmethode

Der Artikel verwendet eine systematische Literaturübersichtsmethode, die dem von Kitchenham et al. definierten Prozess folgt und die Datenkodierungsmethode der Grounded Theory kombiniert.

Literatursammlungsstrategie

Anfängliche Literatursammlung

  • Datenquellen: 10 konferenzen und Zeitschriften zur Sprachentechnik
  • Konferenzen umfassen: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
  • Anfänglicher Umfang: 7090 Artikel
  • Ausschlussstrategie: Ausschluss von Konferenzen, die sich auf spezifische Sprachparadigmen konzentrieren

Filterungsprozess

  1. Schlüsselwortfilterung: Extraktion von 65 Schlüsselwörtern aus 19 relevanten Artikeln, Generierung von 19 zusätzlichen Schlüsselwörtern
  2. Titelfilterung: Vergleich von Schlüsselwörtern mit Artikeltiteln, Filterung auf 648 Artikel
  3. Zusammenfassungsfilterung: Vergleich von Schlüsselwörtern mit Zusammenfassungen und Schlussfolgerungen, weitere Filterung auf 223 Artikel
  4. Qualitätsbewertung: Klassifizierung basierend darauf, ob Erweiterbarkeit beschrieben oder diskutiert wird, in stark relevant (69 Artikel) und teilweise relevant (64 Artikel)

Datenextraktion und Synthese

  • Extraktionsmethode: Extraktion aller qualitativen Beschreibungen und Erweiterbarkeitsdiskussionen
  • Synthesemethode: Übernahme der Datenkodierungsmethode der Grounded Theory mit induktivem Ansatz zur Entwicklung eines Klassifizierungssystems
  • Iterative Verbesserung: Kontinuierliche Verbesserung und Neubewertung der Klassifizierung bei Entdeckung neuer Informationen

Experimentelle Einrichtung

Datensatzmerkmale

  • Gesamtumfang: Anfängliche 7090 Artikel
  • Zeitspanne: Daten aus dem Herbst 2022 gesammelt
  • Endgültige Analyse: 133 relevante Artikel (69 hochrelevant + 64 teilweise relevant)

Qualitätsbewertungskriterien

Primäre Fragen:

  • Diskutiert der Artikel Erweiterbarkeit? (direkt oder indirekt)
  • Diskutiert der Artikel Erweiterbarkeitskonzepte?

Sekundäre Fragen:

  • Diskutiert der Artikel spezifische Erweiterbarkeitskonzepte?
  • Diskutiert der Artikel spezifische Sprachen und Erweiterbarkeit?

Analysrahmen

Verwendung eines induktiven Ansatzes zur Identifizierung von Themen durch kontinuierlichen Vergleich und Klassifizierungsverfeinerung, was letztendlich zu einem Rahmen mit vier Hauptthemen und zwei themenübergreifenden Eigenschaften führt.

Experimentelle Ergebnisse

Hauptergebnisse: Vier Kernthemen

1. Makros (Macros)

Motivation: Makros ermöglichen es Sprachbenutzern, neue Kontrollmechanismen mit nahezu beliebigen Syntaxformen zu erstellen und dadurch die Erweiterbarkeit zu erhöhen.

Typklassifizierung:

  • Lexikalische Makros: Zeichenkettenbasierte Transformationen, syntaxunabhängig aber keine Syntaxsicherheit garantiert
  • Syntaktische Makros: Operieren auf abstrakten Syntaxbäumen (AST), garantieren Syntaxsicherheit
  • Semantische Makros: Bieten semantische Analyse, wie Typprüfung

Repräsentative Implementierungen:

  • Racket: Modulares Syntaxsystem
  • CPP: Lexikalische Makro-Engine für C
  • LISP: Syntaktisches Makrosystem
  • C++: Templates und Concepts (makroähnliche Funktionalität)

2. Module (Modules)

Motivation: Module werden zur Strukturierung von Code verwendet und ermöglichen es Benutzern, Code zu gruppieren, um domänenspezifische Sprachen oder Frameworks als Pakete bereitzustellen.

Typensystem:

  • Existenztypen: Ermöglichen Module erster Klasse, verbergen aber Implementierungsdetails
  • Abhängige Typen: Vollständig transparent
  • Explizite Typen: Bieten einen Kompromiss zwischen beiden

Designüberlegungen:

  • Hierarchische Struktur und Abhängigkeiten
  • Behandlung verschachtelter Module
  • Auflösung zirkulärer Abhängigkeiten

3. Typen (Types)

Motivation: Typensysteme ermöglichen es Benutzern, Garantien in der Sprache zu treffen. In Kombination mit Polymorphismus und generischer Programmierung bieten sie Vorhersagbarkeit und Sicherheit bei der Programmentwicklung.

Polymorphismusklassifizierung:

  • Ad-hoc-Polymorphismus: Typ hängt von Parametern ab
  • Universeller Polymorphismus:
    • Parametrischer Polymorphismus: Ermöglicht jeden Typ als Parameter
    • Subtyp-Polymorphismus: Ermöglicht Typsubstitution

Generische Programmierung:

  • Unterschiedliche Implementierungsweisen: VM-Unterstützung (C#) vs. Typauslöschung (Java)
  • Strukturelles Matching: ML, C++, OCaml usw.

4. Reflexion (Reflection)

Motivation: Reflexion ermöglicht es Benutzern, andere Programmierkonstrukte programmgesteuert zu modifizieren und erhöht die Modifizierbarkeit und Flexibilität von Konzepten, die sonst nicht modifizierbar wären.

Funktionsumfang:

  • Programmselbstbeobachtung und -modifikation
  • Klonen und Erweiterung von Klassen
  • Bereitstellung einer klaren VM-Schnittstelle

Herausforderungen:

  • Leistungskosten
  • Verletzung der Kapselung
  • Metastabilitätsprobleme

Themenübergreifende Eigenschaften

1. Parametrisierung (Parametricism)

Motivation: Parametrisierung erhöht die Anpassungsfähigkeit von Konstrukten und ermöglicht mehr Wiederverwendung und Abstraktion.

Anwendungsbereiche:

  • Modulparametrisierung: Wie Functor-Konstrukte in Standard ML und OCaml
  • Typparametrisierung: Durch Polymorphismus implementiert, wie C++ Concepts und Haskell Type Classes

2. Verhalten als Bürger erster Klasse (First-class citizen behaviour)

Motivation: Eigenschaften erster Klasse ermöglichen es Benutzern, Konstrukte wie andere Werte zu verwenden und ermöglichen dynamische Modifikation von Programmierkonstrukten.

Implementierungsweisen:

  • Module erster Klasse: Können wie Datenstrukturen manipuliert werden
  • Typen erster Klasse: Typgenerator-Mechanismen usw.

Weniger erforschte Konzepte

  1. Bootstrapping: Sprachenselbstinitialisierung, Beseitigung der Vorstellung von Sprachenunveränderlichkeit
  2. Compiler-Hooks: Ermöglichung von Benutzer-Injektionen in den Compiler
  3. Virtuelle Maschinen: Bereitstellung umfangreicher Funktionalität und Portabilität für Sprachenexperimente

Verwandte Arbeiten

Forschung zur Verbesserung der Erweiterbarkeit

  • Daniel Zingaro: Anwendung von Standishs Konzepten paraphrase, orthophrase, metaphrase auf Sprachensammlungen
  • Sebastian Erdweg und Felix Rieger: Vorschlag des Sugar*-Rahmens zur Argumentation über Sprachenerweiterbarkeit

Ausdruckskraftprobleme

  • Philip Wadler: Aufwerfung des Ausdruckskraftproblems in der Java-Mailingliste zur Messung der Erweiterbarkeit von Programmiersprachen

Lehrmaterialien

  • Robert Tennent: „Principles of Programming Languages", beschreibt verschiedene Komponenten von Sprachen
  • Peter Sestoft: „Concepts of Programming Languages", behandelt ähnliche Themen und Designentscheidungen

Schlussfolgerungen und Diskussion

Hauptschlussfolgerungen

  1. Bedeutung der Erweiterbarkeit: Erweiterbarkeit ist ein Schlüsselfaktor zur Überwindung von Sprachbegrenzungen und zur Förderung der gemeinschaftsgesteuerten Entwicklung
  2. Systematischer Rahmen: Vier Themen (Makros, Module, Typen, Reflexion) und zwei themenübergreifende Eigenschaften bieten einen strukturierten Rahmen zum Verständnis der Erweiterbarkeit
  3. Ausgewogene Überlegung: Erweiterbarkeit muss mit anderen Qualitätsattributen wie Leistung, Sicherheit und Vorhersagbarkeit abgewogen werden

Herausforderungen und Kompromisse

Kosten der Erweiterbarkeit

  1. Leistungsauswirkungen: Die Abstraktion und Erweiterbarkeit von Java und C# führen zu niedrigerer Leistung als C
  2. Sicherheitsrisiken: Von Benutzern entwickelte Erweiterungen können Sicherheitslücken einführen
  3. Erhöhte Komplexität: Kann zu Sprachaufblähung und kontextspezifischen Lösungen führen
  4. Abstraktionslecks: Abstraktionen in den meisten Sprachen lecken Implementierungsdetails

Designempfehlungen

  • Erweiterbarkeit sollte ein integrierter Bestandteil des Gesamtsprachendesigns sein
  • Sprachentechnik-Ingenieure sollten die hervorgehobenen Herausforderungen berücksichtigen
  • Es ist notwendig, ein Gleichgewicht zwischen Erweiterbarkeit und anderen Qualitätsattributen zu finden

Zukünftige Richtungen

  1. Tiefere Erkundung: Konzepte wie Bootstrapping, Compiler-Hooks und virtuelle Maschinen erfordern weitere Forschung
  2. Theorieentwicklung: Klarere Definitionen und theoretische Grundlagen der Erweiterbarkeit sind erforderlich
  3. Praktische Anwendung: Bereitstellung konkreterer Erweiterbarkeitsdesign-Richtlinien für Sprachgestalter

Tiefenbewertung

Stärken

  1. Hohe Systematik: Erste systematische Literaturübersicht und Klassifizierung der Erweiterbarkeit von Programmiersprachen
  2. Klarer Rahmen: Bereitstellung eines klaren Analyserahmens mit vier Themen plus zwei themenübergreifenden Eigenschaften
  3. Hoher praktischer Wert: Bietet wertvollen Bezug und Anleitung für Sprachgestalter
  4. Strenge Methode: Verwendung standardisierter systematischer Literaturübersichtsmethoden mit transparentem und nachverfolgbarem Prozess
  5. Breite Abdeckung: Umfasst mehrere Sprachen und Technologien von historisch bis modern

Mängel

  1. Vage Definition: Obwohl auf die Unschärfe der Erweiterbarkeitsdefinition hingewiesen wird, bietet dieser Artikel auch keine präzisere Definition
  2. Unzureichende Empirie: Mangel an quantitativer empirischer Forschung, hauptsächlich auf qualitative Analyse angewiesen
  3. Bewertungskriterien: Mangel an objektiven Standards zur Bewertung der Wirksamkeit verschiedener Erweiterungsmechanismen
  4. Bereichsbegrenzung: Ausschluss einiger wichtiger Konferenzen könnte relevante Forschung übersehen
  5. Forscherbias: Analyse durch einen einzelnen Forscher könnte subjektive Verzerrungen einführen

Einfluss

  1. Akademischer Beitrag: Bietet neue Forschungsperspektiven und Rahmen für das Programmiersprachen-Forschungsgebiet
  2. Praktischer Wert: Von großem Referenzwert für Sprachgestalter und Werkzeugentwickler
  3. Inspirationswert: Könnte tiefere Forschung zur Sprachenerweiterbarkeit anregen
  4. Bildungswert: Kann als wichtiges Referenzmaterial für Programmiersprachen-Kurse dienen

Anwendungsszenarien

  1. Sprachengestaltung: Gestaltung neuer Programmiersprachen und Verbesserung bestehender Sprachen
  2. Werkzeugentwicklung: Designentscheidungen für Erweiterungsmechanismen in IDEs, Compilern und anderen Entwicklungswerkzeugen
  3. Akademische Forschung: Weitere Forschung in Programmiersprachen-Theorie und -Praxis
  4. Bildung und Schulung: Entwicklung von Programmiersprachen-Kursen und Schulungsmaterialien

Literaturverzeichnis

Der Artikel enthält 135 Referenzen, die mehrere Aspekte der Programmiersprachen abdecken, einschließlich Geschichte, Designprinzipien und konkrete Implementierungen, und bietet eine umfassende Literaturgrundlage für die Erweiterbarkeitsforschung. Wichtige Referenzen umfassen:

  • Standish (1975): Frühe Arbeiten zum Design erweiterbarer Programmiersprachen
  • Steele (1998): Wichtige Perspektiven zum Sprachwachstum
  • Verschiedene HOPL-Artikel: Bieten wertvolle Materialien zur Sprachengeschichte und Designgedanken

Gesamtbewertung: Dies ist ein hochqualitatives Übersichtsartikel, der einen wichtigen theoretischen Rahmen und praktische Anleitung für die Forschung zur Erweiterbarkeit von Programmiersprachen bietet. Obwohl es einige Einschränkungen gibt, machen die systematische Methode und der klare Analysrahmen es zu einem wichtigen Beitrag auf diesem Gebiet. Es hat wichtigen Referenzwert für Sprachgestalter, Forscher und Studenten.