コンパイルの傾向の 1 つは、型付き中間言語を使用することです。System F-omega の変形であるHaskell のghc
中間core
言語は、このアーキテクチャの例です [1]。もう 1 つは LLVM で、コアに型付き中間言語があります [2]。このアプローチの利点は、コード ジェネレーターの一部を構成する変換のエラーを早期に検出できることです。さらに、型情報は最適化およびコード生成時に使用できます。
効率性のために、型指定された IR は型を推測するのではなく、型チェックされます。型チェックを高速化するために、各変数と各バインダーは型を持ち、型チェックを容易にします。
ただし、コンパイラ パイプラインの多くの変換では、新しい変数が導入される場合があります。たとえば、正規化変換K(.)
はアプリケーションを変換する可能性があります
M(N)
みたいな表現に
let x = K(M) in
let y = K(N) in x(y)
質問。新しく導入された変数に型を与えるという問題をコンパイラがどのように処理するのだろうか。K(M)
上記の例とでは、型チェックを再実行しK(N)
ますか? 手間じゃないですか。また、環境を渡す必要がありますか? 型チェックの再実行を避けるために、AST ノードから型情報へのマップを使用していますか?
S. Marlow、S. Peyton Jones、The Glasgow Haskell Compiler .