Программа на Haskell зависает при смешивании скомпилированного и интерпретированного кода
Рассмотрим следующие тривиальные модули:
module Fail1 where
identity x = x
module Main where
import Fail1
main = print (identity 7)
Я сохраняю их как Fail1.hs
и Fail2.hs
. Если я пытаюсь запустить эту программу, все хорошо:
> runhaskell Fail2
7
Но взгляните на это:
> ghc -O2 --make Fail1
[1 of 1] Compiling Fail1 ( Fail1.hs, Fail1.o )
> runhaskell Fail2
_
Теперь программа зависает навсегда, ghc.exe
потребляет 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
Э... Ват?
Как ни странно, если я просто запускаю Fail2.exe
сам, он работает отлично:
> Fail2
7
Что, черт возьми, происходит? Я схожу с ума? Это действительно, действительно похоже на какую-то ошибку GHC. Кто-нибудь еще может воспроизвести это, или это просто моя система?
> ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.6.3
(Ничего себе, хорошо. Это действительно не отображает много информации. Я использую 64-битную Windows 7 Pro, и я считаю, что я установил 64-битную сборку GHC.)
Ответы
Ответ 1
Это ошибка в GHC, и она была исправлена в GHC 8.6.4.
Я проверил это с GHC 8.6.3, GHC 8.6.4 и GHC 8.6.5, и последние две версии работают как положено.
Я использовал стек haskell для Windows x64 и использую Windows 10 со всеми установленными обновлениями (по состоянию на 2019-05-25.)
(Для всех версий GHC: пишу ли я runhaskell Fail2
или runhaskell Fail2.hs
не имеет значения.)
GHC 8.6.3
это работает:
stack --resolver lts-13.11 runhaskell Fail2
тогда я компилирую Fail1:
stack --resolver lts-13.11 ghc -- -O2 --make Fail1
тогда оригинальная команда runhaskell зависает при запуске Fail2.
тогда я компилирую Fail2:
stack --resolver lts-13.11 ghc -- -O2 --make Fail2
затем происходит сбой исходной команды 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.