metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-11-04 10:00 pm

Кромешный ад

Рунтайм хаскеля под винду все-таки укуренный какой-то. На каждый вызов hs_init/hs_exit создается поток и больше не убивается, даже после того, как либа с хаскелем выгружается.
Даже если в хаскеле вообще ничего не вызывать - только инициализировать и деинициализировать.
В общем, перспективы интеграции либ на хаскеле в другие приложения весьма смутные, разве что один раз рунтайм создать и закрывать только при выходе. И то - есть ненулевая вероятность, что это все помрет в зависимости от фазы луны. Сейчас вот еще под AppVerifier гляну, как оно себя ведет.

[identity profile] kkirsanov.livejournal.com 2011-11-04 08:29 pm (UTC)(link)
Можно матрешку!
Заэмбедить в приложение Питон, а в питон хаскель.
Потом прибивать питон и смотреть на развалины.

[identity profile] aamonster.livejournal.com 2011-11-04 08:33 pm (UTC)(link)
Ну, может, лет через 10 допилят. Или загнётся.
Вообще есть ощущение, что хаскель - больше не для реальных задач, а для обучения программированию. Правда, каков процент тех, кто для кода на хаскеле оценит время и требуемый объём памяти - я не знаю.

[identity profile] aamonster.livejournal.com 2011-11-04 08:34 pm (UTC)(link)
Суровое решение - запускать хаскельную либу в отдельном процессе. Для полноты картины общаться с ней через npapi (как плагины в браузерах).

[identity profile] metaclass.livejournal.com 2011-11-04 08:53 pm (UTC)(link)
Да, заебатый костыль. Общаться впрочем можно и через перенаправление stdin/stdout, как сейчас иногда запускают старые досовские расчетные проги, от которых алгоритмы давно забыты, авторы умерли или сошли с ума, а считать надо :)

[identity profile] trueblacker.livejournal.com 2011-11-05 02:34 pm (UTC)(link)
одумайтесь, ребе
дальше только героин

[identity profile] blackyblack.livejournal.com 2011-11-05 04:54 pm (UTC)(link)
Правильней через сокеты. А чо, любопытная штука получится.

[identity profile] max630.livejournal.com 2011-11-04 10:15 pm (UTC)(link)
А это вообще предусмотренная авторами хаскеля задача - использовать хаскель как либу? Может, проще целиком программу на хаскеле сделать?

[identity profile] metaclass.livejournal.com 2011-11-04 10:22 pm (UTC)(link)
Да, предусмотренная, в документации несколько разделов на эту тематику.

[identity profile] awson.livejournal.com 2011-11-05 10:08 am (UTC)(link)
А нахера hs_init/hs-exit вызывать больше одного раза? Нет, правда интересно, что это за юзкейс такой, где оно необходимо?

Чудес там никаких нет и в зависимости от фазы луны там ничего не помирает. У меня, по кр. мере, все работало всегда и, насколько можно судить по косвенным признакам, у Аугустссона в Креди-Свиссе тоже все работало, причем это (DLL, сделанные с помощью GHC) у них была едва ли не единственная модель деплоймента приложений на Хаскелле.

Возможно, грабли какие-то были, но если и так, то совершенно типичные и обычные, решил и забыл. Я, например, не помню.

[identity profile] metaclass.livejournal.com 2011-11-05 10:33 am (UTC)(link)
Можно не вызывать, да.

Но сам факт, что это невозможно сделать, не выгружая модуль с рунтаймом, а так же утечка хендлов при этом - это признак того, что там не все хорошо.

У меня нет желания наткнутся на "программа выдает странную ошибку с цифрами" где-нибудь у клиентов, поэтому я заранее прогоняю все мыслимые и немыслимые вариации использования.

Я сейчас уже откопал место, где оно валится с ошибкой, сижу в gdb отлаживаю. По стилю более всего похоже, что при hs_exit забывают обнулить какой-то из глобальных указателей.

[identity profile] awson.livejournal.com 2011-11-05 10:55 am (UTC)(link)
Я совершенно не исключаю, что hs_exit привинтили просто для красоты (для симметрии - раз есть hs_init, сделаем hs_exit) и, типа, на будущее, но это будущее пока так и не наступило, потому что это никому не понадобилось, поэтому я ни в коем случае не стал бы трактовать это как "там не все хорошо".

Непонятно, о чем "утечка хендлов при этом" и "оно валится с ошибкой"? Где это? когда? После hs_exit и нового hs_init? Тогда просто рекомендую забить - время потеряете много, а умнее станете ненамного, если вообще. Лучше всего сделать багрепорт или фичереквест - кто-нибудь и откликнется, возможно, просто прокомментирует. Для чела в теме (Marlow?) это 3 секунды делов, а вам - неделю ковыряться. Просто считайте, что никакого hs_exit нет в природе да и все.

[identity profile] metaclass.livejournal.com 2011-11-05 11:07 am (UTC)(link)
Нет уж, красота или не красота там - если ресурсы аллоцируются, их нужно корректно грохать, особенно если речь идет о базовых вещах типа рунтаймов языков программирования.

Чтобы создать багрепорт, его нужно сформулировать.
Впрочем, нужное место я уже нашел, они там глобальную/tls переменную myTask не очищают при freeTask

[identity profile] awson.livejournal.com 2011-11-05 08:11 pm (UTC)(link)
Если б hs_exit вообще б не существовал, то и вопросов бы не было. Типа, мы такой возможности не представляем - механизмы ОС вам в руки. Они это начали, но бросили, поскольку геморрой есть, а спроса - нет. Главное - это не симптом каких-то бОльших проблем, а просто компромисс в условиях недостатка manpower.

С другой стороны, я сам перфекционист и зачастую убиваю массу времени на какую-нибудь херню, которую в конкретной ситуации можно обойти, но она нарушает некую мировую гармонию. Поэтому я довольно хорошо Вас понимаю.

Однако, нащет багрепортов. Это - наш долг перед комьюнити. Я, например, минимум десяток в разное время зафайлил и все (кроме http://hackage.haskell.org/trac/ghc/ticket/4931, для которого мне так и приходится таскать локальный патч) были пофикшены с благодарностями.