Der Stalin-Compiler optimiert brutal, aber wie?

14

JM Siskinds Forschungsstatement besagt:

Stalin ist ein optimierender Compiler für Scheme, der eine statische Analyse des gesamten Programms durchführt und die Ergebnisse dieser Analyse verwendet, um äußerst effizienten Code zu generieren. Stalin verwendet eine große Sammlung statischer Analysetechniken. Es führt eine neuartige Form der Polyvariantenflussanalyse durch, die eine iterierte monovariante Flussanalyse verwendet, um eine flussgerichtete Aufteilung durchzuführen: Klonen spezialisierter Kopien von Prozeduren und Zuweisung von Zielen zu solchen Klonen pro Aufrufstelle. Es verwendet die Ergebnisse der Flussanalyse, um eine Lebenszeitanalyse, eine Escape-Analyse, eine Punkteanalyse und eine Must-Alias-Analyse durchzuführen. Diese Analysen unterstützen eine neuartige Form der Lightweight-Closure-Konvertierung, bei der die meisten Closure-Slots eliminiert werden. Dabei werden Techniken wie variable Globalisierung und Lokalisierung verwendet, das statische Backchain komprimiert und in der Regel die meisten Closures aus Programmen entfernt. Die obigen Analysen werden auch zur Unterstützung der flussgesteuerten bereichsbasierten Speicherverwaltung verwendet, bei der die Garbage Collection zur Laufzeit durch statische Zuweisung und Freigabe auf der Basis von abstrakten Werten und Programmpunkten ersetzt wird. Es führt auch eine strömungsgesteuerte leichte CPS-Konvertierung durch, wobei Erweiterungen der mit Screamer entwickelten Techniken verwendet werden, um äußerst effiziente erstklassige Fortsetzungen zu unterstützen. Schließlich werden flussgesteuertes Inlining und die Auswahl von Repräsentationen auf niedriger Ebene unterstützt, um die Implementierung (oder Nichtimplementierung) von Tags, die Tag-Überprüfung und das Tag-Dispatching auf der Basis von abstrakten Werten und Programmpunkten auszuwählen. Auf diese Weise werden die meisten Laufzeit-Tags, Tag-Überprüfungen, Tag-Markierungen, Tag-Stripping, Tag-Dispatching, Boxing und Unboxing aus Programmen entfernt. Dabei wird die Garbage Collection zur Laufzeit durch statische Zuweisung und Freigabe auf der Basis des abstrakten Werts und des Programmpunkts ersetzt. Es führt auch eine strömungsgesteuerte leichte CPS-Konvertierung durch, wobei Erweiterungen der mit Screamer entwickelten Techniken verwendet werden, um äußerst effiziente erstklassige Fortsetzungen zu unterstützen. Schließlich werden flussgesteuertes Inlining und die Auswahl von Repräsentationen auf niedriger Ebene unterstützt, um die Implementierung (oder Nichtimplementierung) von Tags, die Tag-Überprüfung und das Tag-Dispatching auf der Basis von abstrakten Werten und Programmpunkten auszuwählen. Auf diese Weise werden die meisten Laufzeit-Tags, Tag-Überprüfungen, Tag-Markierungen, Tag-Stripping, Tag-Dispatching, Boxing und Unboxing aus Programmen entfernt. Dabei wird die Garbage Collection zur Laufzeit durch statische Zuweisung und Freigabe auf der Basis des abstrakten Werts und des Programmpunkts ersetzt. Es führt auch eine strömungsgesteuerte leichte CPS-Konvertierung durch, wobei Erweiterungen der mit Screamer entwickelten Techniken verwendet werden, um äußerst effiziente erstklassige Fortsetzungen zu unterstützen. Schließlich werden flussgesteuertes Inlining und die Auswahl von Repräsentationen auf niedriger Ebene unterstützt, um die Implementierung (oder Nichtimplementierung) von Tags, die Tag-Überprüfung und das Tag-Dispatching auf der Basis von abstrakten Werten und Programmpunkten auszuwählen. Auf diese Weise werden die meisten Laufzeit-Tags, Tag-Überprüfungen, Tag-Markierungen, Tag-Stripping, Tag-Dispatching, Boxing und Unboxing aus Programmen entfernt. Verwenden von Erweiterungen der mit Screamer entwickelten Techniken, um äußerst effiziente erstklassige Fortsetzungen zu unterstützen. Schließlich werden flussgesteuertes Inlining und die Auswahl von Repräsentationen auf niedriger Ebene unterstützt, um die Implementierung (oder Nichtimplementierung) von Tags, die Tag-Überprüfung und das Tag-Dispatching auf der Basis von abstrakten Werten und Programmpunkten auszuwählen. Auf diese Weise werden die meisten Laufzeit-Tags, Tag-Überprüfungen, Tag-Markierungen, Tag-Stripping, Tag-Dispatching, Boxing und Unboxing aus Programmen entfernt. Verwenden von Erweiterungen der mit Screamer entwickelten Techniken, um äußerst effiziente erstklassige Fortsetzungen zu unterstützen. Schließlich werden flussgesteuertes Inlining und die Auswahl von Repräsentationen auf niedriger Ebene unterstützt, um die Implementierung (oder Nichtimplementierung) von Tags, die Tag-Überprüfung und das Tag-Dispatching auf der Basis von abstrakten Werten und Programmpunkten auszuwählen. Auf diese Weise werden die meisten Laufzeit-Tags, Tag-Überprüfungen, Tag-Markierungen, Tag-Stripping, Tag-Dispatching, Boxing und Unboxing aus Programmen entfernt.Diese Analysen und Optimierungen ermöglichen es Stalin, äußerst effizienten Code zu generieren, der alle anderen Schema-Compiler um Faktoren zwischen zwei und einhundert übertrifft, insbesondere für numerisch intensiven Code. Stalin generiert häufig Code, der handgeschriebenen c- und Fortran-Code übertrifft.

