Gibt es eine Nicht-Template-Metasprache für C ++?

8

Ich lese das C ++ Template-Metaprogrammbuch von den boost :: MPL-Autoren. Ich bin ein großer Fan der Spirit / Phoenix-Bibliotheken.

Aber ich habe mich gefragt. Die Verwendung von Vorlagen für die C ++ - Meta-Programmierung ist mühsam. Es war nicht für diesen Zweck gedacht. Weder Vorlagen noch Makros unterstützen Schleifen. In Templates muss man grundsätzlich Rekursionen durchlaufen.

Wie ich es verstehe, ist der C ++ - Kompilierungsprozeß ungefähr:

  1. erweitert / evaluiert Makro
  2. instanziiert Vorlagen (Codegenerierung)
  3. dann eigentliche andere Kompilierungsschritte (lexikalische Analyse, Parsing, Zwischencodeerzeugung, maschinenunabhängige Optimierung, Generierung von Assembly / Objektdateien / Verknüpfung ...)

Template Meta-Programmierung ist ein Hack in die Schritte 1 & amp; 2, vor etwa 20 Jahren aus Versehen entdeckt.

Wäre es nicht einfacher, eine aktuelle Sprache zu verwenden? Ich meine eine Sprache, die auf den C ++ Syntaxbaum zugreifen und ihn manipulieren könnte, zusammen mit netten Textverarbeitungsmöglichkeiten.

Ich denke an eine Template-Sprache wie twig / django, zusammen mit entsprechenden Hooks in der g ++ AST und nativen Definitionen für type_traits und pod-Typen.

Gibt es das? Ich habe im Internet nichts dergleichen gefunden. Es könnte das gleiche Ergebnis (und mehr) als C ++ Vorlage Meta-Programmierung, aber mit schneller Kompilierung, sauberer und lesbarer Code.

    
user2346536 25.01.2014, 19:28
quelle

1 Antwort

10

Was Sie wollen, ist ein Programmtransformationssystem (PTS) .

Diese Werkzeuge verallgemeinern die Metaprogrammierung, indem die Programmiersprache vollständig verlässt (anders als Vorlagen [und Ihre Beschwerde] sind PTS nicht auf das beschränkt, was Sie in der Programmiersprache sagen können).

