Metaprogrammierung und Makros
Metaprogrammierung behandelt Programme als Daten, die andere Programme generieren, inspizieren oder transformieren können, wobei Makros eine kontrollierte syntaktische Abstraktion zur Kompilierzeit bieten.
Definition
Metaprogrammierung ist das Schreiben von Programmen, die andere Programme (oder sich selbst) erzeugen, analysieren oder transformieren; Makros sind eine Metaprogrammierungsfunktion, die die Quellsyntax vor oder während der Kompilierung in erweiterten Code umschreibt.
Scope
Dieses Thema behandelt Techniken, mit denen Programme andere Programme manipulieren: lexikalische und syntaktische Makros, hygienische Makroexpansion, Kompilierzeit-Codegenerierung, mehrstufige Programmierung, Reflexion und Templating-Systeme. Es wird erörtert, wie diese Mechanismen die Syntax und Abstraktionen einer Sprache erweitern, während die Korrektheit erhalten bleibt, insbesondere im Hinblick auf Variablenkollision und -bindung.
Core questions
- Wie kann syntaktische Abstraktion eine Sprache ohne unsichere Namenskollision erweitern?
- Was unterscheidet Kompilierzeit-Metaprogrammierung von Laufzeit-Reflexion?
- Wie trennt mehrstufige Programmierung die Programmgenerierung von der Ausführung?
- Wann verbessert Metaprogrammierung die Abstraktion im Vergleich zur Beeinträchtigung der Lesbarkeit und der Werkzeugunterstützung?
Key theories
- Hygienische Makroexpansion
- Kohlbecker und Kollegen führten hygienische Makros ein, die gebundene Variablen während der Expansion automatisch umbenennen, sodass Makro-generierter Code nicht unbeabsichtigt Namen an der Verwendungsstelle erfassen oder von diesen erfasst werden kann.
- Mehrstufige Programmierung
- Taha und Sheard formalisierten die gestufte Berechnung mit expliziten Annotationen und lieferten eine typisierte Darstellung der Generierung und Ausführung von Code über verschiedene Bewertungsstufen hinweg.
- Template-Metaprogrammierung
- Sheard und Peyton Jones fügten Haskell typisierte Kompilierzeit-Metaprogrammierung hinzu, die es Programmen ermöglicht, abstrakte Syntax zur Kompilierzeit zu erstellen und einzufügen.
Clinical relevance
Makros und Metaprogrammierung ermöglichen es Bibliotheksautoren, domänenspezifische Abstraktionen zu erstellen, Boilerplate-Code zu eliminieren und Kompilierzeit-Spezialisierungen für die Performance durchzuführen. Hygiene und Staging-Disziplin sind es, die diese leistungsstarken Funktionen sicher genug für den täglichen Gebrauch machen.
History
Makros gehen auf frühe Lisp- und Assembler-Sprachen zurück, aber unhygienische Lisp-Makros waren anfällig für unbeabsichtigte Variablenkollisionen. Kohlbeckers hygienische Expansion von 1986 löste dieses Problem und beeinflusste Schemas Syntax-Regeln. Nachfolgende Arbeiten formalisierten die mehrstufige Programmierung (MetaML) und brachten typisierte Kompilierzeit-Metaprogrammierung in Sprachen wie Haskell, Scala und Rust.
Debates
- Macht versus Verständlichkeit von Makros
- Sprachdesigner wägen die Ausdruckskraft uneingeschränkter syntaktischer Abstraktion gegen die Schwierigkeiten ab, die sie für Leser, Debugger und Werkzeuge schafft, was Hygiene und disziplinierte Makrosysteme motiviert.
Key figures
- Eugene Kohlbecker
- Matthias Felleisen
- Walid Taha
- Tim Sheard
- Simon Peyton Jones
Related topics
Seminal works
- kohlbecker1986
- taha2000
- sheard2002
- abelson1996
Frequently asked questions
- Was macht ein Makrosystem hygienisch?
- Ein hygienisches Makrosystem garantiert, dass von einem Makro eingeführte Bezeichner nicht unbeabsichtigt Bezeichner an der Aufrufstelle erfassen oder verdecken und umgekehrt, indem gebundene Variablen während der Expansion systematisch umbenannt werden.
- Wie unterscheidet sich Metaprogrammierung von gewöhnlichen Funktionen?
- Gewöhnliche Funktionen operieren auf Laufzeitwerten, während Metaprogrammierung auf Programmdarstellungen operiert, Code generiert oder transformiert, oft zur Kompilierzeit, bevor überhaupt Laufzeitwerte existieren.