Zum Inhalt springen

„Metaprogrammierung“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
KKeine Bearbeitungszusammenfassung
K Komma
 
(21 dazwischenliegende Versionen von 11 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Metaprogrammierung''' ist in der Informatik die Erstellung von Computerprogrammen ("Metaprogramme"), die Computerprogramme erzeugen. Falls die Programmiersprache [[Homoikonizität|homoikonisch]] ist, wie [[Lisp]] und seine Dialekte, kann die Programm-Erzeugung durch das Metaprogramm direkt auf der Ebene der Programmstruktur erfolgen. Falls Homoikonizität nicht gegeben ist, kann die Programmerzeugung aber behelfsweise lexikalisch erfolgen, wobei das Metaprogramm den Quelltext eines Zielprogramms erzeugt. Das kann grundsätzlich in jeder Programmiersprache durchgeführt werden kann.
'''Metaprogrammierung''' ist in der Informatik die Erstellung von Computerprogrammen ("Metaprogramme"), die Computerprogramme erzeugen.

Das Ziel dabei ist es, den Computer ganz oder teilweise an dem Prozess der Programmierung mitarbeiten zu lassen. Dadurch ist es möglich, Fehler durch Automatisierung zu vermindern und Computerprogramme ad hoc zu erstellen und auszuführen. Metaprogrammierung gestattet es ebenfalls, die Programmiersprache durch den Programmierer um neue Konstruktionen zu erweitern. Daher ist sie in [[Homoikonizität|homoikonischen]] Programmiersprachen ein sehr effektives Mittel zur Entwicklung von [[Domänenspezifische Sprache|Domänenspezifischen Sprachen]].

== Grundkonzepte ==
Falls die Programmiersprache [[Homoikonizität|homoikonisch]] ist, wie [[Lisp]] und seine Dialekte, kann die Programm-Erzeugung durch das Metaprogramm direkt auf der Ebene der Programmstruktur erfolgen. Falls Homoikonizität nicht gegeben ist, kann die Programmerzeugung aber behelfsweise lexikalisch erfolgen, wobei das Metaprogramm den Quelltext des Zielprogramms erzeugt. In dieser (fehleranfälligeren) Form kann Metaprogrammierung grundsätzlich in jeder Programmiersprache durchgeführt werden.

Ein abgeschwächtes Mittel zur Metaprogrammierung ist die [[Reflexion (Programmierung)|Introspektion]], bei der die Struktur des Zielprogramms allerdings bereits zum Zeitpunkt der Erstellung des Metaprogramms festliegen muss.
Ein abgeschwächtes Mittel zur Metaprogrammierung ist die [[Reflexion (Programmierung)|Introspektion]], bei der die Struktur des Zielprogramms allerdings bereits zum Zeitpunkt der Erstellung des Metaprogramms festliegen muss.


Zeile 6: Zeile 11:


== Klassifikation ==
== Klassifikation ==
Metaprogrammierung lassen sich nach verschiedenen Gesichtspunkten einteilen:<ref>[http://www.infosun.fim.uni-passau.de/cl/lehre/sips1-ss06/Uebung/Metaprogrammierung.pdf Metaprogrammierung] – Skript Kapitel (Uni Passau; PDF, 195&nbsp;kB)</ref>
Metaprogrammierung lässt sich nach verschiedenen Gesichtspunkten einteilen:<ref>[https://www.infosun.fim.uni-passau.de/cl/lehre/sips1-ss06/Uebung/Metaprogrammierung.pdf Metaprogrammierung] – Skript Kapitel (Uni Passau; PDF, 195&nbsp;kB)</ref>


Nach Bearbeitungszeitpunkt:
Nach Bearbeitungszeitpunkt:
Zeile 12: Zeile 17:
* dynamisch (zur Laufzeit)
* dynamisch (zur Laufzeit)


Nach Sprachen:
Nach Sprachen:
* homogen (Metasprache ist Objektsprache)
* homogen (Metasprache ist Objektsprache)
* heterogen (sonst)
* heterogen (sonst)
Zeile 21: Zeile 26:


== Beispiele ==
== Beispiele ==
=== Metaprogrammierung in homoikonischen Programmiersprachen ===
Das Makrosystem von [[Lisp]] ist die derzeit mächtigste Umsetzung davon, da hier durch die besondere Struktur der Sprache die Makros auf der Ebene des [[Parsebaum|Parsebaums]] gebildet werden können. Aber auch simplere Szenarien gehören genau genommen zur Metaprogrammierung, wie zum Beispiel die Erzeugung von [[JavaScript]]-Code für den Browser durch ein serverseitiges [[PHP]]-Skript.
Das Makrosystem von [[Lisp]] und seinen Dialekten ist aufgrund der Homoikonizität der Sprache das mächtigste derzeit verfügbare Werkzeug zur Metaprogrammierung, da diese hier auf der Ebene der Programmstruktur, technisch also auf dem [[Parsebaum]], erfolgt. Dadurch ist es ohne Weiteres möglich, Lisp um neue Kontrollstrukturen zu erweitern, wie die folgende Definition in [[Common Lisp]] zeigt, die die [[Schleife %28Programmierung%29#While-Do-Schleife|WHILE-Schleife]] definiert.<ref>Patrick M. Krusenotto ''Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp'' Springer-Verlag 2016, ISBN 978-3-658-13743-4. Seite 275</ref> Eine solche ist in Common Lisp in der üblichen Form nicht enthalten.


<syntaxhighlight lang="lisp">
[[C++-Metaprogrammierung]] bezeichnet die Technik der Metaprogrammierung innerhalb der Programmiersprache C++, also eine Technik, um in C++ Programmcode von anderem Programmcode generieren zu lassen.
(defmacro while (cond &body body)
(let ((name (gensym)))
`(labels ((,name ()
(if ,cond
(progn
,@body
(,name)))))
(,name))))
</syntaxhighlight>
Diese Definition führt die WHILE-Schleife auf eine [[Endrekursion|endständige Rekursion]] zurück. Im Anschluss kann das neue Sprachkonstrukt direkt verwendet werden:
<syntaxhighlight lang="lisp">
(let ((a 0))
(while (< a 10)
(print a)
(setq a (1+ a))))
</syntaxhighlight>
Die Ausführung dieses Programms führt dann zu Ausgabe der Zahlen von 0 bis 9.


[[XSL]] ist eine der wenigen ebenfalls homoikonischen Programmiersprachen. Sie beschreibt die Transformation von [[XML]]-Daten. Dabei ist XSL gleichzeitig valides XML, wodurch die Homoikonizität gegeben ist.
Weitere Programmiersprachen, die Metaprogrammierung unterstützen sind: [[Python (Programmiersprache)|Python]], [[Ruby (Programmiersprache)|Ruby]], [[Scheme]], [[Smalltalk (Programmiersprache)|Smalltalk]], [[Self (Programmiersprache)|Self]], [[Build Your Own Blocks (Programmiersprache)|Snap! / BYOB]].


=== Selbstmodifizierender Code ===
== Metaprogrammierung des menschlichen Biocomputers ==
{{Hauptartikel|Selbstmodifizierender Code}}
Schon in frühen Computersystemen wurden bisweilen Programme angewandt, die zur Laufzeit ihre eigene ausführbare ([[Maschinensprache]]-)Repräsentation bearbeiten.

=== Behelfsweise Metaprogrammierung in nicht-homoikonischen Programmiersprachen ===

* Textmakros in [[C (Programmiersprache)|C]] gestatten es, mittels <code>#define</code>, dem C-Compiler einen Quelltext vorzulegen, der durch Makroexpansion entsteht. Das Verfahren war ursprünglich zur Herstellung von inline-Prozeduren gedacht. Es ist astabil und sehr fehleranfällig.
* [[C++-Metaprogrammierung]] bezeichnet die Technik der Metaprogrammierung innerhalb der Programmiersprache C++.
* Noch einfachere Szenarien gehören genau genommen ebenfalls zur Metaprogrammierung, wie zum Beispiel die Erzeugung von [[JavaScript]]-Code für den Browser durch ein serverseitiges [[PHP]]-Skript oder andere Einsatzformen von [[Codegenerierung]]. Dabei kann fast jede Programmiersprache zum Einsatz kommen. Da die Programmerzeugung auch hier auf der Ebene des Quelltextes erfolgt, ist es ebenfalls sehr fehleranfällig.

== Metaprogrammierung in der Psychologie ==
Gemäß dem Neurophysiologen [[John Cunningham Lilly]] beschreibt Metaprogrammierung die durch [[Metakommunikation]] erfolgende Programmierung des menschlichen [[Neuronaler Erregungskreis|Biocomputers]].
Gemäß dem Neurophysiologen [[John Cunningham Lilly]] beschreibt Metaprogrammierung die durch [[Metakommunikation]] erfolgende Programmierung des menschlichen [[Neuronaler Erregungskreis|Biocomputers]].


== Literatur ==
== Literatur ==
=== Informatik ===
* Patrick M. Krusenotto ''Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp'' Springer-Verlag 2016, ISBN 978-3-658-13743-4
* Patrick M. Krusenotto ''Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp'' Springer-Verlag 2016, ISBN 978-3-658-13743-4
* John C. Lilly: ''Programmierung und Metaprogrammierung des menschlichen Biocomputers''. Phänomen-Verlag; Auflage: 1., Aufl. (18. April 2010). ISBN 978-3933321688
* Thomas Maier-Komor: ''Methoden der Metaprogrammierung zur Rekonfiguration von Software eingebetteter Systeme''. Dr. Hut; Auflage: 1. Aufl. (31. Januar 2007). ISBN 978-3899634709
* Thomas Maier-Komor: ''Methoden der Metaprogrammierung zur Rekonfiguration von Software eingebetteter Systeme''. Dr. Hut; Auflage: 1. Aufl. (31. Januar 2007). ISBN 978-3899634709
* Oliver Vogel, Ingo Arnold, Arif Chughtai, Timo Kehrer: ''Software Architecture: A Comprehensive Framework and Guide for Practitioners''. Springer; Auflage: 2011 (17. September 2011). ISBN 978-3642197352
* Oliver Vogel, Ingo Arnold, Arif Chughtai, Timo Kehrer: ''Software Architecture: A Comprehensive Framework and Guide for Practitioners''. Springer; Auflage: 2011 (17. September 2011). ISBN 978-3642197352
=== Psychologie ===
* John C. Lilly: ''Programmierung und Metaprogrammierung des menschlichen Biocomputers''. Phänomen-Verlag; Auflage: 1., Aufl. (18. April 2010). ISBN 978-3933321688


== Weblinks ==
== Weblinks ==
* [http://www.infosun.fim.uni-passau.de/cl/lehre/sips1-ss06/Uebung/Metaprogrammierung.pdf Metaprogrammierung] – Skript Kapitel (Uni Passau; PDF, 195&nbsp;kB)
* [https://www.infosun.fim.uni-passau.de/cl/lehre/sips1-ss06/Uebung/Metaprogrammierung.pdf Metaprogrammierung] – Skript Kapitel (Uni Passau; PDF, 195&nbsp;kB)


== Einzelnachweise ==
== Einzelnachweise ==

Aktuelle Version vom 16. Mai 2023, 09:40 Uhr

Metaprogrammierung ist in der Informatik die Erstellung von Computerprogrammen ("Metaprogramme"), die Computerprogramme erzeugen.

Das Ziel dabei ist es, den Computer ganz oder teilweise an dem Prozess der Programmierung mitarbeiten zu lassen. Dadurch ist es möglich, Fehler durch Automatisierung zu vermindern und Computerprogramme ad hoc zu erstellen und auszuführen. Metaprogrammierung gestattet es ebenfalls, die Programmiersprache durch den Programmierer um neue Konstruktionen zu erweitern. Daher ist sie in homoikonischen Programmiersprachen ein sehr effektives Mittel zur Entwicklung von Domänenspezifischen Sprachen.

Falls die Programmiersprache homoikonisch ist, wie Lisp und seine Dialekte, kann die Programm-Erzeugung durch das Metaprogramm direkt auf der Ebene der Programmstruktur erfolgen. Falls Homoikonizität nicht gegeben ist, kann die Programmerzeugung aber behelfsweise lexikalisch erfolgen, wobei das Metaprogramm den Quelltext des Zielprogramms erzeugt. In dieser (fehleranfälligeren) Form kann Metaprogrammierung grundsätzlich in jeder Programmiersprache durchgeführt werden.

Ein abgeschwächtes Mittel zur Metaprogrammierung ist die Introspektion, bei der die Struktur des Zielprogramms allerdings bereits zum Zeitpunkt der Erstellung des Metaprogramms festliegen muss.

Metaprogrammierung ist eine der konzeptionellen Grundlagen des Programmiersprachen-Compilers. Sie bedient aber auch den Wunsch, adaptive Softwaresysteme zu entwickeln, die sich leicht an sich ändernde Rahmenbedingungen entweder zur Laufzeit oder innerhalb der Entwicklungsphase anpassen können.[1]

Metaprogrammierung lässt sich nach verschiedenen Gesichtspunkten einteilen:[2]

Nach Bearbeitungszeitpunkt:

  • statisch (zur Compiler-Zeit)
  • dynamisch (zur Laufzeit)

Nach Sprachen:

  • homogen (Metasprache ist Objektsprache)
  • heterogen (sonst)

Nach Stufen:

  • mehrstufig (Objektsprache ist selbst Metasprache)
  • einstufig (sonst)

Metaprogrammierung in homoikonischen Programmiersprachen

[Bearbeiten | Quelltext bearbeiten]

Das Makrosystem von Lisp und seinen Dialekten ist aufgrund der Homoikonizität der Sprache das mächtigste derzeit verfügbare Werkzeug zur Metaprogrammierung, da diese hier auf der Ebene der Programmstruktur, technisch also auf dem Parsebaum, erfolgt. Dadurch ist es ohne Weiteres möglich, Lisp um neue Kontrollstrukturen zu erweitern, wie die folgende Definition in Common Lisp zeigt, die die WHILE-Schleife definiert.[3] Eine solche ist in Common Lisp in der üblichen Form nicht enthalten.

(defmacro while (cond &body body)
  (let ((name (gensym)))
    `(labels ((,name ()
                (if ,cond
                    (progn
                      ,@body
                      (,name)))))
       (,name))))

Diese Definition führt die WHILE-Schleife auf eine endständige Rekursion zurück. Im Anschluss kann das neue Sprachkonstrukt direkt verwendet werden:

(let ((a 0))
  (while (< a 10)
    (print a)
    (setq a (1+ a))))

Die Ausführung dieses Programms führt dann zu Ausgabe der Zahlen von 0 bis 9.

XSL ist eine der wenigen ebenfalls homoikonischen Programmiersprachen. Sie beschreibt die Transformation von XML-Daten. Dabei ist XSL gleichzeitig valides XML, wodurch die Homoikonizität gegeben ist.

Selbstmodifizierender Code

[Bearbeiten | Quelltext bearbeiten]

Schon in frühen Computersystemen wurden bisweilen Programme angewandt, die zur Laufzeit ihre eigene ausführbare (Maschinensprache-)Repräsentation bearbeiten.

Behelfsweise Metaprogrammierung in nicht-homoikonischen Programmiersprachen

[Bearbeiten | Quelltext bearbeiten]
  • Textmakros in C gestatten es, mittels #define, dem C-Compiler einen Quelltext vorzulegen, der durch Makroexpansion entsteht. Das Verfahren war ursprünglich zur Herstellung von inline-Prozeduren gedacht. Es ist astabil und sehr fehleranfällig.
  • C++-Metaprogrammierung bezeichnet die Technik der Metaprogrammierung innerhalb der Programmiersprache C++.
  • Noch einfachere Szenarien gehören genau genommen ebenfalls zur Metaprogrammierung, wie zum Beispiel die Erzeugung von JavaScript-Code für den Browser durch ein serverseitiges PHP-Skript oder andere Einsatzformen von Codegenerierung. Dabei kann fast jede Programmiersprache zum Einsatz kommen. Da die Programmerzeugung auch hier auf der Ebene des Quelltextes erfolgt, ist es ebenfalls sehr fehleranfällig.

Metaprogrammierung in der Psychologie

[Bearbeiten | Quelltext bearbeiten]

Gemäß dem Neurophysiologen John Cunningham Lilly beschreibt Metaprogrammierung die durch Metakommunikation erfolgende Programmierung des menschlichen Biocomputers.

  • Patrick M. Krusenotto Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp Springer-Verlag 2016, ISBN 978-3-658-13743-4
  • Thomas Maier-Komor: Methoden der Metaprogrammierung zur Rekonfiguration von Software eingebetteter Systeme. Dr. Hut; Auflage: 1. Aufl. (31. Januar 2007). ISBN 978-3899634709
  • Oliver Vogel, Ingo Arnold, Arif Chughtai, Timo Kehrer: Software Architecture: A Comprehensive Framework and Guide for Practitioners. Springer; Auflage: 2011 (17. September 2011). ISBN 978-3642197352
  • John C. Lilly: Programmierung und Metaprogrammierung des menschlichen Biocomputers. Phänomen-Verlag; Auflage: 1., Aufl. (18. April 2010). ISBN 978-3933321688

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Doga Arinir: Multidimensionale Separierung der Belange in der Softwareentwicklung durch Feature-Komponenten. W3L GmbH; Auflage: 1 (18. Juli 2007). ISBN 978-3937137537. Seite 50/51
  2. Metaprogrammierung – Skript Kapitel (Uni Passau; PDF, 195 kB)
  3. Patrick M. Krusenotto Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp Springer-Verlag 2016, ISBN 978-3-658-13743-4. Seite 275