GHC Core lesen

193

Kern ist die Zwischensprache von GHC. Mit Reading Core können Sie die Leistung Ihres Programms besser verstehen. Jemand bat mich um Dokumentation oder Tutorials zum Lesen von Core, aber ich konnte nicht viel finden.

Welche Dokumentation steht zum Lesen von GHC Core zur Verfügung?

Folgendes habe ich bisher gefunden:

tibbe
quelle
Skillsmatter.com/skillscasts/… könnte ebenfalls nützlich sein.
Erik Kaplun

Antworten:

272

GHC Core ist die System FC- Sprache, in die alle Haskell übersetzt werden. Die (ungefähre) Grammatik für Core ist gegeben durch:

Geben Sie hier die Bildbeschreibung ein

Der Kern ist eng mit dem einfacheren und bekannteren System F verwandt . Alle Transformationen, die GHC auf Core-Ebene durchführt, sind typerhaltende Refactorings dieser Core-Darstellung, um die Leistung zu verbessern. Und, nicht so bekannt, können Sie direkt in Core schreiben, um GHC zu programmieren.

GHC Core passt in die Compiler-Pipeline (wie schon 2002 ohne LLVM und CMM):

Geben Sie hier die Bildbeschreibung ein

Die wichtigsten Dokumente zum Erlernen von GHC Core sind:

Zugehöriges Material, das zum Verständnis beitragen kann:

  • Die GHC-Fext-Core-Ausgabe
  • Ich habe viel Zeit damit verbracht, Core durch Lesen der GHC-Quelle zu lernen. Einige sind in meiner Diplomarbeit von 2002 auf Seite 16 beschrieben.
  • Von der Verwendung des ghc-core- Tools bis zur Generierung von Core in einem Format finde ich es angenehm.

Core wiederum wird in STG-Code übersetzt, der ungefähr so ​​aussieht:

Geben Sie hier die Bildbeschreibung ein

Die lustigen Namen in Core sind in der "Z-Codierung" codiert:

Geben Sie hier die Bildbeschreibung ein

Arten und Arten von GHC Core (aus Tolmachs Papier):

Geben Sie hier die Bildbeschreibung ein

Schließlich werden die Primops von GHC regelmäßig in der GHC Core-Ausgabe angezeigt , wenn Sie Ihren Haskell auf die grundlegenden Anweisungen optimiert haben, die GHC kennt. Der Primop-Satz wird als Satz von Kernfunktionen in einer vorverarbeiteten Datei angegeben.

Don Stewart
quelle
61
Jede einzelne Antwort, die Sie geben, ist immer lächerlich vollständig. Haben Sie eine weitere Abstimmung und machen Sie weiter so; Ich lehne Haufen.
Robert Massaioli
3
Die Menge an CC-Wiki-Dokumentation, die Don und die allgemeine Haskell-Community über SO veröffentlicht haben, ist atemberaubend. Machen Sie weiter so mit den guten Fragen und Antworten!
Dan Burton
4
Ich weiß, dass es erwähnt wird, aber ich denke, dass die Nützlichkeit von ghc-core in der Antwort hervorgehoben werden sollte.
Nikita Volkov
24

Ein Tipp: Wenn Sie sich nicht für Typanmerkungen und Zwänge interessieren, verwenden Sie diese -ddump-simplzusammen mit der -dsuppress-allOption. Die Core-Ausgabe sollte viel besser lesbar sein.

nominolo
quelle
5
-dsuppress-allist wirklich nützlich. Sie können es auch verwenden, -dsuppress-coercionswenn Sie nur Casts entfernen möchten (nützlich, wenn es viele neue Typen gibt).
Tibbe
8

Obwohl nicht gerade die GHC-Kernsprache, ist die STG-Sprache, wie Don erwähnt, ziemlich ähnlich. Ich habe kürzlich die Prüfung der Typensicherheit der STG language + machine durchgeführt und danach festgestellt, dass ich Core leicht verstehen kann.

Der Text, mit dem ich STG gelernt habe, ist leicht zugänglich: Implementierung von Lazy Functional Languages ​​auf Standardhardware: Die Spineless Tagless G-Maschine von Simon Peyton-Jones. Ein Großteil des Papiers befasst sich mit Implementierungsdetails, aber ich empfehle Abschnitt 4 insbesondere als eine umfassende Erklärung der STG-Sprache, die Motivationen für einige der kontraintuitiven Entwurfsentscheidungen liefert und Übersetzungen bekannter Beispiele wie map.

Acfoltzer
quelle
STG ist ein viel niedrigeres Level als Core. Die Kompilierungspipeline lautet: Haskell -> Core -> STG -> C-- -> Maschinencode
Akangka
3

"Eine externe Darstellung für die GHC-Kernsprache" ist ein Dokument, das in der Installation von ghc ( share/doc/ghc/core.pdf) oder im Internet zu finden ist .

Roman Cheplyaka
quelle