LINUX.ORG.RU

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

 


2

2

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

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

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

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

★★★★★

Ты же понимаешь что ты притащишь еще и хакселевый GC, хаскелевый рантайм и всё вот это. Зачем оно тебе в сишке?

Deleted
()

А вообще хаскельные библиотеки по умолчанию линкуются как раз статически.

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

О, надо будет попробовать

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

За ссылку спасибо!

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

Потом сишка уйдет в чужую среду, где рантаймы еще жирнее, чем хаскельный :)

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

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

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

Честно говоря, понятия не имею. Прозреваю, что если будут две разные либы с RTS, то должно работать. Но я бы протестировал этот момент на твоём месте.

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

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

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

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

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

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

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

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

И тогда будет большой бара-бум!

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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.