GHCコアの読み取り


193

コアはGHCの中間言語です。リーディングコアは、プログラムのパフォーマンスをよりよく理解するのに役立ちます。Coreを読むためのドキュメントやチュートリアルを誰かに頼まれましたが、あまり見つかりませんでした。

GHCコアを読むために利用できるドキュメントにはどのようなものがありますか?

これが私がこれまでに見つけたものです:



skillmatter.com/skillscasts/…も役に立つかもしれません。
Erik Kaplun、2015年

回答:


272

GHCコアは、すべてのHaskellが翻訳されるSystem FC言語です。コアの(おおよその)文法は、

ここに画像の説明を入力してください

Coreは、よりシンプルでよく知られたSystem Fと密接に関連していますコアレベルでGHCが行うすべての変換は、パフォーマンスを向上させるために、このコア表現の型を保持するリファクタリングです。また、あまり知られていませんが、Coreで直接記述してGHCをプログラムできます。

GHCコアはコンパイラーパイプラインに適合します(2002年と同様、sans-LLVMおよびCMM)。

ここに画像の説明を入力してください

GHCコアについて学ぶための主要なドキュメントは次のとおりです。

理解を助けることができる関連資料:

  • GHCの-fextコア出力
  • 私はGHCソースを読んでコアを学ぶことに多くの時間を費やしました。2002年の学部論文の 16ページからいくつか説明されています。
  • ghc-coreツールを使用することから、Coreを楽しい形式で生成します。

次に、コアはSTGコードに変換され、次のようになります。

ここに画像の説明を入力してください

Coreの面白い名前は「Z-encoding」でエンコードされています。

ここに画像の説明を入力してください

GHCコアのタイプと種類(トルマックの論文より):

ここに画像の説明を入力してください

最後に、GHCが知っている基本的な指示にHaskellを最適化すると、GHCのプリモップがGHCコア出力に定期的に表示されます。primopセットは、前処理されたファイルでコア関数のセットとして提供されます。


61
あなたが与えるすべての答えは常に途方もなく完全です。別の賛成投票をして、それを継続してください。ヒープを傾けています。
ロバートマサイオリ

3
Donおよび一般的なHaskellコミュニティがSOを介してリリースしたCC-wikiドキュメントの量は驚異的です。皆さん、良いQとAを守ってください!
Dan Burton、

4
私はそれが言及されていることを知っていますが、答えではghc-coreの有用性を強調する必要があると思います。
Nikita Volkov

24

ヒント:型注釈と強制が気にならない場合-ddump-simplは、-dsuppress-allオプションと組み合わせて使用します。コア出力はもっと読みやすいはずです。


5
-dsuppress-all本当に便利です。-dsuppress-coercionsキャストのみを削除したい場合にも使用できます(周りに多くの新しいタイプがある場合に便利です)。
tibbe

8

GHCコア言語とは厳密には異なりますが、Donが述べているように、STG言語は非常によく似ています。最近、STG言語+マシンの型安全性を証明する演習を行いましたが、その後、Coreを簡単に理解できることがわかりました。

私がSTGを学ぶために使用したテキストは非常にアクセスしやすいです:ストックハードウェアでの遅延関数型言語の実装: Simon Peyton-JonesによるSpineless Tagless G-machine。このホワイトペーパーの多くは実装の詳細に関係していますが、直感に反する設計決定の動機を与え、などのよく知られた例の翻訳を提供するSTG言語の上位から下位への説明として、特にセクション4をお勧めしますmap


STGはCoreよりもはるかに低いレベルです。コンパイルパイプラインは次の
とおりです。Haskell-

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