Metaprogrammierung bezieht sich auf eine Vielzahl von Möglichkeiten, wie ein Programm sich selbst kennt oder sich selbst manipulieren kann.
In Sprachen wie C # ist Reflexion eine Form der Metaprogrammierung, da das Programm Informationen über sich selbst untersuchen kann. Zum Beispiel eine Liste aller Eigenschaften eines Objekts zurückgeben.
In Sprachen wie ActionScript können Sie Funktionen zur Laufzeit auswerten, um neue Programme wie eval ("x" + i) zu erstellen. DoSomething () würde ein Objekt namens x1 beeinflussen, wenn i 1 ist, und x2, wenn i 2 ist.
Schließlich ist eine andere übliche Form der Metaprogrammierung, wenn sich das Programm auf nicht triviale Weise ändern kann. LISP ist dafür bekannt und hat sich vor etwa einem Jahrzehnt für Paul Graham eingesetzt. Ich muss einige seiner spezifischen Aufsätze nachschlagen. Die Idee ist jedoch, dass das Programm einen anderen Teil des Programms basierend auf seinem Status ändern würde. Dies ermöglicht ein Maß an Flexibilität, um Entscheidungen zur Laufzeit zu treffen, das in den meisten gängigen Sprachen heutzutage sehr schwierig ist.
Es ist auch erwähnenswert, dass in den guten alten Tagen der Programmierung in gerader Montage Programme, die sich zur Laufzeit selbst änderten, notwendig und sehr alltäglich waren.
Aus Paul Grahams Essay "Was Lisp anders gemacht hat" :
Viele Sprachen haben so etwas wie ein Makro. Aber Lisp-Makros sind einzigartig. Und ob Sie es glauben oder nicht, was sie tun, hängt mit den Klammern zusammen. Die Designer von Lisp haben nicht alle diese Klammern in die Sprache gesetzt, nur um anders zu sein. Für den Blub-Programmierer sieht Lisp-Code seltsam aus. Aber diese Klammern gibt es aus einem Grund. Sie sind der äußere Beweis für einen grundlegenden Unterschied zwischen Lisp und anderen Sprachen.
Lisp-Code besteht aus Lisp-Datenobjekten. Und nicht in dem trivialen Sinne, dass die Quelldateien Zeichen enthalten und Zeichenfolgen einer der von der Sprache unterstützten Datentypen sind. Lisp-Code besteht nach dem Lesen durch den Parser aus Datenstrukturen, die Sie durchlaufen können.
Wenn Sie verstehen, wie Compiler funktionieren, ist das, was wirklich vor sich geht, nicht so sehr, dass Lisp eine seltsame Syntax hat, als dass Lisp keine Syntax hat. Sie schreiben Programme in die Analysebäume, die im Compiler generiert werden, wenn andere Sprachen analysiert werden. Diese Analysebäume sind jedoch für Ihre Programme vollständig zugänglich. Sie können Programme schreiben, die sie manipulieren. In Lisp werden diese Programme als Makros bezeichnet. Sie sind Programme, die Programme schreiben.
Programme, die Programme schreiben? Wann würden Sie das jemals tun wollen? Nicht sehr oft, wenn man an Cobol denkt. Die ganze Zeit, wenn Sie in Lisp denken. Hier wäre es praktisch, wenn ich ein Beispiel für ein leistungsfähiges Makro geben und dort sagen könnte! wie wär es damit? Aber wenn ich es tun würde, würde es für jemanden, der Lisp nicht kannte, nur wie Kauderwelsch aussehen. Hier ist kein Platz, um alles zu erklären, was Sie wissen müssen, um zu verstehen, was es bedeutet. In Ansi Common Lisp ich versucht, die Dinge so schnell wie möglich voranzutreiben, und trotzdem bin ich erst auf Seite 160 zu Makros gekommen.
Aber ich denke, ich kann eine Art Argument vorbringen, das überzeugend sein könnte. Der Quellcode des Viaweb-Editors bestand wahrscheinlich aus etwa 20-25% Makros. Makros sind schwieriger zu schreiben als normale Lisp-Funktionen, und es wird als schlechter Stil angesehen, sie zu verwenden, wenn sie nicht erforderlich sind. Jedes Makro in diesem Code ist also da, weil es sein muss. Das bedeutet, dass mindestens 20-25% des Codes in diesem Programm Dinge tun, die Sie in keiner anderen Sprache einfach tun können. So skeptisch der Blub-Programmierer auch gegenüber meinen Behauptungen über die mysteriösen Kräfte von Lisp sein mag, dies sollte ihn neugierig machen. Wir haben diesen Code nicht zu unserer eigenen Unterhaltung geschrieben. Wir waren ein winziges Startup, das so hart wie möglich programmierte, um technische Barrieren zwischen uns und unseren Konkurrenten zu schaffen.
Eine verdächtige Person könnte sich fragen, ob hier ein Zusammenhang besteht. Ein großer Teil unseres Codes hat Dinge getan, die in anderen Sprachen sehr schwer zu tun sind. Die resultierende Software hat Dinge getan, die die Software unserer Konkurrenten nicht konnte. Vielleicht gab es irgendeine Verbindung. Ich ermutige Sie, diesem Thread zu folgen. Dieser alte Mann kann mehr auf seinen Krücken humpeln, als man denkt.