haskell - 使用 Haskell 包 'plugins' 时如何减少二进制占用?

标签 haskell plugins footprint

我已经为我的 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 可调用的。

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

  • 提供了使用 Haskell 调用约定加载符号
  • 可以声明依赖项和包/模块层次结构
  • 依赖环境以线程安全的方式管理。

  • 原始包由 Hampus Ram 编写。我只为最新发布的 GHC 准备了它,并做了一些非常浅显的测试。这是存储库:

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



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

    关于haskell - 使用 Haskell 包 'plugins' 时如何减少二进制占用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11405275/

    相关文章:

    maven - 如何将Maven插件添加到Grails 2.2应用程序?

    haskell - 让 GHC 产生 "Add With Carry (ADC)"指令

    haskell - 不在范围 : type constructor or class 内

    api - 开发谷歌浏览器插件(没有扩展!)

    asp.net-mvc - 如何在 ASP.net/ASP.net MVC 中开发基于可插拔/可安装模块的应用程序

    Qt::它可以做多小?

    haskell - 使用 State Monad 时了解符号 "<-"吗?

    scala - 比较 Haskell 和 Scala 绑定(bind)/平面图示例

    footprint - 在 Kicad 中创建用于通过板(切割)安装的封装

    r - 确定哪些点位于 R 中不规则形状的数据足迹之外?