2016-06-20 15 views
4

Cの2つのフラグメントを比較するためのCの一般的なプラクティスは、生成するアセンブリを確認することです。私は、GHCがある場合に生成されますどのようなコードを知りたいと思った:ghcで生成されたコードを比較します

afmap :: Functor f => (a -> b -> c) -> f b -> a -> f c 
afmap fn fb a' = (fn a') <$> fb 

afmap = flip . (((.).(.)) fmap ($)) 

だから私が試した:

多かれ少なかれ読めないコードを生成した(予想通り)
$ ghc -S test.hs -o test.S 

を。

ghcがコードを最適化する方法を評価する正しい方法(ある場合)は何ですか?

+0

私は生産されたコアを見ます。見て[ここ](http://stackoverflow.com/questions/6121146/reading-ghc-core) – pdexter

+0

興味深い答え。記録のために、おそらく私の質問への答えは[ghc-core](http://hackage.haskell.org/package/ghc-core)にあります。 – fakedrake

+0

これは素晴らしいツールです – pdexter

答えて

4

アセンブリがおそらく低すぎます。 Core、GHCの中間最適化言語を見たいと思うかもしれません。

本質的に、GHCはHaskellをCoreに変換し、多種多様な最適化を行い、最終的にCoreをSTGに変換してからCに変換し、ネイティブコードジェネレータ(アセンブリ)またはLLVM(Iその特定の経路についてあまり知りません)。

特に、コアは依然として合理的に高水準であり、Haskellと幾分類似しています(つまり、パターンマッチングやレイジー評価のような類似の抽象化を持っています)。 2つのプログラムが同じコアを生成する場合、明らかに同じマシンコードが生成されます。

+0

これは正解で役立ちます。将来の参考のためには、 'ghc'が実際に関数をコンパイルするために入力ファイルの先頭に' module Test(afmap)where'という行を追加する必要があります。 – fakedrake

関連する問題