2010-12-08 8 views
16

Wo kann ich etwas Papier/Dokument/was auch immer bekommen, das beschreibt, wie ein Haskell-Compiler tatsächlich funktioniert? Ich habe einige der Dokumente von GHC gelesen, aber nach Kopfschmerzen gestoppt. Also, etwas, das keine Doktorarbeit benötigt, um es zu verstehen und nicht in dem Du-soll-schon-schon-vertraut-mit-ihr-Stil geschrieben wäre, wäre vorzuziehen. Es ist kein Problem, wenn es wirklich lang ist und einige Zeit braucht, um es zu verstehen.Wie funktioniert ein Haskell-Compiler?

PS: Am interessantesten wäre etwas über GHC, aber alles ist in Ordnung.

+0

Ausgezeichnete Frage. Ich würde gerne wissen, ob CPS-Transformation a la Schema verwendet wird oder nicht. Ich glaube fest daran, dass es "der" Weg ist, um funktionale Sprachen zu implementieren, aber ich kann die Schwierigkeiten übersehen. –

+2

Wenn Sie wissen wollen, was CPS ist, dann ist das ausgezeichnete "Lambda the ultimate goto" -Papier des Autorentwurfs eine großartige Lektüre. –

+1

Nicht genau das, wonach Sie fragen, aber ich würde empfehlen, andere Compiler als GHC zu starten. Die Quelle von JHC ist sehr gut lesbar und der UHC-Code hat eine Menge guter theoretischer Dokumentation; beides wäre einfacher als GHC. –

Antwort

27

Sie können eine Antwort vom Maul des Pferdes bekommen! Simon Peyton Jones (GHC-Assistent) hat ein Buch geschrieben, in dem erklärt wird, wie funktionale Programmiersprachen implementiert werden können. Es ist kostenlos online verfügbar, da es jetzt vergriffen ist: http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/

Natürlich ist GHC weitergegangen, seit das Buch geschrieben wurde, aber es ist immer noch sehr relevant.

+2

Und nicht vergessen, die stg Papier - "Implementieren Lazy funktionale Sprachen auf Lager Hardware": http://research.microsoft.com/apps/pubs/default.aspx?id=67083 – sclv

+0

Und die Videos auf der GHC verknüpft Entwickler-Wiki. –

3

Leider vermute ich, dass das, was Sie suchen, nicht existiert. Compiler-Theorie und formale Sprachtheorie sind ziemlich komplexe Themen in der Informatik, und Haskell ist keineswegs ein Ausgangspunkt.

Zuerst sollten Sie wahrscheinlich eine gute Erdung in erhalten:

Ich würde vermuten, dass alles, was etwas über die Interna von Haskell erklärt, ein wesentlich besseres Verständnis der oben genannten Themen erfordern würde, als C sagen würde.

Ich habe bisher einen einzigen Kurs zu diesem Thema gemacht, daher habe ich keine formelle Literatur zu empfehlen, aber ich bin mir sicher, dass es viele gute Quellen gibt.

+0

Ich denke du hast Recht. Ich möchte nur verstehen, was dort vor sich geht. IMHO ist es einfacher zu verstehen, was Ihr Programm macht, wenn Sie tatsächlich wissen, wie es kompiliert wird. – fuz

+1

Sie antworten ist nicht sehr hilfreich. Haskell ist so anders als Mainstream-Sprachen. –

+2

@FUZxxl, ich sympathisiere mit Ihrer Sichtweise; bei prozeduralen Sprachen ist dies sehr der Fall, und insbesondere bei etwas wie C. Allerdings ist bei Haskell die Entfernung von Sprache zu Maschine viel größer, so dass Sie viel mehr Zeit mit dem Sprachmodell verbringen müssen. Das einzige Mal, wenn dies nicht wahr ist, ist es, wenn man über Leistung nachdenkt. Das Verständnis des gesamten Compilers ist jedoch nicht sehr nützlich. Erfahren Sie mehr über Thunks, Striktheitsanalyse und den von GHC emittierten Zwischencode. –

3

Compiler sind ein riesiges Thema und es wäre unmöglich, sie hier vollständig zu erklären. Aber hier ist eine Übersicht für einen allgemeinen Compiler. Hoffentlich wird dies Ihnen ein Verständnis geben, das das Lesen von Dingen über GHC etwas leichter verständlich macht.

