このチュートリアルのように、依存型の実装について何かを学びましたが、それらのほとんどはインタープリターの実装です。私の質問は、型チェックのために依存型の引数を実際に評価できるため、依存型のコンパイラを実装するのはコンパイラよりもはるかに難しいようです。
そう
- 私の素朴な印象は正しいですか?
- それが正しい場合、依存型をサポートする静的にチェックされた言語の実装に関する例/リソースはありますか?
このチュートリアルのように、依存型の実装について何かを学びましたが、それらのほとんどはインタープリターの実装です。私の質問は、型チェックのために依存型の引数を実際に評価できるため、依存型のコンパイラを実装するのはコンパイラよりもはるかに難しいようです。
そう
回答:
これは興味深い質問です!Anthonyの答えが示唆するように、型チェックのための用語を評価するためのインタープリターを既に持っているなら、非依存の関数型言語をコンパイルするために通常のアプローチを使用できます。
これがエドウィン・ブレイディが取ったアプローチです。これは概念的には簡単ですが、型チェックを実行するとコンパイルの速度上の利点が失われます。これはいくつかの方法で対処されています。
まず、変換チェックを実行するために用語をオンザフライでバイトコードにコンパイルする仮想マシンを実装できます。これは、Benjamin Gregoirevm_compute
によってCoq に実装された背後にある考え方です。どうやら、この正確な主題に関するDirk Kleeblattによるこの論文もありますが、仮想マシンではなく実際のマシンコードがダウンしています。
第二に、実行時に、依存型付けされたプログラムの型チェックに必要なすべての変換をチェックする、より一般的な言語でコードを生成できます。これは、たとえば、Haskellを使用してAgdaモジュールを型チェックできることを意味します。コードをコンパイルして実行することができ、それが受け入れられる場合、依存型言語のコードは適切に型付けされていると見なすことができます(実装エラーとコンパイラエラーを除く)。Mathieu Boesflugが提案したこのアプローチを最初に聞いたことがあります。
最後に、タイプに表示される用語と実行することを意図した用語は、2つの異なる言語の一部である必要があります。タイプレベルで表示される用語自体に依存するタイプがない場合は、2つの段階でコンパイルできます。最初に「タイプレベル」コードをコンパイルし、「用語レベル」のタイプをチェックするときにこれを実行できますコード。この方法で進行するシステムは知りませんが、タイプレベルとプログラムレベルの用語が異なるMicrosoftのF言語など、多くのシステムで潜在的に可能です。
ocamlopt
またはGHC を使用してコンパイルします:-) (これはCoqおよびAgdaのアプローチです。)