私はこれについて少し考えました。主な問題は、一般に、多相型の値がどれほど大きいかわからないということです。この情報がない場合は、何らかの方法で入手する必要があります。モノモーフィゼーションは、ポリモーフィズムを特化することによってこの情報を取得します。ボクシングは、既知のサイズの表現にすべてを入れることにより、この情報を取得します。
3番目の選択肢は、この情報を種類別に追跡することです。基本的には、データサイズごとに異なる種類を導入することで、特定のサイズのすべてのタイプに対して多態性関数を定義できます。以下にそのようなシステムをスケッチします。
種類型コンストラクタκあ::= N::=|∀ A :κ 。あ|α|A × B|A + B|A → BR E Fあ|P a d(k )|μ α :κ 。あ
ここでは、タイプの種類によって、メモリ内にオブジェクトを配置するのに必要な単語数がわかるという高いレベルの考え方があります。任意のサイズについて、その特定のサイズのすべてのタイプで多態性になるのは簡単です。すべてのタイプ(ポリモーフィックなタイプであっても)のサイズは既知であるため、コンパイルはCの場合より難しくありません。
分類規則はこの英語を数学に変換し、次のようになります:
α :N ∈ ΓΓ ⊢ α:NΓ 、α :N ⊢ A:MΓ ⊢ ∀ α :N 。A: m
Γ ⊢ A: NΓ ⊢ B: MΓ ⊢ A × B:N + MΓ ⊢ A: NΓ ⊢ B: NΓ ⊢ A + B: N + 1
Γ ⊢ A: MΓ ⊢ B: NΓ ⊢ A → B:1Γ ⊢ A: NΓ ⊢ R E FA:1
Γ ⊢ P D(K ):KΓ 、α :N ⊢ A:NΓ ⊢ μ α :N 。A:n
したがって、forall量指定子では、範囲を広げる種類を指定する必要があります。同様に、ペアリングはボックス化されていないペアタイプであり、メモリ内で隣にを配置するだけです(C構造体タイプのように)。Disjoint unionは、同じサイズの2つの値を取り、次に、弁別子タグの単語を追加します。関数はクロージャであり、通常、環境とコードのレコードへのポインタで表されます。A BA × BあB
参照は興味深いものです。ポインタは常に1語ですが、任意のサイズの値を指すことができます。これにより、プログラマー
はボクシングによって任意のオブジェクトにポリモーフィズムを実装できますが、そうする必要はありません
。最後に、明示的なサイズが機能するようになったら、スペースを使用するが何もしないパディングタイプを導入すると便利です。(したがって、intと1組のintの素な結合を取得する場合は、最初のintにパディングを追加して、オブジェクトのレイアウトが均一になるようにする必要があります。)
再帰型には標準の形成規則がありますが、再帰発生は同じサイズでなければならないことに注意してください。これは、通常、それらをポインタに固定して、分類を機能させる必要があることを意味します。たとえば、リストのデータ型は次のように表すことができます
μ α :1。R E F(P a d(2 )+ i n t × α )
したがって、これは空のリスト値、または別のリンクされたリストへのポインターと整数のペアを指します。
このようなシステムの型チェックもそれほど難しくありません。私のICFP論文にあるJoshua Dunfieldのアルゴリズム、より高いランクのポリモーフィズムのための完全で簡単な双方向型チェックは、ほとんど変更なしでこのケースに適用されます。