Quell-zu-Quell-Compiler-Framework gesucht

8

Früher habe ich OpenC ++ ( Ссылка ) benutzt, um Code-Generierung wie folgt durchzuführen:

Quelle:

%Vor%

Generiert:

%Vor%

Diese Art der Codegenerierung stimmt direkt mit dem Anwendungsfall im Lernprogramm von OpenC ++ () überein Ссылка ), indem Sie ein Meta-Level-Programm schreiben, um "MyKeyword", "inarg" und "outarg" zu bearbeiten und die Code-Generierung durchzuführen. Allerdings ist OpenC ++ jetzt veraltet und inaktiv, und mein Code-Generator kann nur auf g ++ 3.2 funktionieren und löst einen Fehler beim Parsen von Header-Dateien von g ++ höherer Version aus.

Ich habe mir VivaCore angeschaut, aber es enthält nicht die Infrastruktur für das Übersetzen von Meta-Level-Programmen. Ich schaue mir auch LLVM an, aber ich kann keine Dokumentation finden, die mich bei der Ausarbeitung meiner Source-to-Source-Kompilierung unterstützt. Ich kenne auch das ROSE-Compiler-Framework, aber ich bin mir nicht sicher, ob es meiner Verwendung entspricht und ob seine proprietäre C ++ - Frontend-Binärdatei in einem kommerziellen Produkt verwendet werden kann und ob eine Windows-Version verfügbar ist.

Alle Kommentare und Hinweise zu bestimmten Tutorial / Papier / Dokumentation werden sehr geschätzt.

    
cheungcc_2000 24.05.2010, 03:33
quelle

3 Antworten

3

Ich kenne keine fertige Lösung, aber Sie könnten Ihre eigene mit relativ wenig Aufwand bauen. Eine mögliche Option ist Elsa C ++ Parser, ein wenig veraltet, aber einfach zu bedienen und ziemlich erweiterbar. Eine weitere Möglichkeit ist die Manipulation von XML-ASTs, die von Clang ++ erstellt wurden. Ich habe beide Ansätze in verschiedenen Szenarien verwendet.

    
SK-logic 24.05.2010, 15:35
quelle
1

Sie könnten unser DMS Software Reengineering Toolkit in Erwägung ziehen. DMS ist eine allgemeine Grundlage für das Parsen von Quelltext in beliebigen Sprachen zu Compiler-Datenstrukturen (ASTs, Symboltabellen, Kontrollflussdiagramme, Datenflussdiagramme, abhängig davon, wie weit Sie es nehmen).

DMS ist ein Quell-zu-Quellprogramm-Transformationssystem . Sie können Source-to-Source pattern-directed Transformationen anwenden oder prozedurale Transformationen schreiben (ähnlich wie OpenC ++), und dann den kompilierbaren Quelltext entsprechend dem transformierten Programm neu generieren.

DMS ist durch explizite Sprachdefinitionen parametrisiert und behandelt C, C #, COBOL, Java, Python, Javascript, Fortran.

Es hat ein vollständiges C ++ Front End , das viele echte Dialekte von C ++ (ANSI, GNU, MS), mit vollständiger Namens- und Typauflösung. DMS mit dem C ++ - Frontend kann Transformationen durchführen, die von "Metaprogrammen" innerhalb und über mehrere Übersetzungseinheiten gesteuert werden. Es wurde in Wut verwendet, um radikale Reorganisationen von C ++ - Softwaresystemen durchzuführen, einschließlich der massiven Neuarchitektur von Mission Avionics Software (siehe Papiere auf der Website), die schließlich in UAVs verwendet wurde.

DMS läuft unter Windows.

EDIT 2/3/2011: DMS scheint unter Wine auch unter Linux und Solaris gut zu laufen. Tests für DMS auf Wine unter OSX laufen.

EDIT 3/1/2011: DMS scheint auch unter Wine für OSX zu laufen.

EDIT 21.2.2013: Das C ++ Frontend verarbeitet jetzt ANSI C ++ 11 sowie MS und GNU Versionen von C ++ 11.

EDIT 24. 2. 2015: Behandelt jetzt C ++ 14 in ANSI, MS und GNU-Varianten.

    
Ira Baxter 26.05.2010 02:25
quelle
0

Ist Ihnen die Praxis der Template-Metaprogrammierung bekannt? Wenn Sie es vorher nicht benutzt haben, ist es die Anwendung des C ++ - Präprozessors, um merkwürdige Meta-Programme zu erstellen, die sich eher wie LISP als C ++ anfühlen. Die Idee ist die gleiche wie oben - mit einem Vorkompilierungsschritt, der basierend auf bestimmten Eingaben wiederholten Code generiert. Es wird jedoch alles zur Kompilierzeit ausgeführt (während es aussieht, als ob OpenC ++ zur Laufzeit mehrere Dinge tut).

Wenn man bedenkt, dass es so aussieht, als ob Sie bereit wären, ein neues zu lernen, wären Sie bereit, das als Ersatz "Sprache" zu benutzen?

Boost bietet eine Bibliothek, die diese Technik verwendet, um eine einfache Serialisierung zu ermöglichen, wie Sie es oben gezeigt haben. Aus dem Lernprogramm im Handbuch :

%Vor%     
Conspicuous Compiler 24.05.2010 07:07
quelle