Как уменьшить двоичный размер при использовании плагинов пакета Haskell?

Я применил простой модуль для плагинов haskell для моего модуля Main.hs. Единственная функция, которую я использую сейчас, - это load from этот сайт

Глядя на мой размер скомпилированного приложения, я вижу более чем 53 МБ исполняемого файла в архитектуре x86. Я понимаю, что большие части GHC связаны между собой (из-за функции haskell-source-to-binary-plugin), но это слишком сложно для моих целей.

Есть ли официально санкционированный способ избавиться от дополнительных функций и сохранить (dyn-)load?

Ответы

Ответ 1

Зависит от значения "официально санкционированного". plugins (ранее известный как hs-plugins) был разработан как всеобъемлющее решение с функциями генерации кода и динамической загрузки. Он не нацелен на минимальность.

Менее сложный пакет доступен под названием direct-plugins, который фокусируется на динамической загрузке плагинов. Этот пакет считывает файлы интерфейса Haskell (.hi) для получения фактических типов символов, поэтому возможна безопасность типа, но также предоставляется небезопасный вариант. К сожалению, direct-plugins является битрейтом и не работает (a.t.m.) с GHC v7.6.

В самом нижнем конце спектра есть пакет unix, который предоставляет механизм dlopen/dlsym, чтобы получить символы, которые экспортируются из разделяемых библиотек. Также предусмотрен удобный слой для автоматического закрытия открытых библиотек после завершения обработки с ними. Однако символы получаются как FFI Ptr и не являются Haskell-вызываемыми.

Просматривая интернет, я обнаружил заброшенный пакет, который, кажется, работает на среднем уровне:

  • предоставляется загрузка символов с помощью соглашения о вызовах Haskell
  • зависимости и иерархия пакетов/модулей могут быть объявлены
  • среда зависимостей управляется поточно-безопасным способом.

Оригинальный пакет является автором Hampus Ram. Я только подготовил его для последней выпущенной GHC и провел очень мелкие испытания. Вот репозиторий:

https://github.com/ggreif/dynamic-loader

Единственная недостающая часть - это безопасный доступ к символам (с помощью возможно настраиваемого механизма). Комментарии и исправления приветствуются.