当前位置:  开发笔记 > 编程语言 > 正文

制作小的haskell可执行文件?

如何解决《制作小的haskell可执行文件?》经验,为你挑选了7个好方法。

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



1> 小智..:

有了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



2> ADEpt..:

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

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

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

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


@ liw.fi如果您/您担心可执行文件的大小,C语言是唯一适合您的语言.
请注意,此答案已过期.请参阅下面的Caleb Case的答案.
@ liw.fi Haskell几乎是关于垃圾收集,多核执行等的定义.事实上,在核心中拥有所有这些东西是毫无意义的.或者将其留下(将额外的努力投入模块化核心,可以做到这一点).为了什么?要节省100K的二进制大小?

3> Don Stewart..:

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

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



4> dqd..:

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


不知道这个!这是一个非常有用的提示,我有一个15 MB的可执行文件,在**strip**后降至7.3 MB,但在**gzexe**之后降至1.5 MB!我找到了另一个工具**[upx](http://upx.sourceforge.net/)**用来代替**gzexe**得到的可执行文件低至1.2 MB.

5> simon..:

你应该算上你的祝福(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(这可能已经过时),它静态地链接了所有内容,这将是一个因素.



6> Dan..:
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable

也试着看看ldd -dr your_executable



7> GS - Apologi..:

事情正在发生变化 - 密切关注这项持续的工作.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有