小さなhaskell実行可能ファイルを作成する良い方法はありますか?ghc6を使用すると、単純なhello worldプログラムは約370kB(ストリップ前は523kB)になるようです。CのHelloworldは約4kB(ストリップ前は9kB)です。
7 に答える
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
GHCはすべてを静的にリンクしています(動的にリンクされているランタイム自体が使用するライブラリを除く)。
昔は、GHC は (haskell) ライブラリ全体を、そこから何かを使用するとすぐにリンクしていました。少し前に、GHC は「obj ファイルごと」にリンクを開始し、バイナリ サイズを大幅に削減しました。サイズから判断すると、すでに新しいGHCを使用していたに違いありません。
プラス面としては、マルチスレッド コア、ガベージ コレクターなど、これらの 500K には既に多くのものがあります。
Cコードに少なくともガベージコレクターを追加してから、それらを再度比較してください:)
表示されているサイズは Haskell ランタイム (libHSrts.a) で、すべての Haskell 実行可能ファイルに静的にリンクされています。C の librt.o のような共有オブジェクトの場合、バイナリはわずか数 k (ライブラリ ソース内の分割された .o ファイルのサイズ) になります。
プラットフォームに libHSrts.a の動的リンクを実装する以外に、strip を使用して実行可能ファイルを小さくすることができます。
バイナリのサイズが本当に重要な場合は、ツールgzexeを使用して、(できれば既に削除された) 実行可能ファイルを gzip 圧縮でパックできます。私の 64 ビット Linux ボックスでは、元のhello worldプログラムは、393 KB を削除した後、125 KB を削除して gzip した後、552 KB を使用します。gzip の暗い面はパフォーマンスにあります。最初に実行可能ファイルを解凍する必要があります。
あなたはあなたの祝福を数えるべきです(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で遊んだとき(そしてこれは時代遅れかもしれません)、それはすべてを静的にリンクしていました。これが要因になります。
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable
ldd -dr your_executable も見てみてください