7

GHCコアを生成する単純な言語のフロントエンドを作成したいと思います。次に、この出力を取得して、通常のGHCパイプラインで実行します。このページによると、ghcコマンドから直接行うことはできません。それをする方法があるかどうか疑問に思います。

理想的には、ghc-apiへのいくつかの関数呼び出しを期待していますが、GHCのソースでの(それほど広範囲ではない)ハッキングを含む提案も受け入れています。どんなポインタも役に立ちます!

4

2 に答える 2

11

Core は明示的に型付けされた言語であり、他の言語から生成するのが非常に困難になる可能性があることに注意してください (GHC 型チェッカーはすべての型を推測しているので、問題ありません)。たとえば、通常の恒等関数は次のように(id = \x -> x :: forall a. a -> a)なります。

id = \(a :: *) (x :: a) -> a

whereaは kind の型変数です*forallこれは、タイプ レベルのバインディングの用語レベルのプレースホルダーです。同様に、呼び出すときにid、最初の引数として型を指定する必要があるため、Haskell 式(id 42)は に変換され(id Int 42)ます。このような型バインディングと型適用は、生成されたマシン コードには存在しませんが、コンパイラの変換が正しいことを確認するのに役立ちます。

明るい面としては、Haskell を生成するだけでよいかもしれません。GHC が常にその型を判別できるような方法でコードを生成できれば、基本的に Haskell の小さなサブセットを使用しているだけです。ただし、これが機能するかどうかは、ソース言語に大きく依存します。

于 2012-01-19T22:37:59.910 に答える
5

ghcコマンドまたは APIを介して外部コア ファイルを読み取る方法はまだありません。ごめん :(

GHC API を使用して表現から Core 構文ツリーを構築することは理論的にはおそらく可能ですが、それは非常に面倒に思えます。他のバックエンドをターゲットにすることをお勧めします。必ずしも GHC の使用をやめる必要はありません。ボックス化されていない型を持つ単純な Haskell をunsafeCoerce使用すると、結果の Core にかなり近づけることができるため、独自の単純な「Core-ish」言語を定義してコンパイルすることができます。(実際、おそらく GHC Core自体をコンパイルすることもできますが、それは私の好みには少しメタ的すぎます。)

于 2012-01-19T14:02:59.783 に答える