依存型のコンパイラはインタープリターよりもはるかに難しいですか?


11

このチュートリアルのように、依存型の実装について何かを学びましたが、それらのほとんどはインタープリターの実装です。私の質問は、型チェックのために依存型の引数を実際に評価できるため、依存型のコンパイラを実装するのはコンパイラよりもはるかに難しいようです。

そう

  • 私の素朴な印象は正しいですか?
  • それが正しい場合、依存型をサポートする静的にチェックされた言語の実装に関する例/リソースはありますか?

いいえ、依存型コンパイルの問題を既知の問題に減らすことができます。(1)インタープリターを使用してプログラムを型チェックします。(2)プログラムをOCaml / Haskell / whateverに抽出します。(3)ocamloptまたはGHC を使用してコンパイルします:-) (これはCoqおよびAgdaのアプローチです。)
xrq

回答:


12

これは興味深い質問です!Anthonyの答えが示唆するように、型チェックのための用語を評価するためのインタープリターを既に持っているなら、非依存の関数型言語をコンパイルするために通常のアプローチを使用できます。

これがエドウィン・ブレイディが取ったアプローチです。これは概念的には簡単ですが、型チェックを実行するとコンパイルの速度上の利点が失われます。これはいくつかの方法で対処されています。

まず、変換チェックを実行するために用語をオンザフライでバイトコードにコンパイルする仮想マシンを実装できます。これは、Benjamin Gregoirevm_computeによってCoq に実装された背後にある考え方です。どうやら、この正確な主題に関するDirk Kleeblattによるこの論文もありますが、仮想マシンではなく実際のマシンコードがダウンしています。

第二に、実行時に、依存型付けされたプログラムの型チェックに必要なすべての変換をチェックする、より一般的な言語でコードを生成できます。これは、たとえば、Haskellを使用してAgdaモジュールを型チェックできることを意味します。コードをコンパイルして実行することができ、それが受け入れられる場合、依存型言語のコードは適切に型付けされていると見なすことができます(実装エラーとコンパイラエラーを除く)。Mathieu Boesflugが提案したこのアプローチを最初に聞いたことがあります。

最後に、タイプに表示される用語と実行することを意図した用語は、2つの異なる言語の一部である必要があります。タイプレベルで表示される用語自体に依存するタイプがない場合は、2つの段階でコンパイルできます。最初に「タイプレベル」コードをコンパイルし、「用語レベル」のタイプをチェックするときにこれを実行できますコード。この方法で進行するシステムは知りませんが、タイプレベルとプログラムレベルの用語が異なるMicrosoftのF言語など、多くのシステムで潜在的に可能です。


1
ちょっと一言:型チェックを行うインタープリターがいるのに、なぜコンパイラーを書くのをわざわざするのですか?結局のところ、依存型付けプログラミング言語のほとんどの(すべて?)真剣なユーザーは、言語を証明アシスタントとして使用して、型チェッカーのみを気にします。確かに、AgdaまたはCoqプログラムを実際に実行したことはありません。したがって、速度が気になる場合は、型変換をコンパイルしませんか?
マーティンバーガー

2
ソリューション2および3は、この問題に対処します。適切に型付けされていることを確認するコードをコンパイルします(特に型変換を実行します)。2番目の発言は、状況によっては依存型付けされたコードを実際に実行したいということです(Idris、Ur / Webを参照)。
コーディ

1
また、ソリューション1は、ある程度まで、インタープリターとコンパイラーの間の境界線を曖昧にすることによって、それに対処します。
コーディ

1
場合、私は疑問に思うフューチュラマ突起技術はインタプリタをスピードアップするために使用することができ効果的にコンパイラで終わりますか、?
スティーブンショー

1
私が見た唯一のものはユニゾンunisonweb.org/2017-10-13/scala-world.html
スティーブンショー

10

Edwin Bradyの博士論文では、依存型付きプログラミング言語用のコンパイラを構築する方法を概説しています。私は専門家ではありませんが、System Fのようなコンパイラを実装するよりもそれほど難しくはないと思います。原則の多くは非常に似ており、一部は同じです(例:スーパーコンビネーターのコンパイル)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.