最近、Haskell の実行可能ファイルがいかに大きいかに気付きました。以下はすべて GHC 7.4.1 と-O2
Linux でコンパイルされたものです。
Hello World (
main = putStrLn "Hello World!"
) は 800 KiB を超えています。それを実行strip
すると、ファイルサイズが 500 KiB に減少します。コンパイルに追加-dynamic
してもあまり役に立たず、約 400 KiB のストリップされた実行可能ファイルが残ります。Parsec を含む非常に原始的な例をコンパイルすると、1.7 MiB のファイルが生成されます。
-- File: test.hs import qualified Text.ParserCombinators.Parsec as P import Data.Either (either) -- Parses a string of type "x y" to the tuple (x,y). testParser :: P.Parser (Char, Char) testParser = do a <- P.anyChar P.char ' ' b <- P.anyChar return (a, b) -- Parse, print result. str = "1 2" main = print $ either (error . show) id . P.parse testParser "" $ str -- Output: ('1','2')
Parsec はより大きなライブラリかもしれませんが、私はそのごく一部しか使用していません。実際、上記によって生成された最適化されたコア コードは、実行可能ファイルよりも劇的に小さくなっています。
$ ghc -O2 -ddump-simpl -fforce-recomp test.hs | wc -c 49190 (bytes)
したがって、最初の想定であった、実際にプログラム内に大量の Parsec が含まれているわけではありません。
実行可能ファイルのサイズが非常に大きいのはなぜですか? それについて何かできることはありますか (動的リンクを除く)?