Почему запуск GHCi в Windows не позволяет обнаружить бесконечные циклы? - PullRequest
3 голосов
/ 04 июня 2019

Я сейчас читаю «Программирование на Haskell с первых принципов», и в разделе есть параграф о bottom , который гласит:

Давайте рассмотрим несколько способов достижения дна в наших программах:

Prelude> let x = x in x

*** Исключение: << loop >>

Здесь GHCi обнаружил, что x = x в x никогда не вернется, и замкнул бесконечный вычисление. Это пример дна, потому что он никогда не собирался вернуть результат. Обратите внимание, что если вы используете компьютер с Windows, это пример может заморозить ваш GHCi и не выдавать исключение.

У меня вопрос: есть ли что-то присущее Windows, которое делает невозможным или трудным обнаружить этот цикл, или это просто специфично для реализации GHC (i)?

1 Ответ

7 голосов
/ 04 июня 2019

Комментарий кажется устаревшим.Я могу подтвердить, что в GHCi 8.6.4 в Linux ввод этого кода в интерактивном режиме просто зависает.

Более того, если вы возьмете программу:

main = let x = x in x

и скомпилируете ее с GHC 8.6.4 (снова в Linux), затем скомпилируйте без оптимизации, она зависнет, а скомпилируется с -O2он печатает:

Loop: <<loop>>

Кажется, что не имеет никакого значения, скомпилирован ли он с резьбой или нет.

Суть в том, что GHC не дает никаких реальных гарантий относительно того, какие бесконечные циклы могутили может не «поймать», и это может измениться от версии к версии и с различными настройками оптимизации, и в интерактивном, а не в интерактивном коде, и может отличаться от архитектуры к архитектуре.

Нет ничего присущего Windows, котораяпредотвратил бы этот процесс обнаружения, и нет особой причины, по которой версии программ для Windows и Linux будут вести себя по-разному.Если комментарий был точным в какой-то момент, то, вероятно, была небольшая разница в генерации кода под Windows, которая привела к разнице в наблюдаемом поведении.

...