制作小型haskell可执行文件?

制作小型haskell可执行文件?,haskell,linker,ghc,static-linking,Haskell,Linker,Ghc,Static Linking,有什么好方法可以制作小型haskell可执行文件吗?使用ghc6,一个简单的hello world程序似乎达到370kB左右(在剥离之前为523kB)。C语言中的Hello world大约为4kB(在剥离之前为9kB)。您应该计算您的祝福(370Kb?Luuuuuury): bash$sbcl 这是SBCL 1.0.24,是ANSI Common Lisp的一个实现。 *(sb分机:保存口齿不清并死掉“我的核心”) [撤消绑定堆栈和其他封闭状态…完成] [将当前Lisp图像保存到./my.cor

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

您应该计算您的祝福(370Kb?Luuuuuury):

bash$sbcl 这是SBCL 1.0.24,是ANSI Common Lisp的一个实现。 *(sb分机:保存口齿不清并死掉“我的核心”) [撤消绑定堆栈和其他封闭状态…完成] [将当前Lisp图像保存到./my.core: ... 完成] bash$du-sh my.core 25米我的核心 bash美元 说真的,虽然您可能会稍微摆脱haskell二进制文件,但与C相比,这实在是不公平的


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

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

在旧时代,GHC会在您使用了整个(haskell)图书馆中的某些内容后立即将其链接起来。不久前,GHC开始链接“每个obj文件”,这大大减少了二进制大小。从尺寸来看,您一定已经在使用较新的GHC了

另一方面,在这500K中已经有很多东西,比如多线程内核、垃圾收集器等

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


还可以查看ldd-dr您的可执行文件

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


除了在您的平台上实现libHSrts.a的动态链接之外,您还可以通过strip使可执行文件变小。

情况正在发生变化-请关注正在进行的工作。

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

与GHC的开发分支一起(有人确切知道添加了哪个版本吗?):

为动态链接的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
另见:

与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

虽然Haskell二进制文件确实包含了很多C二进制文件所没有的东西,但如果不使用它,那么拥有它是毫无意义的。…@liw.fi如果你担心可执行文件的大小,C是唯一适合你的语言。@liw.fi Haskell几乎是关于垃圾收集、多核执行等的定义。因此,事实上,不把所有这些东西都放在核心是没有意义的。或者忽略它(将额外的精力投入到模块化核心中,这样做就可以了)。为什么呢?要保存100K二进制大小?请注意,此答案已过时。见下面Caleb Case的答案。我不知道!这是一个非常有用的技巧,我有一个15MB的可执行文件,在剥离之后降到了7.3MB,但在gzexe之后降到了1.5MB!我发现另一个用来代替gzexe的工具将可执行文件的大小降低到1.2 MB。请使用动态链接,如本文所述,如果出现“也许您还没有安装包'base'的分析库”错误,请使用apt get install ghc dynamic。@ErikAllik您需要命令行工具。您还可以尝试从自制软件安装
binutils
软件包。
$ 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
$ 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
$ 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