Compiler arbeiten in der Regel durch eine Reihe von Transformationen in 2 Teilen, dem Front-End und Back-End.

Die erste Umwandlung verwandelt Klartext in etwas leichter zu durchqueren. Dies selbst ist normalerweise in zwei Teile aufgeteilt:

Lexical Analysis or Tokenization - Die Handlung der Umwandlung von Klartext in kleine Stücke (in der Regel Operatoren, Bezeichner, Literale usw.).

Syntactic Analysis or Parsing - Diese kleinen Brocken in eine Baumstruktur verwandeln. (typischerweise ein AST, an Abstract Syntax Tree)

Die nächste Stufe ist semantische Analyse. In dieser Phase fügt ein Compiler normalerweise Informationen zum AST hinzu (wie Typinformationen) und erstellt eine Symboltabelle. Damit ist das Frontend abgeschlossen.

Die nächste Umwandlung wandelt den AST in einen IR, an Intermediate Representation um. Dies ist in der Regel heute an SSA form, a Single Static Assignment.

Dies wird dann optimiert, über Konstantenpropagation Dead Code Analyse, Vektorisierung usw.

Die letzte Transformation Codegenerierung. Transformieren der IR in Maschinencode. Dies kann sehr kompliziert sein. Es wird manchmal auch als Absenkung bezeichnet.

Für weitere Informationen empfehle ich this wikipedia page.

+2

Vielen Dank für Ihren Kommentar. Bitte beachten Sie, dass ich speziell nach Haskell gefragt habe, wo diese Schritte etwas ausgeklügelter sind, z. Haskell erlaubt neuen Operatoren mit beliebigem Vorrang, die das Parsen zu einem Rätselraten, Typinferenz und Klassen machen, die IMHO die Analyse dessen, was ziemlich herausfordernd vor sich geht, und einen großen Haufen Optimierungen machen, nur um die Faulheit loszuwerden. Aber danke für deine klare Antwort! – fuz

14

Sind Sie auf der Suche nach Details speziell zum Kompilieren von Lazy-Evaluation? Es Simon Peyton-Jones ist Buch von Max Bolingbroke erwähnt, auch das Buch Saubere Implementierung Detaillierung ist online:

http://wiki.clean.cs.ru.nl/Functional_Programming_and_Parallel_Graph_Rewriting

Wenn Sie eine Hochschulzugehörigkeit haben und wollen etwas kleiner Sie könnten versuchen, diese Bücher zu bekommen (Henderson & Diller sind sicherlich vergriffen):

Antoni Diller "Übersetzen Funktion Sprachen" ISBN 0 471 92027 4

Peter Henderson "Functional Programming Anwendung und Implementation" ISBN 0-13-331579-7

AJT Davie "Eine Einführung in die funktionale Programmierung Systeme mit Haskell" ISBN 0 521 27724 8

Diller hat einen vollen Compiler für einen faulen Sprache (implementiert in Pascal) über combinator Reduktion. Dies war die von David Turner für SASL erfundene Implementierungstechnik. Henderson hat viele Teile eines Compilers für LISPkit, eine faule Variante von Lisp. Davie stellt ziemlich viel von der Maschinerie zur Verfügung, um eine faule Sprache zu kompilieren, zum Beispiel gibt es eine Beschreibung der STG, die viel kürzer ist als das Buch von Simon Peyton-Jones (die STG ist die abstrakte Maschine SPJ, die für Haskell verwendet wird).

Die Clean-Entwickler haben ziemlich viel Informationen über die Umsetzung SAPL (eine einfache Applicative Language), wenn Sie ihre Publikationsliste durchsehen:

http://www.st.cs.ru.nl/Onderzoek/Publicaties/publicaties.html

schließlich eine ganze Reihe von Papieren gibt es dokumentieren Aspekte der Utrecht Haskell Compiler UHC (und EHC). Ich denke, die meisten Informationen sind, wie der Compiler organisiert ist (mit Attributgrammatiken und "Shuffle") und wie die Typsysteme (es gibt verschiedene Ebenen des Typsystems in EHC) implementiert sind, anstatt wie die Backend-Kompilierung funktioniert.