如何在GHCI中加载优化代码?

时间:2015-01-10 22:07:09

标签: haskell ghc compiler-optimization read-eval-print-loop ghci

我正在编写一个依赖于优化的模块。我想在ghci中测试这个模块。但是在--interactive模式下启动ghc会自动禁用优化;如果我用-O编译模块,然后尝试在交互式会话中加载它,ghc坚持在解释模式下加载它。

对于区分优化模块和未优化模块的简单测试用例,下面的isOptimized评估结果为True并进行优化,但False优化关闭:

isOptimized :: Bool
isOptimized = g

g :: Bool
g = False

{-# NOINLINE g #-}
{-# RULES "g/True"  g = True #-}

1 个答案:

答案 0 :(得分:12)

使用ghci -fobject-code -O Test.hscabal repl --ghc-options="-fobject-code -O"。更详细:

    必须使用-fobject-code flag

    调用
  1. ghci

  2. 优化标志必须在命令行上的 -fobject-code后面的中给出,或者在模块顶部的OPTIONS_GHC pragma中给出。尝试ghc --interactive -O -fobject-code会产生一个警告:“-O与--interactive相冲突; -O被忽略”。这可能是一个错误。

  3. 如果您正在处理cabalized项目并使用cabal repl,则需要在命令行(即cabal repl --ghc-options="-fobject-code -O")或pragma中传递标记。当调用ghci时,Cabal(当前)丢弃在.cabal文件中使用ghc-options设置的优化标志;实际上,它明确地设置了-O0。这可能是一个错误。

  4. 请注意,在优化和未优化模式之间切换时,有时需要手动强制重新编译。出于某种原因,只要-fobject-code保持打开,优化标志发生变化时,构建工件就不会失效。如果从干净的平板开始,您在.cabal文件中设置了-fobject-code,请运行编译模块的cabal repl,然后记住您需要在命令行上设置-O并运行{{ 1}},ghc将很乐意加载以前编译的,未经优化的模块。这也许也是一个错误。

    测试单个模块的最可靠方案似乎是将cabal repl --ghc-options=-O放在模块的顶部。无论你如何调用ghci,你都会得到优化的代码。我没有调查在多模块情况下会发生什么,其中一些但不是所有模块都具有该编译指示。

    顺便提一下,请注意,只有模块中的代码才会得到优化。即使进行了优化,在repl中评估{-# OPTIONS_GHC -fobject-code -O #-}也会产生g,因为repl输入不受重写规则的约束。