Ich interessiere mich für verifizierte Compiler, die in der Martin-Löf-Typentheorie formalisiert sind, dh Coq / Agda. Im Moment habe ich ein kleines Spielzeugbeispiel geschrieben. Damit kann ich beweisen, dass meine Optimierungen korrekt sind. Zum Beispiel können Additionen mit Null eliminiert werden, dh Ausdrücke wie "x + 0".
Gibt es Optimierungen, die mit einem regulären Compiler schwer durchzuführen sind und als gutes Beispiel dienen? Ist es möglich, bestimmte Eigenschaften eines Programms zu beweisen, die Optimierungen ermöglichen, die mit einem regulären Compiler nicht möglich sind? (dh ohne die Folgerung, die mit einem Theorembeweiser möglich ist)
Ich würde mich für Ideen oder Beispiele und auch Referenzen zum Thema interessieren.
Eine verwandte Frage: Compiler-Korrektheitsnachweise
edit: Wie Tsuyoshi es schön in den Kommentaren formulierte: Ich suche nach Optimierungstechniken, die schwierig zu implementieren sind, wenn ein Compiler in (sagen wir) C geschrieben ist, aber einfacher zu implementieren sind, wenn ein Compiler in (sagen wir) Coq geschrieben ist. Während Agda nach C kompiliert (über Haskell), ist es möglich, alles, was in Agda möglich ist, auch in C zu tun. Der einzige Vorteil von Theoremprüfern wie Coq / Agda besteht wahrscheinlich darin, dass der Compiler und die Optimierungen verifiziert werden können.
edit2: Wie von Vijay DI vorgeschlagen, schreibe, was ich bisher gelesen habe. Ich habe mich hauptsächlich auf Xavier Leroy und das CompCert-Projekt bei INRIA konzentriert (es gibt ein 80-seitiges Papier, das meiner Meinung nach gut gelesen werden kann). Ein zweites Interesse galt der Arbeit von Anton Setzer an interaktiven Programmen. Ich dachte, dass seine Arbeit vielleicht verwendet werden könnte, um Eigenschaften von IO-Programmen und die Bisimulation von IO-Programmen zu beweisen. Vielen Dank, dass Sie Sewell erwähnt haben. Ich habe seinen Vortrag "Geschichten aus dem Dschungel" am ICFP gehört und vielleicht 2-3 seiner Papiere gelesen. Aber ich habe seine Arbeit und die seiner Mitautoren nicht speziell betrachtet.
Ich habe noch nicht herausgefunden, wo ich anfangen soll, oder nach Artikeln zur Optimierung von Compilern gesucht. zB, welche Optimierungen in der Einstellung eines verifizierten Compilers interessant wären.
Antworten:
Dieses Papier von Yves Bertot, Benjamin Gr´egoire und Xavier Leroy erstellt einen optimierenden Compiler für eine C-ähnliche Sprache, der ausschließlich auf der Coq-Spezifikation basiert. Ein Teil dieser Technologie wird offenbar im CompCert C-Compiler verwendet .
Ein strukturierter Ansatz zum Nachweis von Compiler-Optimierungen basierend auf Datenflussanalysen
Es wird die Richtigkeit von zwei Optimierungen berücksichtigt, der konstanten Ausbreitung (CP) und der gemeinsamen Eliminierung von Unterausdrücken (CSE), Abschnitt 4. Diese Optimierungen sind weiter fortgeschritten als diejenigen, die den nicht Coq-basierten Compilern für dieselbe Sprache zugeordnet sind. siehe zB dieses Benchmark-Diagramm im Vergleich zu gcc. (Der Coq-basierte Compiler ist vermutlich langsamer zu kompilieren, obwohl dies selten erwähnt wird!)
Am Ende des Dokuments wird jedoch darauf hingewiesen, dass es in realen Compilern einige Compiler-Optimierungen gibt, die in ihrem Framework nicht modelliert werden können.
Eine verbesserte Optimierung ist hier nicht das einzige zu berücksichtigende Element. Ein weiterer Aspekt ist, dass die Compiler-Optimierungslogik aufgrund ihrer Komplexität subtilen Fehlern unterliegen kann. Im Laufe der Jahre wurde festgestellt, dass gcc Fehler in seinen zahlreichen Optimierungslogikroutinen aufweist. zB gcc bug?
quelle
Dies entspricht der Erweiterung des Typecheckers, um dem Optimierer einige Eigenschaften eines Programms bereitzustellen. Ich glaube, Tsuyoshi Ito hat Recht und Sie sind vielleicht ein wenig irregeführt in Bezug auf Coq. Es ist ein großartiges Tool für die Bereitstellung eines fehlerfreien Compilers, aber in dem von Ihnen beschriebenen Fall bietet es den statischen Analysen keine größere Leistung.
Das einzige, was ich über die Stärkung statischer Analysen mit Coq nachdenken kann, ist, Ihre Sprache mit Behauptungen auszustatten, die einige vom Benutzer geschriebene Beweise enthalten. - Wenn der Compiler selbst in eine Sprache übersetzt würde, die eine Feder für die dynamische Typüberprüfung enthält, und wenn die vom Benutzer geschriebenen Proofs in Funktionen konvertierbar wären, könnten diese Funktionen als erforderliche Eigenschaften für einige Untertypisierungen oder Optimierungen angewendet werden. - Dies würde dem Compiler tatsächlich mehr Leistung bringen.
Soweit ich jedoch sehen kann, wäre es ziemlich nützlich, um die Subtypisierung zu verstärken. - Es ist schwierig, einen Programmierer wissen zu lassen, welche Eigenschaft an welcher Stelle für den Optimierer hilfreich wäre.
quelle