gpt4 book ai didi

Haskell GHCI 未加载编译的目标文件

转载 作者:行者123 更新时间:2023-12-02 14:14:53 26 4
gpt4 key购买 nike

我希望 GHCI 加载模块的已编译目标代码,该模块在编译时比未编译的版本要快得多。当所有文件都位于同一目录中(没有模块层次结构)时,这种方法效果很好。但是,当文件位于模块层次结构中时,它们不起作用。

工作版本MyFile.hs:

import Basic
import Histogram

其中 Basic.o 和 Histogram.o 与 MyFile.hs 位于同一目录中

MyFile.hs 版本不工作:

import Util.Basic
import Util.Histogram

其中Basic.o 和Histogram.o 位于子目录Util 中。在这个版本中,我在加载 MyFile.hs 时得到以下信息:

[1 of 2] Compiling Util.Basic ( Util/Basic.hs, interpreted )
[2 of 2] Compiling Util.Histogram ( Util/Histogram.hs, interpreted )
Ok, modules loaded: Util.Basic, Util.Histogram.

我希望能够在模块中组织我的代码,但仍然可以从使用编译的 o 文件中获得好处。

另外,应该注意的是,自编译 o 文件以来,源文件没有更改。

编辑:以下是每个文件的内容:

MyFile.hs

import Util.Basic
import Util.Histogram

Util/Basic.hs

module Util.Basic () where

Util/Histogram.hs

module Util.Histogram () where

文件/编译:

$:~/programming/haskell/example-error$ ls
MyFile.hs MyFile.hs~ Util
$:~/programming/haskell/example-error$ cd Util
$:~/programming/haskell/example-error/Util$ ls
Basic.hs Basic.hs~ Histogram.hs Histogram.hs~
$:~/programming/haskell/example-error/Util$ ghc *.hs
[1 of 2] Compiling Util.Histogram ( Histogram.hs, Histogram.o )
[2 of 2] Compiling Util.Basic ( Basic.hs, Basic.o )
$:~/programming/haskell/example-error/Util$ ls
Basic.hi Basic.hs~ Histogram.hi Histogram.hs~
Basic.hs Basic.o Histogram.hs Histogram.o
$:~/programming/haskell/example-error/Util$ cd ../
$:~/programming/haskell/example-error$ ghci -ignore-dot-ghci MyFile.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 3] Compiling Util.Histogram ( Util/Histogram.hs, interpreted )
[2 of 3] Compiling Util.Basic ( Util/Basic.hs, interpreted )
[3 of 3] Compiling Main ( MyFile.hs, interpreted )
Ok, modules loaded: Util.Basic, Util.Histogram, Main.
*Main>

按照丹尼尔的建议工作的解决方案:

The fix is to compile the importing file, and the files in the 
subdirectory only as a consequence of that, not directly.

最佳答案

问题与下面讨论的相同,标志已更改:

~/.../Util> ghc Other.hs
[1 of 1] Compiling Util.Other ( Other.hs, Other.o )
~/.../Util> cd ..
~/.../src> ghc MyFile.hs
[1 of 2] Compiling Util.Other ( Util/Other.hs, Util/Other.o ) [flags changed]
[2 of 2] Compiling MyFile ( MyFile.hs, MyFile.o )

我还没有找到具体是哪些标志,或者为什么在单独编译期间传递的标志与作为从导入模块追逐的模块进行编译时传递的标志不同,但它们确实发生了变化,因此需要重新编译是必要的(具体来说,.hi 文件中的 flag-hash 值发生变化)。

因此,修复方法是不要单独编译模块,而是将它们编译为顶级导入器的依赖项。

<小时/>

最初几乎正确的猜测:

我只能部分重现这一点。编译后,然后 touchMyFile.hs

$ ghci-7.4.2 MyFile.hs
-- snip
[1 of 2] Compiling Util.Other ( Util/Other.hs, interpreted )
[2 of 2] Compiling MyFile ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile, Util.Other.

它看起来和你一样,但在 7.6.1 中,我们得到一个提示(编译和touching):

$ ghci MyFile.hs
-- snip
[1 of 2] Compiling Util.Other ( Util/Other.hs, interpreted ) [flags changed]
[2 of 2] Compiling MyFile ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile, Util.Other.

标志已更改。我的 .ghci 文件中有 :set -XNoMonomorphismRestriction ,并且标志的更改会导致重新编译。

$ ghci -ignore-dot-ghci MyFile.hs
GHCi, version 7.6.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[2 of 2] Compiling MyFile ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile, Util.Other.

忽略带有未为编译给出的标志的有问题的.ghci,不会解释未更改的Util.Other,而是使用编译后的代码。 (对于 GHC < 7.4,甚至不需要忽略 .ghci 文件。)

如果您有一个 .ghci 文件,其中设置了语言选项(NoMonomorphismRestrictionTypeFamilies...)并且 ghc >= 7.4,加载模块时需要忽略.ghci文件。

如果情况并非如此,则重新编译不是预期的行为。然后需要更多信息来诊断问题并找到解决方案。

半解决方法是 ghci 的 -fobject-code 标志。

关于Haskell GHCI 未加载编译的目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13596273/

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