Zum Inhalt springen
L

Wikipedia · einfach zusammengefasst · Stand

Metaprogrammierung

Metaprogrammierung ist in der Informatik die Erstellung von Computerprogrammen ("Metaprogramme"), die Computerprogramme erzeugen. Das Ziel dabei ist es, …

Inhalt6 Abschnitte
  1. 1. Definition und Bedeutung
  2. 2. Grundkonzepte
  3. 3. Einteilung
  4. 4. Homoikonische Sprachen und Lisp-Makros
  5. 5. Weitere Formen und Beispiele
  6. 6. Begriff in der Psychologie

Definition und Bedeutung

Metaprogrammierung bezeichnet in der Informatik die Erstellung von Computerprogrammen, sogenannten Metaprogrammen, die wiederum Computerprogramme erzeugen. Der Computer wirkt damit ganz oder teilweise am Programmierungsprozess mit. Automatisierung kann Fehler vermindern und ermöglicht es, Programme ad hoc zu erstellen und auszuführen.

Metaprogrammierung kann außerdem eine Programmiersprache um neue Konstruktionen erweitern. Besonders wirkungsvoll ist dies bei homoikonischen Programmiersprachen, in denen Programme und Daten gleichartig dargestellt werden. Dort eignet sich Metaprogrammierung unter anderem zur Entwicklung domänenspezifischer Sprachen, also speziell auf ein Anwendungsgebiet zugeschnittener Programmiersprachen.

Grundkonzepte

In homoikonischen Sprachen wie Lisp und seinen Dialekten erzeugt ein Metaprogramm neuen Code direkt auf der Ebene der Programmstruktur. Technisch kann es den Parsebaum bearbeiten, also die strukturierte Darstellung eines Programms nach seiner syntaktischen Analyse.

Fehlt die Homoikonizität, kann die Programmerzeugung ersatzweise lexikalisch erfolgen: Das Metaprogramm erstellt dann den Quelltext des Zielprogramms. Diese Form ist fehleranfälliger, kann aber grundsätzlich in jeder Programmiersprache eingesetzt werden.

Ein abgeschwächtes Mittel ist die Introspektion. Dabei kann ein Programm seine eigene Struktur untersuchen; die Struktur des Zielprogramms muss jedoch bereits bei der Erstellung des Metaprogramms feststehen.

Metaprogrammierung gehört zu den konzeptionellen Grundlagen von Programmiersprachen-Compilern. Sie unterstützt außerdem adaptive Softwaresysteme, die sich während der Laufzeit oder schon in der Entwicklungsphase leichter an veränderte Rahmenbedingungen anpassen können.

Einteilung

Metaprogrammierung lässt sich nach drei Gesichtspunkten klassifizieren:

  • Nach dem Bearbeitungszeitpunkt ist sie statisch, wenn sie zur Compiler-Zeit erfolgt, oder dynamisch, wenn sie zur Laufzeit stattfindet.
  • Nach dem Verhältnis der Sprachen ist sie homogen, wenn Metasprache und Objektsprache identisch sind. Die Metasprache dient zum Erzeugen oder Bearbeiten eines Programms; die Objektsprache ist die Sprache dieses Zielprogramms. Sind beide verschieden, spricht man von heterogener Metaprogrammierung.
  • Nach den Stufen ist sie mehrstufig, wenn die Objektsprache selbst wieder eine Metasprache ist. Andernfalls ist sie einstufig.

Homoikonische Sprachen und Lisp-Makros

Das Makrosystem von Lisp und seinen Dialekten gilt aufgrund der Homoikonizität als besonders mächtiges Werkzeug zur Metaprogrammierung. Makros arbeiten hier direkt an der Programmstruktur beziehungsweise am Parsebaum. Dadurch kann Lisp beispielsweise um neue Kontrollstrukturen erweitert werden.

Das im Artikel gezeigte Common-Lisp-Makro definiert eine WHILE-Schleife, die in Common Lisp in der üblichen Form nicht enthalten ist. Die Definition führt die Schleife auf eine endständige Rekursion zurück. Anschließend lässt sich das neue Sprachkonstrukt unmittelbar verwenden: Eine Variable beginnt bei 0, wird ausgegeben und jeweils um 1 erhöht, solange sie kleiner als 10 ist. Das Programm gibt dadurch die Zahlen von 0 bis 9 aus.

Auch XSL ist eine der wenigen homoikonischen Programmiersprachen. XSL beschreibt Transformationen von XML-Daten und ist zugleich selbst valides XML; daraus ergibt sich seine Homoikonizität.

Weitere Formen und Beispiele

Selbstmodifizierender Code ist eine Form, bei der ein Programm während der Laufzeit seine eigene ausführbare Repräsentation in Maschinensprache verändert. Solche Programme wurden bereits auf frühen Computersystemen gelegentlich verwendet.

In nicht-homoikonischen Sprachen findet Metaprogrammierung häufig auf Quelltextebene statt:

  • Textmakros in C erzeugen mithilfe von #define durch Makroexpansion den Quelltext, der dem Compiler vorgelegt wird. Das Verfahren war ursprünglich zur Herstellung von inline-Prozeduren gedacht. Es ist astabil und sehr fehleranfällig.
  • C++-Metaprogrammierung bezeichnet Metaprogrammierung innerhalb der Programmiersprache C++.
  • Auch die Erzeugung von JavaScript-Code für einen Browser durch ein serverseitiges PHP-Skript und andere Formen der Codegenerierung zählen dazu. Dafür kann fast jede Programmiersprache eingesetzt werden. Weil der Code als Quelltext erzeugt wird, ist auch dieses Verfahren sehr fehleranfällig.

Begriff in der Psychologie

Der Ausdruck wird auch außerhalb der Informatik verwendet. Nach dem Neurophysiologen John Cunningham Lilly bezeichnet Metaprogrammierung die durch Metakommunikation erfolgende Programmierung des menschlichen Biocomputers.

Weiterlesen