40

小さなhaskell実行可能ファイルを作成する良い方法はありますか?ghc6を使用すると、単純なhello worldプログラムは約370kB(ストリップ前は523kB)になるようです。CのHelloworldは約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 は「obj ファイルごと」にリンクを開始し、バイナリ サイズを大幅に削減しました。サイズから判断すると、すでに新しい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プログラムは、393 KB を削除した後、125 KB を削除して gzip した後、552 KB を使用します。gzip の暗い面はパフォーマンスにあります。最初に実行可能ファイルを解凍する必要があります。

于 2009-06-06T19:22:48.960 に答える
8

あなたはあなたの祝福を数えるべきです(370Kb?Luuuxury):

bash $ sbcl
これは、ANSICommonLispの実装であるSBCL1.0.24です。

*(sb-ext:save-lisp-and-die "my.core")
[バインディングスタックとその他の囲み状態を元に戻す...完了]
[現在のLisp画像を./my.coreに保存します:
..。
終わり]
bash $ du -sh my.core
 25M my.core
bash $

真面目な話ですが、おそらく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 に答える