比较ghc中生成的代码

时间:2016-06-20 07:26:30

标签: haskell optimization ghc

C世界中比较C的两个碎片的常见做法是查看它们产生的组件。我想知道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如何优化代码的正确方法(如果有的话)是什么?

1 个答案:

答案 0 :(得分:4)

装配可能有点太低级了。你可能想看看GHC的中间优化语言Core。

基本上,GHC将Haskell转换为Core,对其进行各种优化传递,最终将Core转换为STG,然后转换为C--和本机代码生成器(即汇编)或通过LLVM(我不对这条特定途径了解不多。)

特别是,Core仍然相当高级,并且有点类似于Haskell(即,它具有类似的抽象,如模式匹配和惰性评估)。如果两个程序生成相同的Core,那么显然它们会生成相同的机器代码。