Программа на Haskell зависает при смешивании скомпилированного и интерпретированного кода - PullRequest
12 голосов
/ 25 мая 2019

Рассмотрим следующие тривиальные модули:

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

(Ух, хорошо. Это действительно не отображает много информации. Я работаю под управлением Windows 7 Pro 64-bit, и я верю я установил 64-битную сборку GHC.)

1 Ответ

4 голосов
/ 25 мая 2019

Это ошибка в GHC, и она была исправлена ​​в GHC 8.6.4.

Я проверил ее с помощью GHC 8.6.3, GHC 8.6.4 и GHC 8.6.5 и последние две версии работают как положено.

Я использовал x64 Windows стек haskell , и я использую 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, или, по крайней мере, обновленнаяe до ghc 8.6.4.

...