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