যেমন অন্যরা ইতিমধ্যে চিহ্নিত করেছে, হাস্কেলের জন্য স্বয়ংক্রিয় , গতিশীল মেমরি পরিচালনা প্রয়োজন: স্বয়ংক্রিয় মেমরি পরিচালনা প্রয়োজনীয় কারণ ম্যানুয়াল মেমরি পরিচালনাটি অনিরাপদ; গতিশীল মেমরি পরিচালনা প্রয়োজনীয় কারণ কিছু প্রোগ্রামের জন্য, কোনও অবজেক্টের জীবনকাল কেবল রানটাইমে নির্ধারণ করা যায়।
উদাহরণস্বরূপ, নিম্নলিখিত প্রোগ্রামটি বিবেচনা করুন:
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
সময় নিরাপদে deallocated করা যেতে পারে f
(আবর্জনা সংগ্রহকারীকে অপসারণের অপেক্ষা না করে x2
)। মূলত, আমরা জিজ্ঞাসা করছি যে সংকলকটি যেখানেই সম্ভব সেখানে স্ট্যাকের বরাদ্দগুলিতে আবর্জনা-সংগৃহীত হিপগুলিতে বরাদ্দকে রূপান্তর করতে পালানোর বিশ্লেষণ সম্পাদন করে ।
এটি জিজ্ঞাসা করা খুব অযৌক্তিক নয়: জেএইচসি হ্যাশেল সংকলক এটি করে, যদিও জিএইচসি এটি করে না। সাইমন মার্লো বলেছেন যে জিএইচসির প্রজন্মের জঞ্জাল সংগ্রহকারী পালানোর বিশ্লেষণকে বেশিরভাগ অপ্রয়োজনীয় করে তোলে।
জেএইচসি প্রকৃতপক্ষে অঞ্চল নির্ধারণ হিসাবে পরিচিত পালাবার বিশ্লেষণের একটি পরিশীলিত রূপ ব্যবহার করে । বিবেচনা
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
বরাদ্দ করা উচিত ।g
f
হাস্কেল ছাড়িয়ে
যদিও উপরের আলোচনা হিসাবে অঞ্চলের অনুমান নির্দিষ্ট ক্ষেত্রে সহায়ক, তবে অলস মূল্যায়নের সাথে কার্যকরভাবে পুনর্মিলন করা কঠিন বলে মনে হয় ( এডওয়ার্ড কেমেট এবং সাইমন পাইটন জোন্স'র মন্তব্য দেখুন)। উদাহরণস্বরূপ, বিবেচনা করুন
f :: Integer -> Integer
f n = product [1..n]
কেউ [1..n]
স্ট্যাকের উপরে তালিকা বরাদ্দ করতে এবং প্রেরণের পরে এটিকে হ্রাস করার জন্য প্রলুব্ধ হতে পারে f
তবে এটি বিপর্যয়কর হবে: এটি f
ও (1) মেমরি (আবর্জনা সংগ্রহের অধীনে) ও (এন) স্মৃতিতে ব্যবহার করে পরিবর্তিত হবে ।
১৯৯০ এর দশকে এবং ২০০০ এর গোড়ার দিকে কঠোর কার্যকরী ভাষা এমএল-এর অঞ্চলের অনুক্রম সম্পর্কে ব্যাপক কাজ করা হয়েছিল । Mads Tofte, লার্স Birkedal, মার্টিন Elsman, নিল্স Hallenberg বেশ পাঠযোগ্য লিখেছি ভূতাপেক্ষ অঞ্চল অনুমান উপর তাদের কাজের উপর, যার মধ্যে অনেক তারা একত্রিত MLKit কম্পাইলার । তারা খাঁটি অঞ্চল ভিত্তিক মেমরি পরিচালনা (যেমন কোনও আবর্জনা সংগ্রহকারী নয়) পাশাপাশি হাইব্রিড অঞ্চলভিত্তিক / আবর্জনা-সংগৃহীত মেমরি পরিচালনা নিয়ে পরীক্ষা-নিরীক্ষা করেছেন এবং জানিয়েছেন যে তাদের পরীক্ষার প্রোগ্রামগুলি খাঁটি আবর্জনার চেয়ে 10 গুণ দ্রুত এবং 4 গুণ ধীর "মাঝে চলেছে- সংগৃহীত সংস্করণ।