gpt4 book ai didi

haskell - GHCI 从不加载编译文件

转载 作者:行者123 更新时间:2023-12-04 18:06:49 28 4
gpt4 key购买 nike

编写一个模块:

module Foo where
foo = 3.14

编译它:
ghc -c Foo.hs

加载它:
ghci -ignore-dot-ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l Foo
[1 of 1] Compiling Foo ( Foo.hs, interpreted )
Ok, modules loaded: Foo.

为什么 GHCi 不拾取已编译的代码?它是 GHCi 中的错误吗?

我尝试使用 -v 运行,不太有帮助。

更新

我发现如果模块是用 GHCi -fobject-code Foo 编译的, GHCi 将随后加载编译后的版本,即使没有 -fobject-code .

更新 2

这一切都发生在 Linux 机器上的 Ghc 7.8 上。 Windows 机器上的 Ghc 7.6 不会出现此问题。

最佳答案

来自 GHC 7.8.1 Release Notes

On Linux, FreeBSD and Mac OS X, GHCi now uses the system dynamic linker by default, instead of its built in (static) object linker. This is more robust cross-platform, and fixes many long-standing bugs (for example: constructors and destructors, weak symbols, etc work correctly, and several edge cases in the RTS are fixed.)

As a result of this, GHCi (and Template Haskell) must now load dynamic object files, not static ones. To assist this, there is a new compilation flag, -dynamic-too, which when used during compilation causes GHC to emit both static and dynamic object files at the same time. GHC itself still defaults to static linking. [...]

Currently, Dynamic GHCi and -dynamic-too are not supported on Windows (32bit or 64bit.)



最后一句解释了为什么这不会影响 Windows。

您可以通过比较 ghci -fobject-code Foo 的文件来发现问题。和 ghc Foo生成:

$ mkdir ghci ghc
$ ghc Foo -odir ghc -hidir ghc
$ ghci -fobject-code Foo -odir ghci -hidir ghci < /dev/null
$ diff -u <(ghc --show-iface ghc/Foo.hi) <(ghc --show-iface ghci/Foo.hi)
--- /proc/self/fd/11 2014-07-30 13:03:34.977845398 +0200
+++ /proc/self/fd/12 2014-07-30 13:03:34.978845419 +0200
@@ -3,13 +3,13 @@
Version: Wanted [7, 0, 8, 3],
got [7, 0, 8, 3]
Way: Wanted [],
- got []
+ got [d, y, n]
interface main:Foo 7083
interface hash: 9aab457c4ecbd2507529fcb479523944
ABI hash: 375e3124c60d5f4eb51e7e38e71a3be0
export-list hash: ff40b932e3d14f0fc26fbd56a58e227c
orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e
- flag hash: 6c2d0082779adc2bd558d879f3f0fe26
+ flag hash: 82fa613fe97939e6767d853897fe1074
used TH splices: False
where
exports:

这表明 GHCi 将 haskell 文件编译为动态目标文件( dyn 方式),而
GHC 编译成静态目标文件。

当 GHCi 尝试加载 Foo 时,它注意到没有可用的 Foo 动态目标文件(因为 GHC 生成了一个静态文件),因此它重新编译了 Foo。如果 -fobject-code给出,这将覆盖静态对象文件并生成一个动态的,
这样下次启动 GHCi 时就不需要重新编译了。如果 -fobject-code不是
指定,不生成目标代码,文件以解释模式加载。

也可以告诉 ghc生成动态对象文件:
$ ghc -dynamic -c Foo

现在 ghci Foo不重新编译 Foo,而是使用已经编译好的动态对象文件。

关于haskell - GHCI 从不加载编译文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25025006/

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