Eventuali duplicati:
Small Haskell program compiled with GHC into huge binaryPerché i file eseguibili Haskell/GHC sono così grandi in file?
Recentemente ho notato come grandi eseguibili Haskell sono. Tutto sotto è stato compilato su GHC 7.4.1 con -O2
su Linux.
Ciao Mondo (
main = putStrLn "Hello World!"
) è oltre 800 KiB. L'esecuzione distrip
riduce la dimensione del file a 500 KiB; anche aggiungere-dynamic
alla compilation non aiuta molto, lasciandomi un eseguibile spogliato di circa 400 KiB.La compilazione di un esempio molto primitivo che coinvolge Parsec produce un file MiB 1.7.
-- 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 può essere una biblioteca più grande, ma sto usando solo un piccolo sottoinsieme di esso, e in effetti il codice di base ottimizzato generato dal sopra è notevolmente più piccolo del file eseguibile:
$ ghc -O2 -ddump-simpl -fforce-recomp test.hs | wc -c 49190 (bytes)
Pertanto, non è il caso che una quantità enorme di Parsec sia effettivamente trovata nel programma, che era la mia ipotesi iniziale.
Perché gli eseguibili di dimensioni così grandi? C'è qualcosa che posso fare al riguardo (eccetto il collegamento dinamico)?
@DanielWagner L'altra domanda è certamente correlata, ma anche utilizzando le tecniche descritte lì Hello World è ancora enorme. Inoltre: perché il piccolo codice di base, che dovrebbe contenere l'intero programma, diventa così grande quando viene compilato? – David
C'è un sistema runtime piuttosto grande. – augustss
@David: il core non contiene l'intero programma a meno che tutto non sia stato allineato, il che è piuttosto improbabile. Quindi collegherà in Parsec e, a meno che non lo abbiate creato con '-split-objs' (vedi [risposta correlata] (http://stackoverflow.com/a/9198223/98117), dovrà collegarsi in tutto. – hammar