जैसा कि दूसरों ने पहले ही बताया है, हास्केल को स्वचालित , गतिशील मेमोरी प्रबंधन की आवश्यकता होती है : स्वचालित मेमोरी प्रबंधन आवश्यक है क्योंकि मैनुअल मेमोरी प्रबंधन असुरक्षित है; गतिशील स्मृति प्रबंधन आवश्यक है क्योंकि कुछ कार्यक्रमों के लिए, किसी वस्तु का जीवनकाल केवल रनटाइम पर निर्धारित किया जा सकता है।
उदाहरण के लिए, निम्नलिखित कार्यक्रम पर विचार करें:
main = loop (Just [1..1000]) where
loop :: Maybe [Int] -> IO ()
loop obj = do
print obj
resp <- getLine
if resp == "clear"
then loop Nothing
else loop obj
इस कार्यक्रम में, [1..1000]उपयोगकर्ता को "स्पष्ट" होने तक सूची को स्मृति में रखा जाना चाहिए; इसलिए इसका जीवनकाल गतिशील रूप से निर्धारित किया जाना चाहिए, और यही कारण है कि गतिशील स्मृति प्रबंधन आवश्यक है।
तो इस अर्थ में, स्वचालित गतिशील मेमोरी आवंटन आवश्यक है, और व्यवहार में इसका मतलब है: हाँ , हास्केल को एक कचरा कलेक्टर की आवश्यकता है, क्योंकि कचरा संग्रह उच्चतम प्रदर्शन वाला स्वचालित गतिशील मेमोरी मैनेजर है।
तथापि...
यद्यपि एक कचरा संग्रहकर्ता आवश्यक है, हम कुछ विशेष मामलों को खोजने की कोशिश कर सकते हैं जहां संकलनकर्ता कचरा संग्रहण की तुलना में एक सस्ती मेमोरी प्रबंधन योजना का उपयोग कर सकते हैं। मसलन, दिया गया
f :: Integer -> Integer
f x = let x2 = x*x in x2*x2
हम कंपाइलर से यह पता लगाने की उम्मीद x2कर सकते हैं कि fरिटर्न होने पर सुरक्षित तरीके से डील हो सकती है (बजाय इसके कि गारबेज कलेक्टर से निपटने के लिए इंतजार किया जाए x2)। अनिवार्य रूप से, हम पूछ रहे हैं कि संकलक संभव से ढेर पर आवंटन के लिए कचरे को एकत्रित ढेर में आवंटन में परिवर्तित करने के लिए एस्केप विश्लेषण करते हैं ।
यह पूछने के लिए बहुत अनुचित नहीं है: जेएचसी हैस्केल कंपाइलर ऐसा करता है, हालांकि जीएचसी नहीं करता है। साइमन मार्लो का कहना है कि जीएचसी का जेनेरिक कचरा कलेक्टर ज्यादातर विश्लेषण को अनावश्यक बनाता है।
jhc वास्तव में क्षेत्र विश्लेषण के रूप में ज्ञात एस्केप विश्लेषण के परिष्कृत रूप का उपयोग करता है । विचार करें
f :: Integer -> (Integer, Integer)
f x = let x2 = x * x in (x2, x2+1)
g :: Integer -> Integer
g x = case f x of (y, z) -> y + z
इस मामले में, एक सरलीकृत एस्केप विश्लेषण यह निष्कर्ष निकालता है कि इससे x2बच जाता है f(क्योंकि यह टपल में वापस आ जाता है), और इसलिए x2इसे कचरा एकत्र ढेर पर आवंटित किया जाना चाहिए। दूसरी ओर, क्षेत्र का अनुमान, यह पता लगाने में सक्षम है कि रिटर्न x2होने पर निपटा जा सकता है g; यहाँ विचार यह है कि क्षेत्र के बजाय 'के क्षेत्र x2में आवंटित किया जाना चाहिए ।gf
हस्केल से परे
जबकि ऊपर की चर्चा के अनुसार कुछ मामलों में क्षेत्र का अनुमान सहायक है, लेकिन यह आलसी मूल्यांकन के साथ प्रभावी ढंग से सामंजस्य स्थापित करने में मुश्किल प्रतीत होता है ( एडवर्ड केमट और साइमन पेटन जोन्स की टिप्पणियों को देखें)। उदाहरण के लिए, विचार करें
f :: Integer -> Integer
f n = product [1..n]
[1..n]स्टैक पर सूची को आवंटित करने और fरिटर्न के बाद उसे निपटाए जाने के लिए किसी को लुभाया जा सकता है , लेकिन यह भयावह होगा: यह fO (1) मेमोरी (कचरा संग्रह के तहत) से O (n) मेमोरी का उपयोग करने से बदल जाएगा ।
1990 के दशक में और 2000 के दशक की शुरुआत में सख्त कार्यात्मक भाषा एमएल के लिए क्षेत्र में व्यापक कार्य किया गया था । मैड्स टोफ़्टे, लार्स बिर्केडल, मार्टिन एल्समैन, नील्स हॉलबर्ग ने क्षेत्र के अनुमान पर अपने काम पर एक बहुत ही पठनीय पूर्वव्यापी लिखा है , जिसमें से अधिकांश उन्होंने MLKit संकलक में एकीकृत किए । उन्होंने विशुद्ध रूप से क्षेत्र-आधारित स्मृति प्रबंधन (अर्थात कोई कचरा संग्रहकर्ता) के साथ-साथ संकर क्षेत्र-आधारित / कचरा-संग्रहित स्मृति प्रबंधन के साथ प्रयोग किया, और बताया कि उनका परीक्षण कार्यक्रम शुद्ध कचरे की तुलना में "10 गुना तेज और 4 गुना धीमा" के बीच चला। एकत्र किए गए संस्करण।