制作小的haskell可执行文件?

时间:2009-03-31 03:32:32

标签: haskell linker ghc static-linking

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

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:21)

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

在旧时代,GHC会在您使用它时立即将整个(haskell)库连接起来。前段时间,GHC开始链接“per obj file”,这大大减少了二进制文件的大小。从尺寸来看,你一定是在使用新的GHC。

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

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

答案 2 :(得分:16)

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

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

答案 3 :(得分:9)

如果您的二进制文件的大小非常重要,您可以使用工具 gzexe 来打包(最好已经剥离)可执行文件和gzip压缩文件。在我的64位Linux机器上,原始的 hello world 程序在剥离393 KB之后,以及在剥离和压缩125 KB之后需要552 KB。 gzipping的较暗的一面是性能 - 必须首先解压缩可执行文件。

答案 4 :(得分:8)

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

bash$ sbcl
This is SBCL 1.0.24, an implementation of ANSI Common Lisp.

* (sb-ext:save-lisp-and-die "my.core")
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into ./my.core:
...
done]
bash$ du -sh my.core 
 25M    my.core
bash$ 

说真的,虽然你可能会稍微改掉一下haskell二进制文件,但这与C的比较真的不太公平。那里还有更多的事情。

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

答案 5 :(得分:6)

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

也尝试查看ldd -dr your_executable

答案 6 :(得分:6)

事情正在发生变化 - 密切关注this正在进行的工作。