制作小型的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