2012-07-10 27 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

相關問題