gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:37:19 25 4
gpt4 key购买 nike

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

对于区分优化和未优化模块的简单测试用例,isOptimized下面的计算结果为 True开启优化,但 False关闭优化:

isOptimized :: Bool
isOptimized = g

g :: Bool
g = False

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

最佳答案

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

  • 必须使用 -fobject-code flag 调用 ghci .
  • 必须在 -fobject-code 之后给出优化标志在命令行上,或在模块顶部的 OPTIONS_GHC pragma 中。尝试ghc --interactive -O -fobject-code产生“-O 与 --interactive 冲突;-O 被忽略”的警告。这可能是一个错误。
  • 如果您正在处理一个 cabalized 项目并使用 cabal repl ,您需要在命令行(即 cabal repl --ghc-options="-fobject-code -O" )或编译指示中传递标志。 Cabal(当前)丢弃在 .cabal 文件中设置的优化标志 ghc-options调用 ghci 时;实际上,它明确设置了 -O0反而。这可能是一个错误。

  • 请注意,在优化和未优化模式之间切换时,您有时需要手动强制重新编译。出于某种原因,只要 -fobject-code 更改优化标志,构建工件就不会失效。保持开启。如果,从头开始,你有 -fobject-code在你的 .cabal 文件中设置,运行 cabal repl它编译模块,然后记住您需要在命令行上设置 -O 并运行 cabal repl --ghc-options=-O ,ghc 将愉快地加载先前编译的、未优化的模块。这也可能是一个错误。

    测试单个模块最可靠的场景似乎是把 {-# OPTIONS_GHC -fobject-code -O #-}在模块的顶部。无论您如何调用 ghci,您都将获得优化的代码。我还没有调查在某些但不是所有模块都具有编译指示的多模块情况下会发生什么。

    顺便说一句,请注意,只有模块中的代码被优化。即使开启优化,评估 g在 repl 中总是会产生 False ,因为 repl 输入不受重写规则的约束。

    关于haskell - 如何在 GHCI 中加载优化代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881725/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com