संभव डुप्लिकेट:
Small Haskell program compiled with GHC into huge binaryफाइलसाइज में हास्केल/जीएचसी निष्पादन योग्य इतने बड़े क्यों हैं?
हाल ही में मैंने देखा है कि कैसे बड़े हास्केल निष्पादनयोग्य हैं। नीचे दी गई सब कुछ जीएचसी 7.4.1 पर लिनक्स पर -O2
के साथ संकलित की गई थी।
हैलो वर्ल्ड (
main = putStrLn "Hello World!"
) 800 से अधिक कीबी है।strip
पर चलने से 500 कीबी तक फाइलसाइज कम हो जाती है; संकलन में-dynamic
भी जोड़ने से मुझे 400 कीबी के चारों ओर एक पट्टी निष्पादन योग्य के साथ छोड़ने में मदद नहीं मिलती है।पारसीक से जुड़े एक बहुत ही प्राचीन उदाहरण को संकलित करना 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 एक बड़ा पुस्तकालय हो सकता है, लेकिन मैं केवल एक छोटे सबसेट का उपयोग कर रहा है, और वास्तव अनुकूलित कोर से ऊपर द्वारा बनाया गया कोड निष्पादन की तुलना में नाटकीय रूप से छोटा होता है:
$ ghc -O2 -ddump-simpl -fforce-recomp test.hs | wc -c 49190 (bytes)
इसलिए, यह मामला नहीं है कि वास्तव में कार्यक्रम में पारसी की एक बड़ी मात्रा वास्तव में पाई जाती है, जो मेरी प्रारंभिक धारणा थी।
ऐसे विशाल आकार के निष्पादन योग्य क्यों हैं? क्या मैं इसके बारे में कुछ कर सकता हूं (गतिशील लिंकिंग को छोड़कर)?
@DanielWagner अन्य प्रश्न निश्चित रूप से संबंधित है, लेकिन यहां वर्णित तकनीकों का उपयोग करके हैलो वर्ल्ड अभी भी विशाल है। इसके अलावा: छोटे कोर कोड, जिसमें पूरे कार्यक्रम को शामिल करना चाहिए, संकलित होने पर इतना बड़ा हो जाता है? – David
एक बड़ी रनटाइम प्रणाली है। – augustss
@ डेविड: कोर में पूरे कार्यक्रम को शामिल नहीं किया जाता है जब तक कि सब कुछ रेखांकित नहीं हो जाता है, जो कि असंभव है। तो यह Parsec में लिंक करने जा रहा है, और जब तक आप इसे '-split-objs' के साथ नहीं बनाते (देखें [संबंधित उत्तर] (http://stackoverflow.com/a/9198223/98117)), इसे लिंक करना होगा यह सब। – hammar