LINUX.ORG.RU

Создать либу на Haskell

 


0

2

Вопрос возник по языку Haskell. Допустим, у меня есть множество пакетов. Я хочу собрать это все в одну либу (DLL) статически так, чтобы либа не зависела от того, установлена ли среда Haskell на компьютере пользователя или нет. Максимум, что могу себе позволить - это динамическую компоновку с либой Sqlite3. Цель: дергать свою либу из сишного кода.

Интересуют варианты создания такой либы для версий Windows, Linux и макоси. Все системы важны.

Такое кто-нибудь проделывал? Какие есть подводные камни, кроме тех, что описаны в документации GHC? И нет ли подходящего туториала?

Нашел один туториал [https://www.fpcomplete.com/blog/2016/10/static-compilation-with-stack]. А есть ли еще?

★★★★★

Ответ на: комментарий от hateyoufeel

А если я соберу либу как standalone, то есть шанс, что кто-то другой завалит мне всю программу через вызов hs_end? То есть, если кто-то другой тоже захочет притащить хаскельную либу? Или иначе, есть ли гарантия, что хаскелевский RTS будет просто клонироваться, и он будет независим от других либ? Может ли быть сразу несколько клонов хаскелевского RTS в одном системном процессе?

dave ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Да похоже, что на маке режим standalone не поддерживается, т.е. это получается, что RTS будет разделяемым, если правильно понимаю. Нехорошо тогда. Каждый шкет сможет завалить RTS. Хотелось бы ошибиться.

dave ★★★★★ ()
Ответ на: комментарий от dave

Разве? Мне казалось, RTS линкуется в любом случае.

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

hateyoufeel ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Тут другой вариант. Я хотел для питончика пакетик создать, но боюсь, что могут возникнуть проблемы, если кто-то захочет использовать мой пакетик с другим кодом, где тоже внутри будет хаскель... Короче, по-хорошему для такого сценария остается или C++, или Rust. Мне больше нравится второй, да и заготовка уже есть. Увы!

dave ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Хочу поблагодарить за помощь. На винде таки удалось проверить. Я попробовал собрать две либы через «ghc -static -shared ...» уже после кабала. Потом использовал их вместе. Очень похоже, что у меня получились две разные версии RTS, потому что преждевременный вызов hs_end() по второй либе никак не помешал первой либе закончить с задержкой порожденный поток. Это просто здорово! На юниксах пока не смог воспроизвести.

Такого плана был тест:

#include <stdio.h>
#include <unistd.h>

extern void fun1_start();
extern void fun2_start();

extern void fun1_end();
extern void fun2_end();

int main()
{
    fun1_start();
    fun2_start();
    fun2_end(); // вызов hs_end()
    sleep(10);
    fun1_end(); // fun1_start() порождает поток, который отрабатывает полностью с задержкой 5 секунд

    return 0;
}
dave ★★★★★ ()