混合编译和解释的代码时,Haskell程序挂起

Mat*_*hid 12 haskell runtime-error ghc

考虑以下简单模块:

module Fail1 where
identity x = x

module Main where
import Fail1
main = print (identity 7)
Run Code Online (Sandbox Code Playgroud)

我将这些另存为Fail1.hsFail2.hs。如果我尝试运行该程序,一切都很好:

> runhaskell Fail2
7
Run Code Online (Sandbox Code Playgroud)

但是看看这个:

> ghc -O2 --make Fail1
[1 of 1] Compiling Fail1     ( Fail1.hs, Fail1.o )

> runhaskell Fail2
_
Run Code Online (Sandbox Code Playgroud)

该程序现在永久挂起,ghc.exe消耗了一个CPU内核的100%。有没有搞错?

它会变得更好:

> ghc -O2 --make Fail2
[2 of 2] Compiling Main     ( Fail2.hs, Fail2.o )

> runhaskell Fail2

Access violation in generated code when reading 0xffffffffffffffff

 Attempting to reconstruct a stack trace...

   Frame        Code address
 * 0x71fdd90    0x3d7ce28 C:\Program Files\Haskell Platform\8.6.3\bin\ghc.exe+0x397ce28
Run Code Online (Sandbox Code Playgroud)

嗯... w?

具有讽刺意味的是,如果我Fail2.exe自己运行,它会完美运行:

> Fail2
7
Run Code Online (Sandbox Code Playgroud)

到底发生了什么?我会生气吗 这真的看起来真的像某种GHC错误。任何人都可以重现吗?或者仅仅是我的系统吗?

> ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.6.3
Run Code Online (Sandbox Code Playgroud)

(哇,好的。那确实没有显示太多信息。我正在运行Windows 7 Pro 64位,并且我相信我已经安装了GHC的64位版本。)

Mic*_*ael 4

这是 GHC 中的一个错误,已在 GHC 8.6.4 中修复。

我已经使用 GHC 8.6.3、GHC 8.6.4 和 GHC 8.6.5 对其进行了测试,后两个版本按预期工作。

我使用了 x64 Windows haskell stack,并且运行的是安装了所有更新的 Windows 10(截至 2019 年 5 月 25 日)。

(对于所有 GHC 版本:无论我写runhaskell Fail2还是runhaskell Fail2.hs没有任何区别。)

GHC 8.6.3

这有效:

stack --resolver lts-13.11 runhaskell Fail2
Run Code Online (Sandbox Code Playgroud)

然后我编译Fail1:

stack --resolver lts-13.11 ghc -- -O2 --make Fail1
Run Code Online (Sandbox Code Playgroud)

那么原来的 runhaskell 命令在运行 Fail2 时会挂起。

然后我编译Fail2:

stack --resolver lts-13.11 ghc -- -O2 --make Fail2
Run Code Online (Sandbox Code Playgroud)

然后原始的 runhaskell 命令崩溃,就像问题所描述的那样。

GHC 8.6.4

使用--resolver lts-13.19(使用 GHC 8.6.4),命令全部按预期工作。

GHC 8.6.5

相同--resolver lts-13.23(使用 GHC 8.6.5)。

解决方案

只需更新到最新的 GHC 版本,或者至少更新到 ghc 8.6.4 。