2012-07-10 43 views
14

我已经为我的Main.hs模块实现了一个简单的haskell插件加载器。我现在使用的唯一功能是loadthis site如何在使用Haskell包'插件'时减少二进制占用空间?

查看我编译的应用程序大小,显示x86架构上超过53 MB的可执行文件。我明白GHC的很大一部分是链接的(由于haskell-source-to-binary-plugin特性),但这对我的目的来说是过度的。

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

+2

[用GHC编译成巨大二进制文件的小Haskell程序可能出现重复](http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary) – 2012-07-10 08:46:11

+0

@ DanielWagner - 创建一个'-dynamic'应用程序仍然会引用巨大的共享库,所以部署问题不会改变。 – heisenbug 2012-09-21 19:26:04

回答

1

取决于“官方认可”的含义。 plugins(原名为hs-plugins)被设计成一个包含代码生成和动态加载功能的全方位解决方案。它并不瞄准最低限度。

一个不那么复杂的软件包可以在名称direct-plugins下面找到,它主要关注插件的动态加载。该软件包读取Haskell接口(.hi)文件以获取符号的实际类型,因此类型安全性是可能的,但也提供了不安全的变体。不幸的是direct-plugins是bitrotten,与GHC v7.6不工作(a.t.m.)。

在频谱的最低端有​​unix包,它提供了一个类似于dlopen/dlsym的机制来获取从共享库导出的符号。还提供了一个便利层,用于在处理结束后自动关闭打开的库。然而这些符号是以FFI Ptr s的形式获得的,不是Haskell可调用的。

通过搜索互联网,我发现一个废弃的包装,似乎在中间地带进行操作:

哈斯克尔调用约定符号
  • 负载提供
  • 依赖和封装/模块层次结构可以声明
  • 依赖环境以线程安全的方式进行管理。

原始软件包由Hampus Ram撰写。我只准备了最新发布的GHC,并做了一些非常浅的测试。这里是仓库:

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

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

+0

截至今天,所有返回多态结果的加载例程必须被赋予一个参数,该参数用于通过一些(开放式)标准对加载的符号执行“期望检查”。 – heisenbug 2012-10-05 22:02:16