我已经为我的 Main.hs 模块的 haskell 插件实现了一个简单的加载器。我现在使用的唯一功能load
来自这个网站
查看我编译的应用程序大小,可以看到在 x86 架构上的可执行文件超过 53 MB。我知道 GHC 的大部分是链接的(由于 haskell-source-to-binary-plugin 功能),但这对于我的目的来说是多余的。
是否有官方认可的方式来削减额外的功能并只保留(dyn-)load
?
取决于“官方认可”的含义。plugins
(以前称为hs-plugins
)旨在成为一个包罗万象的解决方案,具有代码生成和动态加载功能。它的目标不是最小化。
名称下提供了一个不太复杂的包direct-plugins
,它专注于插件的动态加载。这个包读取 Haskell 接口 ( .hi
) 文件以获取符号的实际类型,因此类型安全是可能的,但也提供了一个不安全的变体。不幸direct-plugins
的是,它被比特腐烂了,并且不适用于 GHC v7.6(atm)。
在频谱的最低端,有一个unix
包提供了一个类似dlopen
/dlsym
的机制来获取从共享库导出的符号。还提供了一个便利层,用于在处理结束后自动关闭打开的库。然而,这些符号是作为 FFI 获得Ptr
的,并且不是 Haskell 可调用的。
通过搜索互联网,我发现了一个似乎在中间地带运行的废弃包:
原始包由 Hampus Ram 编写。我只为最新发布的 GHC 准备了它,并做了一些非常浅显的测试。这是存储库:
唯一缺少的部分是类型安全的符号访问(通过可能的可配置机制)。欢迎评论和补丁。