比较GHC中生成的代码



在C世界中比较C的两个fragmets的常见实践是查看它们产生的组件。我想知道:

的情况下,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如何优化代码的正确方法(如果有)是什么?

组装可能有点太低。您可能想查看GHC的中间优化语言Core。

本质上,GHC将Haskell转换为Core,对其进行了多种优化,并最终将Core转换为STG,然后将其转换为C--以及本机代码生成器(即汇编)或通过LLVM(I Don)'t对那个特定的途径了解很多)。

特别是,核心仍然是合理的高级,并且与Haskell有些相似(即,它具有类似的抽象,例如模式匹配和懒惰评估)。如果两个程序产生相同的核心,那么显然它们会产生相同的机器代码。

最新更新