• Haskell stg mstg А вот в #2725825 я не прав. Если рассматривать семантику описанную в той самой оригинальной статье, то в принципе все вычисления происходят в бесконечном цикле на уровне одного вложенного вызова и взаимодействия продолжений через глобальные состояния. Просто функции это очень маленькие. Зашёл в замыкание, а там case внутри. Выложил на control-стек альтернативы, вернул в качестве продолжения заход в case-expression и вышел. Зашёл в продолжение, выяснил что это Int, поматчил его с альтернативами на control-стек'е, вернул в качестве продолжения нужную ветку, вышел. Вот только лунный со своим «избегайте функциональных вызовов» от такого охренеет. Непонятно как при таком подходе ghc таки умудряется пробить стек, если в сложившейся ситуации его разумнее всего держать в куче и в виде односвязного списка, например.

Replies (8)

  • @ndtimofeev, в гхц стек в куче :)
  • @qnikst, Ну и какого же дьявола он переполняется?
  • @qnikst, Зато пока шёл, придумал как сделать апдейты замыканий без возни с двумя глобальными стеками и продолжений на каждый чих. Код апдейта всего-то нужно запихнуть в код диспетчеризации. Готов поспорить что в оставшихся сорока страницах статьи мне это обязательно предложат.
  • @ndtimofeev, специально.. в 7.8 возможно изменили поведение.
  • @qnikst, Хм… Изменили на что? И я правильно понимаю что какой-нибудь jhc не обязан спасать задницу автора использовавшего foldl вместо foldl'?
  • @ndtimofeev, да, не обязан и в сегментед стек не обязан. вообще переполнение стека имхо клево, говорит, что с ленивостью все совсем плохо
  • @ndtimofeev, Насколько я помню, он уже с год как не переполняется.
  • @ndtimofeev, Это отладочная фича, якобы чтоб программист обнаруживал зацикливание по простому сообщению о рантайм ошибке, а не по тормозам из-за вытеснения всего в своп. Всегда можно было устанавливать размер стека, но размер по умолчанию был небольшим, с 7.8 по умолчанию устанавливается размер в 80% от памяти.