使用Haskell包'插件'时如何减少二进制占用空间?

hei*_*bug 14 plugins haskell footprint

我已经为我的Main.hs模块实现了一个简单的加载器用于haskell插件.我现在使用的唯一功能是load来自这个网站

查看我编译的应用程序大小,向我展示了x86架构上超过53 MB的可执行文件.我知道GHC的大部分内容都是链接的(由于haskell-source-to-binary-plugin功能),但这对我的目的来说太过分了.

是否有官方批准的方式来削减额外的功能,只保留(dyn-)load

hei*_*bug 1

取决于“官方批准”的含义。plugins(以前称为hs-plugins)被设计为一个包罗万象的解决方案,具有代码生成和动态加载功能。它并不以最小化为目标。

一个不太复杂的包名为direct-plugins,它专注于插件的动态加载。该包读取Haskell接口(.hi)文件来获取符号的实际类型,因此类型安全是可能的,但也提供了不安全的变体。不幸的direct-plugins是,它已经烂了,并且不能与 GHC v7.6 一起工作(atm)。

在该范围的最低端,有一个unix包提供了类似dlopen/dlsym的机制来获取从共享库导出的符号。还提供了一个便利层,可以在处理终止后自动关闭打开的库。然而,这些符号是作为 FFI 获得的Ptr,并且不可由 Haskell 调用。

通过搜索互联网,我发现了一个废弃的软件包,它似乎在中间位置运行:

  • 提供使用 Haskell 调用约定加载符号
  • 可以声明依赖关系和包/模块层次结构
  • 依赖环境以线程安全的方式管理。

原始包由 Hampus Ram 编写。我只是为最新发布的 GHC 做了准备,并做了一些非常浅层的测试。这是存储库:

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

唯一缺少的部分是类型安全的符号访问(通过可能的可配置机制)。欢迎评论和补丁。