Duplicar posible:
Small Haskell program compiled with GHC into huge binary¿Por qué los archivos ejecutables de Haskell/GHC son tan grandes en tamaño de archivo?
Hace poco se dio cuenta de lo grande que son ejecutables Haskell. Todo a continuación fue compilado en GHC 7.4.1 con -O2
en Linux.
Hello World (
main = putStrLn "Hello World!"
) es más de 800 KiB. Al ejecutarstrip
, se reduce el tamaño del archivo a 500 KiB; incluso agregar-dynamic
a la compilación no ayuda mucho, dejándome con un ejecutable eliminado alrededor de 400 KiB.La compilación de un ejemplo muy primitivo que involucra a Parsec arroja un archivo de 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 puede ser una biblioteca grande, pero yo sólo estoy usando un pequeño subconjunto de la misma, y de hecho el código del núcleo optimizado generado por el anterior es drásticamente menor que el ejecutable:
$ ghc -O2 -ddump-simpl -fforce-recomp test.hs | wc -c 49190 (bytes)
Por lo tanto, no es el caso que una gran cantidad de Parsec se encuentre realmente en el programa, que fue mi suposición inicial.
¿Por qué los ejecutables son de un tamaño tan enorme? ¿Hay algo que pueda hacer al respecto (excepto el enlace dinámico)?
@DanielWagner La otra pregunta está ciertamente relacionada, pero incluso utilizando las técnicas descritas, Hello World sigue siendo enorme. Además, ¿por qué el código de núcleo pequeño, que debería contener todo el programa, se vuelve tan grande cuando se compila? – David
Hay un sistema de tiempo de ejecución bastante grande. – augustss
@David: el núcleo no contiene todo el programa a menos que todo esté en línea, lo que es bastante improbable. Por lo tanto, va a vincularse en Parsec, y a menos que haya compilado eso con '-split-objs' (consulte [respuesta relacionada] (http://stackoverflow.com/a/9198223/98117)), tendrá que enlazar en todo ello. – hammar