制作小型的haskell可执行文件?

有没有什么好的方法来制作小型的haskell可执行文件? 用ghc6,一个简单的hello世界程序似乎达到了370kB(523kB之前)。 C中的Hello world约为4kB(带前9kB)。

有了GHC的开发分支(任何人都知道这是哪个版本join?):

$ ghc -o hello hello.hs $ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello $ du hello hello-small 700 hello 476 hello-small 

为dynamic链接的RTS添加-dynamic标志:

 $ ghc -dynamic -o hello hello.hs $ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello $ du hello hello-small 24 hello 16 hello-small 

另见: http : //hackage.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport

与C:

 $ gcc hello.c -o hello $ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello $ du hello hello-small 12 hello 8 hello-small 

GHC是静态链接的一切(除了运行库本身使用的库,它们是dynamic链接的)。

在旧时代,GHC一旦使用了它,就把整个(haskell)库链接起来。 前段时间,GHC开始链接“每个obj文件”,这大大减less了二进制大小。 从尺寸上看,你一定是已经使用了新的GHC了。

从好的方面来说,你已经拥有了许多500K的东西,比如multithreading核心,垃圾收集器等等。

至less将垃圾收集器添加到您的C代码,然后再比较它们:)

您看到的大小是Haskell运行时(libHSrts.a),它被静态链接到每个Haskell可执行文件中。 如果它是一个共享对象,就像librt.o for C,那么你的二进制文件只有几个k(库源文件中分割的.o文件的大小)。

在您的平台上实现libHSrts.a的dynamic链接,您可以通过strip使您的可执行文件更小。

如果你的二进制文件的大小真的很重要,你可以使用gzip压缩工具来压缩 (最好是已经被删除的)可执行文件。 在我的64位Linux机器上,原始的hello世界程序在剥离393 KB之后,剥离和压缩125 KB之后需要552 KB。 gzip的黑暗面在性能上 – 可执行文件必须先解压缩。

你应该数你的祝福(370Kb?Luuuxury):

 bash $ sbcl
这是SBCL 1.0.24,ANSI Common Lisp的一个实现。

 *(sb-ext:save-lisp-and-die“my.core”)
 [撤消绑定堆栈和其他封闭状态...完成]
 [将当前的Lisp图像保存到./my.core:
 ...
做]
 bash $ du -sh my.core 
  25M my.core
庆典$ 

说真的,尽pipe你可能会舍弃haskell的二进制文件,但是与C的比较并不公平。

上次我玩ghc(这可能是过时了),它是静态链接的一切,这将是一个因素。

事情正在改变 – 密切关注这项正在进行的工作。

 strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable 

也试着看看ldd -dr your_executable