14

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

查看我编译的应用程序大小,可以看到在 x86 架构上的可执行文件超过 53 MB。我知道 GHC 的大部分是链接的(由于 haskell-source-to-binary-plugin 功能),但这对于我的目的来说是多余的。

是否有官方认可的方式来削减额外的功能并只保留(dyn-)load

4

1 回答 1

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

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

于 2012-09-21T19:17:47.153 回答