我已經爲我的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