最近我注意到 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,这是我最初的假设。
为什么可执行文件如此庞大?我能做些什么(动态链接除外)?