Metaprogrammierung

10

Ich habe gerade meine Reise als C ++ - Entwickler begonnen und habe kürzlich ein Thema namens Metaprogrammierung untersucht. Bisher habe ich viele Informationen zu diesem Thema durchgesehen und habe nur wenige Fragen.

  1. Verwendung von Reflection in c ++: Ist das möglich? Nach meinem Verständnis ist Reflexion eine Metaprogrammiertechnik, die einen Status eines Programms manipulieren kann und deren Manipulation Introspektion oder Introzession sein kann.

  2. Was ist der Unterschied zwischen reflektierender Architektur und Architektur auf Metaebene? In welche Kategorie fällt die Meta-Programmierarchitektur?

  3. Die Meta-Programmierung erfolgt in zwei Ebenen: Meta-Ebene und Basisebene. Nach meinem Verständnis ist das Objektprogramm oder das untersuchte System die Basisebene, und das Metaprogramm, das über dem untersuchten System ausgeführt wird, ist die Metaebene. Hab ich recht?

Helfen Sie mir auch, indem Sie einige Richtlinien zum Arbeiten an der Metaprogrammierung von Vorlagen in C ++ bereitstellen.
Können Sie mir einige praktikable Beispiele vorschlagen, nach denen ich suchen kann, um diese Programmiertechnik in die Hand zu nehmen?

ChrisF
quelle
2
Diese Frage gehört möglicherweise eher zu Programmierern als zu Stackoverflow. Ersteres ist theoretischer und später praktischer. Einige Teile können aus praktischer Sicht leicht beantwortet werden. C ++ hat keine Reflexion , andere sind jedoch nicht codebezogen (Unterschied zwischen reflektierenden und Metalebenen-Architekturen zum Beispiel)
David Rodríguez - Dribeas
Diese SO-Antwort behandelt, warum C ++ keine Reflexion aufweist: stackoverflow.com/q/359237/120163 und einige schwache C ++ - Techniken, um es schlecht zu simulieren.
Ira Baxter
Wenn Sie sich sehr für Metaprogrammierung interessieren, empfehle ich Ihnen, einen Blick auf die D-Sprache zu werfen, die in diesem Punkt klarer als C ++ ist.
Deadalnix

Antworten:

10

Metaprogrammierung bedeutet einfach, dass Sie die Möglichkeit haben, Code zu schreiben, der anderen Code schreibt (im weiteren Sinne). C ++ tut dies über den Vorlagenmechanismus, der im Grunde eine typsichere Makrosprache ist. Es ist durchaus möglich, nur den Schritt zur Vorlagenerweiterung anzuwenden, und das Ergebnis ist gültiger vorlagenfreier C ++ - Code.

Reflexion ist die Fähigkeit einer Programmiersprache und / oder Laufzeitumgebung, ihre eigenen Sprachelemente zur Laufzeit zu überprüfen (und häufig zu ändern). In der Regel bieten reflektierende Sprachen Datenstrukturen, die Sprachelemente wie Klassen, Methoden, Variablen, Parameter usw. darstellen, sowie Routinen oder Klassen, um sie zu überprüfen, zu ändern und zu erstellen. Die Änderungsfunktion macht Reflektion zu einer Art Metaprogrammierung, da Sie Code schreiben können, der anderen Code generiert.

Andere Beispiele für Metaprogrammierung sind Codegeneratoren, selbstmodifizierende Binärdateien (obwohl diese heute nicht mehr so ​​beliebt sind wie vor zwei Jahrzehnten), C-Makros; Man könnte argumentieren, dass Currying und ähnliche funktionale Programmiertechniken auch eine Art Metaprogrammierung sind.

tdammers
quelle
+1 Ihre Antwort gefällt mir sehr gut und ich möchte Sie fragen, ob Sie den Compiler als Dienst wie in C # oder eine Skript-Engine wie in Java verwenden möchten, um Code auszuführen, der zur Laufzeit erstellt wird. Ist das nicht auch eine Form der Metaprogrammierung?
M.Sameer
Wer also einen Python-Interpreter in C erstellt, programmiert Metaprogrammierung? Was ist mit der Implementierung eines ORM, das eine objektorientierte Sprache SQL zuordnet? Ist jedes Webframework ein Beispiel für Metaprogrammierung?
Kojiro
1
  1. Nein, ist es nicht. C ++ - Programme werden zu Maschinencode kompiliert und alle Informationen zu Klassen usw. gehen verloren (es sei denn, Sie verwenden C ++ / CLI für die .NET-Umgebung, dies ist jedoch kein reines C ++).

2-3. Ich weiß nicht - warte auf eine andere Antwort, die dabei hilft :-)

Die Metaprogrammierung mit C ++ - Vorlagen ist sehr leistungsfähig, aber auch komplex. Die Vorlagenerweiterung erfordert eher einen funktionalen Programmierstil als eine zwingende Programmierung, die C ++ verwendet. Wenn Sie noch keine Erfahrung mit funktionaler Programmierung haben, würde ich Ihnen empfehlen, einen Umweg zu machen und ein grundlegendes Lisp, Haskell oder Schema zu lernen.

Anders Abel
quelle