Здравствуйте
2015-07-02 11:30 GMT+03:00 Eax Melanhovich <
ma...@eax.me>:
> Всем привет.
>
> Извиняюсь за то, что поднимаю утомивший всех вопрос.
>
> Есть мнение, что самая большая проблема Haskell, которая отпугивает
> новых адептов, заключается в ленивости языка.
Самая большая проблема Haskell, которая отпугивает новых адептов это,
к сожалению, нежелание учиться. /* Ленивость же, это одна из основных
причин выбора Haskell как языка программирования, в этом мире есть
(N-1) неленивых юзабельных языков, (где N это количество юзабельных языков),
и 0 ленивых (кроме hakell). */
> В действительности, вопрос
> формулируется очень просто. "А как мне писать код на Haskell, чтобы
> память из-за ленивости гарантированно не утекала там, где не нужно?" Эта
> проблема особенно актуальна в долгоживущих приложениях, вебе, бекендах и
> так далее.
Писать понимая, что такое ленивость, как она работает, и что такое
правые и левые
свертки, если что-то неожиданное, то задавать вопросы и читать?
Более подпробно и серьёзно ниже.
> Сам я этот вопрос пару лет назад внимательно изучал [1] и лучший ответ,
> который смог найти - нужно помнить, что язык ленивый, плюс осторожно
> тестировать (например, при интеграционном тестировании запускать
> приложение в Docker/Vagrant с лимитом по памяти) плюс там где не хочешь
> ленивости явно использовать строгие поля в данных и тд.
Для тестирования с лимитом по памяти есть хорошая опция рантайма (-M),
которая уставливает ограничения по памяти
-M<size> Sets the maximum heap size (default unlimited) Egs: -M256k -M1G
что убирает необходимость в странных решениях. Ну и в операционных
системах есть механизмы (например, cgroups), которые позволяют сделать
ограничения на используемую память и swap, если Вас интересует
тестирование в такой конфигурации.
Для слежения за работающим проектом можно прикрутить ekg, что является
послезным действием в любом случае, независимо от доверия к программе
и языка на котором пишешь. Если же есть подозрение, что что-то пошло не так,
то после прогона на тестовых данных можно смотреть картинки профиля.
> Можно еще утешить себя тем, что нюансы есть во всех языках. В Си можно выйти за
> границу массива, в Scala можно забить трэдпул футурами по одному
> запросу пользователя, в Erlang могут переполниться очереди сообщений.
>
> Вопрос заключается в следующем - а не нашел ли кто ответ на этот вопрос
> получше? И если у кого-то есть реальные проекты на Haskell (ну мало
> ли), как вы в них делаете?
Только фибоначчи вместо проектов, естественно. В целом у меня достаточно
простые правило (плохо сформулировано, т.к. так и не удалось нормально
обсудить его с теми с тем хотелось):
для data structures использовать строгие поля по умолчанию, если не доказана
необходимость обратного (напр. бесконечные структуры,
структуры поверх которых строятся нексусы (?), затягивание узлов) и ленивые
поля в control structures (т.е. в структурах по которым строится поток
выполнения
программы). Так же брать структуры данных, в которых требуемые свойства
гарантируются построением, напр. если нужнен список строгих структуры, то
логично взять Vector.Unboxed, не путать pinned и unpinned память.
> --
> Вы получили это сообщение, поскольку подписаны на группу Русский Haskell.
>
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
haskell-russi...@googlegroups.com.
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу
haskell...@googlegroups.com.
> Просмотреть это обсуждение в Сети можно по адресу
https://groups.google.com/d/msgid/haskell-russian/20150702113045.11d88fdc%40fujitsu.
> Настройки подписки и доставки писем:
https://groups.google.com/d/optout.
--
Alexander