Возможный дубликат:
Небольшая программа Haskell, скомпилированная с GHC в огромные бинарные файлы
Недавно я заметил, насколько велики исполняемые файлы 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 действительно найдено в программе, что было моим первоначальным допущением.
Почему исполняемые файлы такого огромного размера? Что-то я могу с этим сделать (кроме динамической компоновки)?