2012-01-19 8 views
5

GHCコアを生成する簡単な言語のフロントエンドを作成したいと考えています。私はこの出力を受け取り、通常のGHCパイプラインを通して実行したいと思います。 this pageによれば、ghcコマンドから直接には可能ではありません。 があれば、私はそれを行う方法はと思っています。GHCコアへのコンパイル

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

+0

"現在(バージョン6.8.2以降)、GHCには外部コアファイルをソースとして読み込む機能がありません。" _internal_コアで表現を生成し、それをGHCに渡す必要があるでしょう、私は恐れています。あなたのために、私は過度に悲観的だと思うが、ghc-apiへのいくつかの呼び出しよりもはるかに必要と思う。 –

答えて

5

ghcコマンドまたはAPI経由で外部コアファイルを読み取る方法はまだありません。申し訳ありません:(

GHC APIを使用して表現からコア構文ツリーを構築するのは理論的には可能ですが、それは非常に苦痛を伴うものですが、GHCの使用をやめる必要はありません;ボックス化されていない型を持つ単純なHaskellとunsafeCoerceを使うと、結果のCoreにかなり近づけることができるので、独自の単純な "Core-ish"言語を定義してコンパイルすることができます(実際にはGHC Core 自体をしかし、それは私の味のためにあまりにもメタです。)

+1

あなたは、Haskellのそれが基本的に既にコアになっている方が良い運を持っているかもしれません。 –

9

コアは明示的に型付けされた言語であり、他の言語から生成するのが非常に難しいことに注意してください(GHC型チェッカーにはiすべてのタイプをサポートしているので問題ありません)。例えば、通常の恒等関数(id = \x -> x :: forall a. a -> a)aは一種*の型変数である

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

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

明るい側では、Haskellを生成することができます - GHCが常にその型を決定できるようにコードを生成できるなら、本質的にちょうどHaskellの小さなサブセットを使用しています。しかし、これがうまくいくかどうかはソース言語に大きく依存します。

関連する問題