在 ghc 中比较生成的代码
Compare generated code in 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 如何优化代码的正确方法(如果有)是什么?
汇编可能有点太低级了。您可能想看看 Core,GHC 的中间优化语言。
本质上,GHC 将 Haskell 转换为 Core,对其进行各种优化传递,并最终将 Core 转换为 STG,然后转换为 C-- 和本机代码生成器(即汇编)或者通过 LLVM(我不太了解那个特定的路径)。
特别是,Core 仍然相当高级,有点类似于 Haskell(即,它具有类似的抽象,如模式匹配和惰性求值)。如果两个程序产生相同的核心,那么显然它们产生相同的机器代码。
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 如何优化代码的正确方法(如果有)是什么?
汇编可能有点太低级了。您可能想看看 Core,GHC 的中间优化语言。
本质上,GHC 将 Haskell 转换为 Core,对其进行各种优化传递,并最终将 Core 转换为 STG,然后转换为 C-- 和本机代码生成器(即汇编)或者通过 LLVM(我不太了解那个特定的路径)。
特别是,Core 仍然相当高级,有点类似于 Haskell(即,它具有类似的抽象,如模式匹配和惰性求值)。如果两个程序产生相同的核心,那么显然它们产生相同的机器代码。