Ich konnte das folgende sehr interessante Papier über die Implementierung von Verschlüssen / Funktionsaufrufen finden: Flow-Directed Lightweight Closure Conversion . Ich habe dem Autor auch eine E-Mail geschickt, um nach den Artikeln zu den anderen Themen zu fragen, die im Abschluss-Umrechnungsartikel erwähnt werden:

Siskind, JM 2000a. Strömungsgerichtete leichte CPS-Umwandlung. In Vorbereitung.

Siskind, JM 2000b. Strömungsgerichtete Polyvarianz. In Vorbereitung.

Siskind, JM 2000c. Auswahl der flussgesteuerten Darstellung. In Vorbereitung.

Siskind, JM 2000d. Flow-gesteuertes Speichermanagement. In Vorbereitung

Leider kam er nie dazu, diese Papiere zu schreiben. Meine Frage an Sie lautet: Gibt es alternative oder verwandte Artikel, die diese Themen behandeln? Ich bin sehr daran interessiert zu erfahren, wie Stalin (oder andere Compiler) eine so hohe Programmiersprache kompilieren kann, dass ein Schema, das durch Speicherbereinigung dynamisch typisiert wird, erstklassige Funktionen unterstützt und sogar erstklassige Fortsetzungen zu einem so effizienten Code statisch kompiliert werden können . Obwohl Veröffentlichungen zur Durchflussanalyse ziemlich zahlreich sind, gibt es keine Veröffentlichungen zur Verwendung der Ergebnisse einer solchen Analyse für die oben genannten Optimierungen.

Jules
quelle

Antworten:

11

Der Schlüssel ist wahrscheinlich die Tatsache, dass die gesamte Programmanalyse und die gesamte Programmoptimierung verwendet werden. Je mehr Sie wissen, wie sich ein Programm verhält, desto mehr können Sie sich spezialisieren, einbinden und leistungsfähig machen.

Ähnlich verhält es sich mit dem MLton-Compiler für Standard-ML ( http://mlton.org/ ). Es gibt mindestens eine Präsentation dazu: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Frühere Arbeiten wurden von Craig Chambers und seiner Gruppe an der University of Washington durchgeführt (zum Beispiel: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). Dies geschah im Kontext von Self und später von Cecil / Vortex.

Es gibt wahrscheinlich mehr Arbeit in der Scheme / Lisp-Community. Sie möchten wahrscheinlich "ganze Programmoptimierung" googeln.

Dave Clarke
quelle