Im Allgemeinen werden PTS durch Programmiersprachensyntax und Prettyprinting-Regeln parametrisiert (so dass sie die Sprache von Interesse P in ASTs analysieren und von ASTs zurück zum Quellcode auflösen können), eine Reihe von Transformationen (die das Wesentliche von die Änderungen, die Sie vornehmen wollen, zB "Optimiere Array-Zugriffe" und einige "Metaprogramme" M, die beschreiben, wie die Transformationen angewendet werden, um genau den gewünschten Zweck zu erreichen (zB "optimize diese Array-Zugriffe) aber nicht diese ) ".

Ein guter PTS ermöglicht es Ihnen, die Transformationen in eine in der Syntax von P eingebettete Mustersprache zu schreiben. Eine Transformation besagt also im Wesentlichen: "Wenn Sie ein Muster p abgleichen, ersetzen Sie es durch q" wobei p und q Oberflächensyntaxversionen sind des Codes von Interesse. Für AST-basierte Transformationsregeln kann keine Transformation beliebig große Arbeitsmengen verarbeiten (da Muster-ASTs fester Durchmesser sind), so dass mehr als eine Transformation erforderlich ist, um komplexe Ergebnisse zu erzielen.

Das Metaprogramm sequenziert die Transformationen; es kann auf verschiedene Arten codiert sein. Stratego codiert Metaprogramme in einer "strategie" DSL-Erweiterung zur Basis-Transformationsmustersprache, die Reaktionen auf Transformationen sind, die am Punkt erfolgreich oder fehlschlagen, und Baumnavigationsschritte (oben, unten, Wiederholung). Die Meta-Programme von TXL sind funktional gegenüber Musterübereinstimmungen. DMS verwendet PARLANSE, eine parallele Programmiersprache, mit der Transformationen (sorgfältig) parallel auf wirklich große Mengen von Quellcode angewendet werden können. Clang hat keinen vollständigen Quellmustervergleich, aber einige "AST" -Matcher, um die Syntaxanpassung ein wenig einfacher zu machen; Andernfalls schreiben Sie die Transformationen als prozeduralen Code, der den Baum auf und ab geht, eingebettet in ein Metaprogramm, das in C ++ selbst codiert ist. Die Meta-Programme von Rose Compiler sind weitgehend prozedural wie Clang. Dort die Eclipse CDT Refactoring Tools; Ich kenne ihren Status nicht gut, aber sie haben keine mustergesteuerten Transformationen, und ich denke, die Meta-Programme sind in Java geschrieben. Es gibt andere PTSs; die meisten von ihnen sind nicht so robust oder ausgereift wie diese. GCC existiert, ist aber nicht als PTS organisiert. (Nehmen Sie all dies mit einem Körnchen Salz; ich bin der Typ hinter DMS und deshalb wollen Sie mir vielleicht nicht glauben).

Sie möchten insbesondere C ++ manipulieren. Dies bedeutet, dass das Tool C ++ ordnungsgemäß verarbeiten muss. Stratego und TXL unterstützen momentan C ++ nicht und sind aufgrund des Aufwands zur Erstellung eines vollständigen C ++ - Frontends unwahrscheinlich. Clang hat offensichtlich ein nützliches C ++ - Frontend. So auch Rose aufgrund der Verwendung des EDG-Frontends. DMS hat ein vollständiges C ++ 11-Frontend, das wir auf großen GCC- und Windows-C ++ - Codebasen erstellt und validiert haben. Ich bin mir nicht sicher über die Reife des CDT-Frontends; insbesondere verstehe ich nicht, was sie als Parser verwenden.

(EDIT Sept 2015: DMS behandelt nun sowohl in MS- als auch in GCC-Dialekten volles C ++ 14).

Was Sie durch Metaprogrammierung von "innen" vs. "außerhalb" der Sprache handeln, ist die Lesbarkeit von wahrhaft wahrhaft geheimnisvollem "Template-Metaprogrammieren" für die normalerweise weniger arkane Syntax von Mustern und der Metaprogrammierungssprache. IMHO erhalten Sie Ausdruckskraft, weil die PTSs entworfen sind, um Quellcode zu manipulieren, und sie können in der Regel auf Analysatoren zurückgreifen, die von den zugrunde liegenden Maschinen (Symboltabellen, Typinformationen, Steuerung / Datenflüsse) zur Verfügung gestellt werden, die die Vorlagen einfach nicht erreichen können.

Für mich ist die wahre Stärke, dass PTS Transformationen über beliebige Code-Grenzen hinweg anwenden können; Die meisten C ++ - Vorlagen können nur Code generieren, um den Vorlagenaufruf zu ersetzen. (Insbesondere ist ein Fehler bei allen Metatprogram- mierungs- / Reflektionsschemata, die in einer Sprache implementiert sind, dass sie in ihrer Fähigkeit begrenzt sind; PTSs haben keine solchen Einschränkungen).

In meinem Lebenslauf finden Sie einen Link zu einer Beschreibung von DMS. Noch wichtiger ist, dass es dort eine Reihe von Papieren gibt (zB "Fallstudie: Reengineering von C ++ - Komponentenmodellen über automatische Programmtransformation"), die eine massive Transformation auf C ++ - Programme beschreiben (um sie von einem RTOS mit komplexen APIs auf ein völlig anderes zu verschieben) System, sowie die APIs radikal umgestalten), die Ihnen einen Geschmack dafür geben können, wie das aussieht. (Nach meinem Wissen, von den verschiedenen PTS-Werkzeugen, wurde nur DMS auf diese ehrgeizige C ++ - Transformation angewendet.) Diese Artikel zeigen, dass PTS-Operationen überhaupt nicht der Template-Metaprogrammierung ähneln, verlassen sich nicht auf Tricks wie SFINAE und kann Dinge tun keine Vorlage Metaprogramm IMHO könnte jemals erreichen.

    
Ira Baxter 26.01.2014, 00:25
quelle

Tags und Links