Possible Duplicate:
Small Haskell program compiled with GHC into huge binary
Recently I noticed how large Haskell executables are. Everything below was compiled on GHC 7.4.1 with -O2
on Linux.
Hello World (
main = putStrLn "Hello World!"
) is over 800 KiB. Runningstrip
over it reduces the filesize to 500 KiB; even adding-dynamic
to the compilation doesn't help much, leaving me with a stripped executable around 400 KiB.Compiling a very primitive example involving Parsec yields a 1.7 MiB file.
-- 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 may be a larger library, but I'm only using a tiny subset of it, and indeed the optimized core code generated by the above is dramatically smaller than the executable:
$ ghc -O2 -ddump-simpl -fforce-recomp test.hs | wc -c 49190 (bytes)
Therefore, it's not the case that a huge amount of Parsec is actually found in the program, which was my initial assumption.
Why are the executables of such an enormous size? Is there something I can do about it (except dynamic linking)?