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