2012-05-28 4 views
9

के रूप में -with-rtsopts ghc विकल्प का उपयोग करना मैं हास्केल में एक एल्गोरिदम पहेली को हल करने का प्रयास कर रहा हूं, और ऐसा करने के लिए मुझे काफी बड़ी डेटा संरचना की आवश्यकता है। हालांकि समस्या निवारण साइट मैं अपना समाधान प्रस्तुत करता हूं, बड़े स्टैक की अनुमति देने के लिए किसी भी रन टाइम विकल्प का उपयोग नहीं करता है, लेकिन मैंने सुना है कि मैं कंपाइलर विकल्पों को प्रज्ञा के रूप में उपयोग कर सकता हूं। मैं अपने कोड में निम्न pragma का उपयोग कर की कोशिश की है:प्रोजेमा

{-# OPTIONS_GHC -O2 -rtsopts -with-rtsopts=-K32m #-} 

तब मैं ghc --make algo.hs साथ संकलन। हालांकि, जब मैं कुछ बड़े परीक्षणों पर अपनी मशीन पर चलता हूं, तो प्रोग्राम स्टैक ओवरफ़्लो के साथ दुर्घटनाग्रस्त हो जाता है, और रिपोर्ट करता है कि वर्तमान स्टैक आकार 8 एमबी है। दूसरी ओर, जब मैं उस तरह संकलन:

ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp 

कार्यक्रम एक ही डेटा पर बस ठीक काम करता है, किसी भी +RTS तर्क जोड़े बिना। मैं जीएचसी 7.0.2 का उपयोग करता हूं, लेकिन समस्या निवारण साइट 6.12.3 का उपयोग कर रही है, इसलिए अधिमानतः मैं ऐसे समाधान की तलाश में हूं जो उस पुराने संस्करण के साथ भी काम कर सके।

उत्तर

9

याद रखें कि देशी बाइनरी के लगभग किसी भी प्रकार के संकलन कम से कम दो चरणों के होते हैं: वास्तविक वस्तु संकलन (.hs ->.o), और जोड़ने (.o, .a, .lib -> निष्पादन योग्य/.exe/.so/.dll आदि)

आप इस के साथ संकलन जब:

ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp 

... क्या वास्तव में पर्दे के पीछे क्या हो रहा है मूल रूप से है:

# object compilation - creates algo.o 
ghc -c algo.hs -fforce-recomp 
# linking - links together algo.o and libHSsomepackage.a into the "algo" binary 
# (we assume that `algo.hs` included some module from the package `somepackage` 
# e.g. `Data.Package.Some`) 
ghc -rtsopts -with-rtsopts=-K32M -o algo -package somepackage algo.o 

आईई। --make विकल्प परिणाम जोड़ने से पहले ऑब्जेक्ट फ़ाइलों को स्वचालित रूप से संकलित करने के लिए जीएचसी को बताता है, और यह आपके लिए रिक्त स्थान में भर जाता है। ध्यान दें कि अलग-अलग कमांड लाइन झंडे कहाँ समाप्त होते हैं।

जब आप फ़ाइल के शीर्ष पर है कि pragma निर्दिष्ट करते हैं, यह बजाय है क्या (ghc --make algo.hs के साथ) होता है:

ghc -c algo.hs -rtsopts -with-rtsopts=-K32M 
ghc -o algo -package somepackage algo.o 

OPTIONS_GHC pragma विकल्पों के बारे में संकलक जब संकलन बताता जोड़ने के लिए है कि में विशिष्ट मॉड्यूल एक ऑब्जेक्ट फ़ाइल। क्योंकि -rtsoptsलिंकर विकल्प (यह जीएचसी को कमांड लाइन हैंडलिंग सामग्री के एक अलग सेट में लिंक करने के लिए कहता है), आप किसी ऑब्जेक्ट फ़ाइल को संकलित करते समय इसे निर्दिष्ट नहीं कर सकते हैं। लिंक करते समय आपको इसे निर्दिष्ट करना होगा, और ऐसे विकल्पों को मॉड्यूल हेडर में निर्दिष्ट नहीं किया जा सकता है।

  1. उपयोग Cabal क्या GHC इच्छित विकल्पों
  2. अपने एल्गोरिथ्म फिक्स आप के लिए सामान का निर्माण और अपने .cabal फ़ाइल में निर्दिष्ट करने के लिए इतना है कि आप के रूप में ज्यादा ढेर अंतरिक्ष की जरूरत नहीं है:

    दो समाधान कर रहे हैं , उदाहरण के लिए पूंछ रिकर्सन और फ़ोल्डरों में अधिक कठोरता का उपयोग करके। अधिक जानकारी के लिए the wiki देखें।