Coq / Agdaの認定コンパイラーと最適化


9

Martin-Löf型理論で公式化された検証済みコンパイラー、つまりCoq / Agdaに興味があります。現在、小さなおもちゃの例を書いています。これにより、私の最適化が正しいことを証明できます。たとえば、ゼロの加算、つまり "x + 0"のような式は削除できます。

通常のコンパイラで実行するのが難しい最適化はありますか?通常のコンパイラでは実行できない最適化を可能にするプログラムの特定のプロパティを証明することは可能ですか?(すなわち、定理証明で可能である推論なしで)

私はアイデアや例に興味があり、またトピックに関する参考文献にも興味があります。

関連する質問: コンパイラの正当性の証明

編集:剛がコメントにうまく書いているように:コンパイラが(たとえば)Cで書かれている場合は実装が困難で、コンパイラが(たとえば)Coqで書かれている場合は実装が容易な最適化手法を探しています。Agdaが(haskellを介して)Cにコンパイルされると、CでもAgdaで可能なすべてのことを実行できます。おそらくCoq / Agdaのような定理証明者の唯一の利点は、コンパイラーと最適化を検証できることです。

edit2:Vijay DIの提案に従って、これまで読んだことを書いてください。私は主にINRIAのXavier LeroyとCompCertプロジェクトに焦点を当てました(80ページの論文があり、読みやすいと思います)。2番目の関心は、インタラクティブプログラムに関するAnton Setzerの作業にありました。私はおそらく、彼の研究はIOプログラムとIOプログラムのバイシミュレーションに関する特性を証明するために使用できると思います。Sewellについて言及していただきありがとうございます。ICFPで彼の "ジャングルからの物語"の話を聞いて、おそらく彼の論文の2〜3冊を読んだ。しかし、私は彼の作品と彼の共著者の作品を具体的には見ていません。
コンパイラーの最適化に関する論文をどこから始めて探すかはまだわかりませんでした。たとえば、検証されたコンパイラの設定でどの最適化を見ると興味深いでしょうか。


1
「通常のコンパイラで実行するのが難しい最適化はありますか」:それは不可能ではないですか?検証済みのコンパイラーから正当性の証明を削除すると、通常のコンパイラーになります。したがって、検証済みコンパイラーで実行できることはすべて、通常のコンパイラーでも実行できます。検証済みのコンパイラのポイントは、不正な最適化を実行できないことです。(コンパイラーとプログラム検証についての私の知識は最小限です。要点を逃してしまった場合は失礼します。)
伊藤剛

@剛さんコメントありがとうございます。つまり、通常は不可能な最適化を実行できるプログラムの特定のプロパティ(保持されることが保証されている)を証明できますか?一部の不変条件は、プログラムの検証が難しい場合があり、おそらくこれらの最適化は、一般的に使用されるコンパイラーでは実行されません。しかし、おそらく私は完全に間違っています。
mrsteve 2013年

1
Coq / Agdaで書かれたコンパイラまたはCoq / Agdaのコンパイラについて話しているのですか?私はあなたの質問は、コック/ Agdaで書かれたコンパイラについてだったと思ったが、その後、私はコック/ Agdaで書かれたコンパイラは、C言語で書かれたコンパイラよりも、ターゲットプログラムについてのより多くの性質を証明することができるとは思わない
剛伊藤

2
読んだことを質問に追加するとよいでしょう。検証済みのコンパイルに関する作業、たとえばXavier Leroyの作業に精通していますか?それともピーター・シーウェルと共同研究者のそれですか?
Vijay D

1
質問をさらに制限しない限り、そのような最適化はありません。極端な場合、Cコンパイラは、定理の証明者を内臓に密かに実装することができます(実際には、限られた方法で実装します)。「通常のコンパイラ」とはどういう意味かわかりません。
Andrej Bauer、2013

回答:


5

Yves Bertot、Benjamin Gr´egoire、およびXavier Leroyによるこのペーパーは、純粋にCoq仕様に基づいて、Cライクな言語向けに最適化コンパイラを構築します。このテクノロジの一部は、CompCert Cコンパイラで使用されているようです。

データフロー分析に基づいてコンパイラの最適化を証明するための構造化アプローチ

定数伝播(CP)と共通部分式除去(CSE)の2つの最適化の正しさを考慮します。これらの最適化は、同じ言語のCoqベース以外のコンパイラに関連する最適化よりも高度です。たとえば、gccと比較したこのベンチマークチャートを参照してください。(Coqベースのコンパイラは、めったに言及されませんが、おそらくコンパイルが遅くなります!)

ConCertの元の側面は、ほとんどのコンパイラーがCoq仕様言語で純粋に関数型のスタイルで直接記述されていることです。実行可能なコンパイラは、この仕様からCamlコードを自動抽出することによって取得されます。

ただし、本書の最後に、実際のコンパイラーには、フレームワークでモデル化できないコンパイラーの最適化がいくつかあることに言及しています。

ここでは、最適化の改善だけが考慮の要素ではありません。別の側面として、コンパイラーの最適化ロジックは、その複雑な性質のために微妙な欠陥が発生する可能性があります。長年にわたって、gccには多数の最適化ロジックルーチンにバグがあることが判明しています。例:gccバグ?


3

通常は不可能な最適化を実行できるようにするプログラム(たとえば、サブルーチンは非エントリーであり、それ自体を呼び出すことはできない)の特定のプロパティ(保持されることが保証されている)を証明できますか?

これは、タイプチェッカーを拡張して、プログラムのいくつかのプロパティをオプティマイザに提供することと同じです。伊藤剛さんもそうだと思います。Coqについては少し見当違いかもしれません。これはバグのないコンパイラを提供するための優れたツールですが、あなたが説明した場合、静的分析にはそれ以上の力はありません。

Coqで静的分析を強化することについて私が考えることができる唯一のことは、ユーザー作成の証明を含むアサーションを言語に装備させることです。-コンパイラ自体が動的な型チェック用の羽を含む言語に翻訳され、ユーザー作成の証明が関数に変換可能である場合、それらの関数を一部のサブタイピングまたは最適化に必要なプロパティとして適用することが可能です。-これは確かに、コンパイラにより多くの力を提供します。

しかし、私が見る限りでは、サブタイピングを強化するためにかなり役立つでしょう。-プログラマーに、オプティマイザーにとってどの場所のどのプロパティが役立つかを知るのは難しいです。

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