5

In der Pipeline von GHC gibt es eine Phase der Übersetzung des Haskell-Quellcodes in Core und dann (nicht unbedingt als nächster nächster Schritt) die Übersetzung von Core in STG. Allerdings entgeht mir ein Problem von meinem Verständnis - wann haben wir einen "normalen" Code (d. H. Als einfachen Text) und wann etwas tatsächlich im Speicher lebt, wie abstrakte Syntaxbäume (ASTs)?GHC-Pipeline: Core, STG - ASTs oder Text?

Und auf meine Frage etwas präziser zu machen, wird ich es in zwei Teile unterteilen:

1) in der Parsen von Datei Phase Haskell Quelle, haben wir sofort Ast Sprachkern konstruieren? Wenn nicht, dann scheint es mir, dass wir ASTs von vollem Haskell konstruieren müssen (was merkwürdig erscheint) und sie dann entweder in ASTs von Core transformieren, oder erstens in textliche Repräsentation von ihnen in Core und erneutes Parsing, um Core's ASTs zu erhalten.

2) fast die gleiche Frage gilt für Core STG Übergang (aber in diesem Fall denke ich, kann ich davon ausgehen, dass, was wir haben Äste das ist Kern - korrekt)

Antwort

13

Die Haskell Quelle zunächst in einen AST analysiert wird von vollem Haskell, das dann typchecked wird.

Von da an wird es entkernt in Core, übersetzt in STG, von dort nach Cmm entweder zu Assembly oder LLVM-Code. Alle diese Phasen sind auf ASTs aufgebaut, es gibt keine textuelle Repräsentation irgendeiner dieser Stufen bis zum assembly/llvm-Code, der dann in eine Datei geschrieben und mit externen Werkzeugen kompiliert wird.

Es ist nicht strage, einen AST von vollem Haskell zu haben. Es ist in der Tat eine Anforderung, Typfehler in Bezug auf den Code zu geben, den der Benutzer geschrieben hat, anstatt Typfehler nur auf der Ebene von Core zu erkennen.

Sie können den AST für Haskell in den Modulen von HsSym und dem AST von Core in CoreSyn finden.

+3

Jetzt ist es klar - danke! Oh, und Links scheinen kaputt zu sein ... – socumbersome

+0

Schau mal [hier] (https://github.com/ghc/ghc/tree/ghc-7.8/compiler/hsSyn), insbesondere [hier] (https: //github.com/ghc/ghc/blob/ghc-7.8/compiler/hsSyn/HsExpr.lhs), dann [hier] (https://github.com/ghc/ghc/blob/ghc-7.8/compiler/ coreSyn/CoreSyn.lhs) und [hier] (https://github.com/ghc/ghc/blob/ghc-7.8/compiler/stgSyn/StgSyn.lhs). –

+0

Die Verknüpfungen wurden korrigiert. Das ist es, was ich bekomme, wenn ich versuche, saubere https: // www.haskell.org/ghc/'-Links anstelle von seltsamen https: // downloads.haskell.org/~ ghc /' -Links zu erzeugen. –