40

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

4

7 回答 7

45

使用 GHC 的开发分支(有人确切知道这是在哪个版本中添加的吗?):

$ 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

为动态链接的 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
于 2010-06-23T02:17:44.627 回答
21

GHC 静态链接所有内容(运行时本身使用的库除外,它们是动态链接的)。

在旧时代,一旦你使用了其中的某些东西,GHC 就会将整个(haskell)库链接起来。前段时间,GHC 开始链接“per obj file”,大大减少了二进制文件的大小。从尺寸来看,您一定已经在使用较新的 GHC 了。

从好的方面来说,你已经在这 500K 中拥有了很多东西,比如多线程内核、垃圾收集器等。

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

于 2009-03-31T08:36:19.990 回答
16

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

如果没有在您的平台上实现 libHSrts.a 的动态链接,您可以通过 strip 使您的可执行文件更小。

于 2009-04-01T06:25:28.173 回答
9

如果你的二进制文件的大小真的很重要,你可以使用工具gzexe,它使用 gzip 压缩打包一个(最好是已经剥离的)可执行文件。在我的 64 位 Linux 机器上,原始的hello world程序占用 552 KB,剥离后占用 393 KB,剥离和 gzip 后占用 125 KB。gzipping 的阴暗面在于性能——必须首先解压缩可执行文件。

于 2009-06-06T19:22:48.960 回答
8

你应该数一数你的祝福(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
重击$

说真的,虽然您可能会稍微摆脱一下 haskell 二进制文件,但与 C 相比,这确实不是一个公平的比较。那里还有更多事情要做。

上次我玩 ghc(这可能已经过时)时,它静态链接了所有内容,这将是一个因素。

于 2009-03-31T03:42:05.033 回答
6
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable

也尝试查看 ldd -dr your_executable

于 2009-04-01T04:42:50.073 回答
6

事情正在发生变化——密切关注这项正在进行的工作。

于 2009-04-29T15:49:44.263 回答