Ich habe einen Artikel über TheServerSide gelesen Ployglot-Programmierung auf der Java-Plattform gelesen . Einige Kommentare im Artikel beziehen sich auf Metaprogrammierung als die Fähigkeit, Code zu generieren (möglicherweise im laufenden Betrieb).
Ist Metaprogrammierung die Fähigkeit, Code im laufenden Betrieb zu generieren, oder ist es die Fähigkeit, Methoden und Attribute zur Laufzeit in vorhandene Objekte einzufügen (wie es einige dynamische Sprachen wie Python, Ruby und Groovy zulassen).
metaprogramming
Parag
quelle
quelle
Antworten:
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" :
quelle
in order to put technical barriers between us and our competitors
und das ist Tamade richtig.Gute Frage. Es tut mir sehr leid zu sehen, dass keine der Antworten Ihre Frage derzeit wirklich richtig beantwortet. Vielleicht kann ich helfen ...
Die Definition der Metaprogrammierung ist wirklich recht einfach: Es handelt sich um Programme, die Programme manipulieren.
Ihre akzeptierte Antwort lautet Programme, die sich selbst manipulieren. Das sind zwar Metaprogramme, aber sie sind eine Teilmenge aller Metaprogramme.
Alles:
sind Metaprogramme. Der GCC-Compiler ist also ein Metaprogramm, der CPython-Interpreter ist ein Metaprogramm, das Mathematica-Computeralgebrasystem ist ein Metaprogramm, der Coq-Theorembeweiser ist ein Metaprogramm und so weiter.
Andere Antworten haben behauptet, dass Metaprogramme Programme sind, die andere Programme erzeugen. Dies sind zwar Metaprogramme, aber sie sind wiederum eine Teilmenge aller Metaprogramme. Die FFTW-Bibliothek ( Fastest Fourier Transform in the West ) ist ein Beispiel für ein solches Metaprogramm. Der Quellcode wird hauptsächlich in OCaml geschrieben und generiert C-Code-Bits (Codelets genannt), die kombiniert werden, um leistungsstarke Fast Fourier Transform- Routinen zu erstellen, die für bestimmte Maschinen optimiert sind. Diese Bibliothek wird tatsächlich verwendet, um die FFT-Routinen in Matlab bereitzustellen. Seit den Anfängen von FORTRAN schreiben Menschen seit Jahrzehnten Programme, um numerische Methoden zu generieren .
Die erste Programmiersprache, die die Unterstützung für Metaprogrammierung integrierte, war Ende der 1950er Jahre die Sprache LISt Processor (LISP). LISP 1.5 enthielt eine Reihe von Funktionen, die die Metaprogrammierung vereinfachten. Erstens besteht der Kerndatentyp von LISP aus verschachtelten Listen, dh Bäumen wie
(a (b c) d)
, was bedeutet, dass jeder LISP-Code nativ als Datenstruktur ausgedrückt werden kann. Dies ist als Homoikonizität bekannt. Zweitens kann LISP-Code mit QUOTE einfach in Daten konvertiert werden. Fügt beispielsweise(+ 1 2 3)
1 + 2 + 3 hinzu und(QUOTE (+ 1 2 3))
erstellt einen Ausdruck, der bei der Auswertung 1 + 2 + 3 hinzufügt. Drittens stellte LISP einen Meta-Circular-Evaluator zur Verfügung, mit dem Sie den Host-Interpreter oder -Compiler verwenden können, um LISP-Code zur Laufzeit zu bewerten, einschließlich zur Laufzeit generiertem LISP-Code. Zu den Nachkommen von LISP gehören Scheme und Clojure. In all diesen Sprachen wird Metaprogrammierung am häufigsten in Form von Programmen gesehen, die sich selbst ändern, typischerweise unter Verwendung von Makros.In den 1970er Jahren entwickelte Robin Milner eine MetaLanguage (ML), die sich zur ML-Familie von Programmiersprachen entwickelte, die Standard ML und OCaml umfasst und Haskell und F # stark beeinflusst . Diese Sprachen machen es einfach, andere Sprachen auszudrücken. In diesen Sprachen werden Metaprogramme am häufigsten in Form von Lexern, Parsern, Interpreten und Compilern gesehen.
1994 entdeckte Erwin Unruh, dass das C ++ - Vorlagensystem Turing vollständig war und zur Ausführung beliebiger Programme zur Kompilierungszeit verwendet werden konnte . Die Metaprogrammierung von C ++ - Vorlagen brachte die Metaprogrammierung zu den ungewaschenen Massen, die sie (ab) für viele verschiedene Zwecke verwendeten, einschließlich der Generierung numerischer Methoden in der Blitz ++ - Bibliothek .
quelle
Nun, Metaprogrammierung ist nur Programmieren, aber es ist im Grunde "Code schreiben, der Code schreibt" .
Die Fähigkeit, die Sie erwähnen, wenn ein Programm seine eigene Struktur und sein eigenes Verhalten beobachten und ändern kann, wird als Reflexion bezeichnet und ist eine Art Metaprogrammierung.
Dynamisch typisierte Sprachen verfügen über leistungsstarke Funktionen zur Laufzeitreflexion, die durch die Interpretation dieser Sprachen ermöglicht werden ...
Statisch typisierte Sprachen verfügen auch über leistungsstarke Metaprogrammiertechniken, beispielsweise die C ++ - Vorlagen-Metaprogrammierung ...
quelle
Dies ist nur meine persönliche Meinung, die wahrscheinlich die liberalste Definition von Metaprogrammierung ist.
Ich denke, es beinhaltet:
Ich denke, Sie können dorthin gelangen, indem Sie eines davon und in Kombination verwenden:
quelle
Metaprogrammierung schreibt ein Programm, das ein anderes Programm ausgibt. Das ist etwas, was Sprachen wie Lisp wirklich gut können. In einer Sprache, die echte Makros unterstützt (nicht C ++ - Makros, sondern solche, die den von ihnen ausgegebenen Code manipulieren können), wie Ruby, Lisp, Scheme usw., ist dies viel einfacher als in einer Sprache wie Java.
Eine Implementierung besteht darin, eine "domänenspezifische Sprache" zu erstellen, mit der eine Programmiersprache erweitert werden kann, um eine bestimmte Aufgabe zu erfüllen. Es kann unglaublich mächtig sein, wenn es richtig gemacht wird. Ruby on Rails ist ein gutes Beispiel für diese Art der Programmierung.
Wenn Sie sich für diese Methode interessieren, lesen Sie die Struktur und Interpretation von Computerprogrammen , eines der wichtigsten Bücher zu diesem Thema.
quelle
Im Grunde ist es das Schreiben von Code, der mehr Code ausgibt, der ausgeführt wird, um ein bestimmtes Ziel zu erreichen. Dies erfolgt normalerweise entweder in derselben Sprache (mit Javascript, um eine Javascript-Zeichenfolge zu erstellen,
eval
oder dann ) oder um eine andere Sprache auszugeben (mit .NET, um eine Windows-Batchdatei zu erstellen).quelle
Wikipedia hat einen schönen Artikel zum Thema. Man muss keine Laufzeitänderungen vornehmen, um etwas als Metaprogrammierung zu qualifizieren. Beispielsweise verwenden viele Benutzer C ++ - Vorlagen, um zur Kompilierungszeit Metaprogrammierungen durchzuführen.
quelle