モジュラーコンパイラでPottierとGauthierのポリモーフィックな非機能化を使用した人はいますか?


15

機能停止とは、高次プログラムを1次プログラムに変換するプログラム変換です。アイデアは、プログラムが与えられた場合、有限数のラムダ抽象化があるため、各ラムダをIDで置き換え、各関数アプリケーションをそのIDで分岐する適用プロシージャの呼び出しで置き換えることができるということです。これは関数型言語のコンパイラーで使用されることもあり ますが、その適用性は、機能停止がプログラム全体の変換であるという事実によって制限されるため(プログラム内のすべての関数を静的に知る必要があります)、プログラム全体のコンパイラーのみがそれ。

ただし、PottierとGauthierには、GADTを含むより洗練された型付けを使用した、多相型型の非機能化アルゴリズムがあります。エンコードが指定されると、タグではないが高次関数を含むラムダデータ型にキャッチオールケースを追加することができます。つまり、モジュールごとにエンコードを使用して機能を無効にすることができるはずです。

誰かがこれをやったことがあり、このアイデアを使用しているコンパイラを指し示していますか?(おもちゃのコンパイラは大丈夫であり、実際に推奨されます。)

回答:


6

1つのアプローチは

ゲオルギオス・フルトゥーニスとニコラオス・S・パパスピロー。2013. Defunctionalizing Compilerでの個別のコンパイルのサポート。 SLATE 2013。

@gascheが言及しているように:

この問題に対する別のアプローチは、各モジュールが独自の「非機能化関数」タイプとディスパッチャー/ハンドラーを定義できることを考慮することです。

これらのタイプとハンドラーを専用のリンカーで「リンク」できます。オープンデータ型の使用とは異なり、コンストラクターのリストとケース関数を連結します。ただし、リンカは部分アプリケーションのケースを追加する必要があります。プログラム全体の分析がなければ、どの機能にどの部分アプリケーションを使用できるかを予測できないため、すべてのケースを追加します。AN 進機能部分的に適用することができるI(引数で0 < I < N)とアリティの関数を生成N - n0<<nn一部再度適用することができます。


4

エンコードが指定されると、タグではないが高次関数を含むラムダデータ型にキャッチオールケースを追加することができます。これは、モジュールごとにエンコードを使用して機能を停止できることを意味します。

ここでの意味についてもう少し詳しく説明していただけますか?基本ケース(データ型、ディスパッチ機能のパターンマッチング、またはその両方)を追加すると、モジュール化がどのように役立つかわかりません。ところで、なぜ「モジュールごと」に正確に意味するのですか?

特定のモジュール/プログラム内で、選択的な非機能化のために「ベースケース」が使用されていることを想像できます。'a -> 'bます。このコンストラクターでは、タグを具体化するのではなく、機能停止を防ぎます。

この問題に対する別のアプローチは、各モジュールが独自の「非機能化関数」タイプとディスパッチャー/ハンドラーを定義できることを考慮することです。moduleの関数M1はtype M1.arrowを持ちM1.apply、などを使用して適用されます。これは関数の1次の使用ではうまく機能しますが、高次関数に拡張する方法はよくわかりません(そうする必要はありません)関数の引数がどこから来たのかを知ってください):関数をディスパッチャにバンドルすると、間接的な関数呼び出しの領域に再び入ります。

最後に、あなたが参照した論文には、プログラム全体とモジュール式のアプローチの簡単な言及がありますが、それがあなたの提案にどのように関係するかわかりません。それらが記述するものは、関数とデータ型(複数の独立したモジュールにわたって定義できる関数と型)の両方の「オープンな拡張」の観点から表現されます。これは主に、リンク時に独立したモジュールの分析/変換の組み合わせを延期し、プログラム全体の変換の必要性を緩和できるという事実を説明するためのMLの方法です。

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