e4exp / paper_manager_abstract

0 stars 0 forks source link

Improving Type Error Messages in OCaml #358

Open e4exp opened 3 years ago

e4exp commented 3 years ago

謎めいた型のエラーメッセージは、OCamlや他のMLベースの言語を学習する上での大きな障害となっています。 多くの場合,型推論アルゴリズムの十分に正確なモデルがなければ,エラーメッセージを解釈することはできません. MLにおける型のエラーメッセージを改善する問題は,過去20年間にかなり注目されており,多くの異なる戦略が考えられてきました. その課題は、プログラマにとって十分に簡潔で体系的に有用なエラーメッセージを生成することだけでなく、本格的なプログラミング言語を扱い、大規模なプログラムに効率的に対処することである。 本研究では、OCamlで実装されている伝統的なML型推論アルゴリズムを改良し、左から右への偏りを大幅に減らすことで、プログラマにとってより有益なエラーメッセージを報告することができるようにしました。 私たちのアルゴリズムは完全に予測可能であり、コードの修正に向けて常に何らかの進展をもたらす、かなり簡潔なエラーメッセージを生成し続けます。 私たちのアプローチは、OCamlコンパイラへのパッチとして、わずか数百行のコードで実装されました。 このパッチは、初心者だけでなく、大規模なOCamlプログラムを開発している経験豊富なプログラムにも有益であると考えています。

e4exp commented 3 years ago

本アプローチの主な特徴は以下の通りです。

私たちのアプローチは,数百行のコードからなるOCamlコンパイラのパッチとして実装されています. パッチされたコンパイラは,-easy-type-errorsと呼ばれる新しいフラグを提供します. このフラグが有効になると,コンパイラはまず,オリジナルのOCaml型チェックアルゴリズムを実行します. もしエラーがなければ,我々の修正した型チェックアルゴリズムは全く実行されません. そうでなければ,パッチを当てたコンパイラは,型チェックに失敗した最初のトップレベル定義を考慮し,ユーザに報告されるエラーメッセージを作成するために,今回は修正したアルゴリズムを使用して再度型チェックを試みます. (再タイプチェックの対象となるトップレベルの定義は、ローカルモジュールの定義の中の1つのアイテムである可能性があることに注意してください)。 従来のOCamlコンパイラでコンパイルしたプログラムは,パッチを当てたコンパイラでも-easy-type-errorsモードでコンパイルでき,しかもランタイムオーバーヘッドなしでコンパイルできます. また、私たちの修正型チェックアルゴリズムは、オリジナルのアルゴリズムよりもわずかに遅いだけなので、大規模なプログラムでも効率的にエラーを報告することができます。 例えば,OCaml typechecker 自身の実装の途中にある数百行の長さの関数に人為的に導入されたバグに対して,パッチを適用したコンパイラがエラーメッセージを生成できるかどうかをテストしました. 私たちのパッチは,GADTとレコードフィールドのオーバーロードを除いて,ほぼすべてのOCaml言語と互換性があります. GADTを含むプログラムは、-easy-type-errorsフラグを有効にしてコンパイルすることができますが、GADTの機能を使ったトップレベルの定義で型エラーが発生した場合、生成されるエラーメッセージは役に立ちません。 一つの例外は、フォーマット関数(例:"printf")で、その型はOCamlのGADTを利用しています。このようなフォーマット関数の呼び出しを認識し、オリジナルの型チェックアルゴリズムを用いてローカルに処理します。 レコードフィールド名のオーバーロードについては、オーバーロードの解決はユニフィケーションが実行される順序に敏感であり、この順序は私たちの代替型チェックアルゴリズムによって変更されるため、私たちのパッチはサポートしていません。 (より一般的には、我々のパッチは、ソースコードがOCamlの-principalオプションで正しく型チェックされることを期待しています)。 このパッチを適用したコンパイラは,以下のコマンドで入手・実行できます.

git clone -b improved-errors https://github.com/charguer/ocaml.git
cd ocaml
./configure && make world.opt
./ocamlc.opt -I stdlib -easy-type-errors foo.ml
e4exp commented 3 years ago

7 結論

私たちは、OCamlの型エラーメッセージを改善するための実用的なアプローチを紹介しました。 特に、左から右への偏りの量を減らすことで、簡潔なメッセージを生成する効率的で予測可能なアルゴリズムを維持します。 我々の実装は、OCaml言語の一般的に使用されている機能をすべてカバーしています。 これまで述べてきたように、このアプローチは、実質的にオーバーヘッドのない大規模プログラムにまでスケールアップすることができます。 我々の研究は主にOCamlを対象としていますが、アプリケーションや分岐構造のエラーを報告する我々のアプローチは、他の関数型プログラミング言語にも同様に適用できると考えています。