我已经为我的Main.hs模块实现了一个简单的haskell插件加载器。我现在使用的唯一功能是load
从this site如何在使用Haskell包'插件'时减少二进制占用空间?
查看我编译的应用程序大小,显示x86架构上超过53 MB的可执行文件。我明白GHC的很大一部分是链接的(由于haskell-source-to-binary-plugin特性),但这对我的目的来说是过度的。
是否有一个官方认可的方式来削减额外的功能,只保留(dyn-)load
?
我已经为我的Main.hs模块实现了一个简单的haskell插件加载器。我现在使用的唯一功能是load
从this site如何在使用Haskell包'插件'时减少二进制占用空间?
查看我编译的应用程序大小,显示x86架构上超过53 MB的可执行文件。我明白GHC的很大一部分是链接的(由于haskell-source-to-binary-plugin特性),但这对我的目的来说是过度的。
是否有一个官方认可的方式来削减额外的功能,只保留(dyn-)load
?
取决于“官方认可”的含义。 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,并做了一些非常浅的测试。这里是仓库:
唯一缺少的部分是类型安全的符号访问(通过一个可能配置的机制)。 评论和补丁欢迎。
截至今天,所有返回多态结果的加载例程必须被赋予一个参数,该参数用于通过一些(开放式)标准对加载的符号执行“期望检查”。 – heisenbug 2012-10-05 22:02:16
[用GHC编译成巨大二进制文件的小Haskell程序可能出现重复](http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary) – 2012-07-10 08:46:11
@ DanielWagner - 创建一个'-dynamic'应用程序仍然会引用巨大的共享库,所以部署问题不会改变。 – heisenbug 2012-09-21 19:26:04