Ist der Compiler für abhängige Typen viel schwieriger als ein Interpreter?


11

Ich habe etwas über das Implementieren abhängiger Typen gelernt, wie dieses Tutorial , aber die meisten von ihnen implementieren Dolmetscher. Meine Frage ist, es scheint, dass die Implementierung eines Compilers für abhängige Typen viel schwieriger ist als ein Compiler, da Sie die Argumente für abhängige Typen für die Typprüfung wirklich auswerten können.

So

  • Ist mein naiver Eindruck richtig?
  • Wenn es richtig ist, gibt es ein Beispiel / Ressourcen zur Implementierung einer statisch überprüften Sprache, die den abhängigen Typ unterstützt?

Nein, da Sie das Problem beim Kompilieren abhängiger Typen auf ein bekanntes Problem reduzieren können: (1) Überprüfen Sie das Programm mit einem Interpreter. (2) Extrahieren Sie das Programm nach OCaml / Haskell / was auch immer; (3) Kompilieren mit ocamloptoder GHC :-) (Dies ist übrigens der
Coq-

Antworten:


12

Das ist eine interessante Frage! Wie aus Anthonys Antwort hervorgeht, können die üblichen Ansätze zum Kompilieren einer nicht abhängigen Funktionssprache verwendet werden, vorausgesetzt, Sie haben bereits einen Interpreter, um Begriffe für die Typprüfung zu bewerten .

Dies ist der Ansatz von Edwin Brady. Dies ist konzeptionell einfacher, verliert jedoch die Geschwindigkeitsvorteile der Kompilierung bei der Typprüfung. Dies wurde auf verschiedene Weise angegangen.

Erstens kann man eine virtuelle Maschine implementieren, die Begriffe im laufenden Betrieb zu Bytecode kompiliert, um die Konvertierungsprüfung durchzuführen. Dies ist die Idee, vm_computedie Benjamin Gregoire in Coq umgesetzt hat . Anscheinend gibt es auch diese These von Dirk Kleeblatt zu diesem genauen Thema, aber eher den tatsächlichen Maschinencode als eine virtuelle Maschine.

Zweitens kann man Code in einer konventionelleren Sprache erzeugen, die bei der Ausführung alle Konvertierungen überprüft, die zur Typprüfung eines abhängig typisierten Programms erforderlich sind. Dies bedeutet, dass wir beispielsweise Haskell verwenden können, um ein Agda-Modul auf Typ zu überprüfen. Der Code kann kompiliert und ausgeführt werden. Wenn er akzeptiert wird, kann davon ausgegangen werden, dass der Code in der Sprache des abhängigen Typs gut typisiert ist (mit Ausnahme von Implementierungs- und Compilerfehlern). Ich habe diesen von Mathieu Boesflug vorgeschlagenen Ansatz zum ersten Mal gehört .


1
Ein bisschen ironisch: Warum sollten Sie sich die Mühe machen, einen Compiler zu schreiben, wenn Sie einen Dolmetscher haben, der die Typprüfung durchführt? Schließlich kümmern sich die meisten (alle?) Seriösen Benutzer von abhängig getippten Programmiersprachen nur um die Typprüfung und verwenden die Sprache als Proof-Assistent. Ich habe sicherlich noch nie eines meiner Agda oder Coq Programme ausgeführt. Wenn Sie also Wert auf Geschwindigkeit legen, möchten Sie dann nicht die Typkonvertierungen kompilieren?
Martin Berger

2
Die Lösungen 2 und 3 beheben dieses Problem: Sie kompilieren Code, der die Typisierung überprüft (und insbesondere Typkonvertierungen durchführt). Meine zweite Bemerkung ist, dass Sie in einigen Situationen tatsächlich abhängig eingegebenen Code ausführen möchten (siehe Idris, Ur / Web).
Cody

1
Außerdem: Bis zu einem gewissen Grad wird dies auch in Lösung 1 behoben, indem die Grenzen zwischen Interpreter und Compiler verwischt werden.
Cody

1
Ich frage mich, ob die Futurama-Projektionstechnik verwendet werden könnte, um den Interpreter zu beschleunigen und effektiv einen Compiler zu erhalten.
Steven Shaw

1
Das einzige, was ich gesehen habe, ist Unison unisonweb.org/2017-10-13/scala-world.html
Steven Shaw

10

In der Doktorarbeit von Edwin Brady wird beschrieben, wie ein Compiler für eine abhängig typisierte Programmiersprache erstellt wird. Ich bin kein Experte, aber ich würde sagen, es ist nicht extrem schwieriger als die Implementierung eines System F-ähnlichen Compilers. Viele der Prinzipien sind sehr ähnlich und einige sind gleich (z. B. Zusammenstellung von Superkombinatoren). Die Arbeit behandelt viele andere Aspekte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.