হাস্কেলের কি আবর্জনা সংগ্রহকারী দরকার?


118

আমি কৌতূহল করছি কেন হাস্কেল বাস্তবায়নগুলি একটি জিসি ব্যবহার করে।

খাঁটি ভাষায় জিসি প্রয়োজনীয় হবে এমন কোনও ক্ষেত্রে আমি ভাবতে পারি না। অনুলিপি হ্রাস করার জন্য এটি কি কেবলমাত্র একটি অপ্টিমাইজেশন, বা এটি আসলে প্রয়োজনীয়?

আমি উদাহরণস্বরূপ কোডটি সন্ধান করছি যা কোনও জিসি উপস্থিত না থাকলে ফাঁস হবে।


14
আপনি এই সিরিজ আলোকিত হতে পারে; এটি আবর্জনা কীভাবে উত্পন্ন হয় তা অন্তর্ভুক্ত করে (এবং পরবর্তীকালে সংগ্রহ করা হয়): blog.ezyang.com/2011/04/theaskesll-heap
টম ক্রকেট

5
খাঁটি ভাষায় সর্বত্র রেফারেন্স রয়েছে! কেবল পরিবর্তনযোগ্য রেফারেন্স নয়।
টম ক্রকেট

1
@ পেলোটম পরিবর্তনযোগ্য ডেটা বা অপরিবর্তনীয় রেফারেন্সের জন্য উল্লেখ?
পাব্বি

3
উভয়। উল্লিখিত ডেটাটি যে পরিবর্তনযোগ্য তা এই সত্যটি থেকে অনুসরণ করে যে সমস্ত রেফারেন্স অপরিবর্তনীয়, সমস্তভাবেই নীচে।
টম ক্রকেট

4
আপনি অবশ্যই থামার সমস্যাটির প্রতি আগ্রহী হবেন , কারণ মেমরি বরাদ্দকরণের জন্য এই যুক্তি প্রয়োগ করা কেন বুঝতে পারে যে সাধারণ ক্ষেত্রে কেন অবনমন স্থিরভাবে পূর্বাভাস দেওয়া যায় না । তবে কিছু প্রোগ্রাম রয়েছে যার জন্য অবনতির পূর্বাভাস দেওয়া যেতে পারে ঠিক যেমন এগুলি এমন কিছু প্রোগ্রাম যা আসলে এগুলি চালিত না করেই সমাপ্তি হিসাবে পরিচিত হতে পারে।
পল আর

উত্তর:


218

যেমন অন্যরা ইতিমধ্যে চিহ্নিত করেছে, হাস্কেলের জন্য স্বয়ংক্রিয় , গতিশীল মেমরি পরিচালনা প্রয়োজন: স্বয়ংক্রিয় মেমরি পরিচালনা প্রয়োজনীয় কারণ ম্যানুয়াল মেমরি পরিচালনাটি অনিরাপদ; গতিশীল মেমরি পরিচালনা প্রয়োজনীয় কারণ কিছু প্রোগ্রামের জন্য, কোনও অবজেক্টের জীবনকাল কেবল রানটাইমে নির্ধারণ করা যায়।

উদাহরণস্বরূপ, নিম্নলিখিত প্রোগ্রামটি বিবেচনা করুন:

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বরাদ্দ করা উচিত ।gf

হাস্কেল ছাড়িয়ে

যদিও উপরের আলোচনা হিসাবে অঞ্চলের অনুমান নির্দিষ্ট ক্ষেত্রে সহায়ক, তবে অলস মূল্যায়নের সাথে কার্যকরভাবে পুনর্মিলন করা কঠিন বলে মনে হয় ( এডওয়ার্ড কেমেট এবং সাইমন পাইটন জোন্স'র মন্তব্য দেখুন)। উদাহরণস্বরূপ, বিবেচনা করুন

f :: Integer -> Integer
f n = product [1..n]

কেউ [1..n]স্ট্যাকের উপরে তালিকা বরাদ্দ করতে এবং প্রেরণের পরে এটিকে হ্রাস করার জন্য প্রলুব্ধ হতে পারে fতবে এটি বিপর্যয়কর হবে: এটি fও (1) মেমরি (আবর্জনা সংগ্রহের অধীনে) ও (এন) স্মৃতিতে ব্যবহার করে পরিবর্তিত হবে ।

১৯৯০ এর দশকে এবং ২০০০ এর গোড়ার দিকে কঠোর কার্যকরী ভাষা এমএল-এর অঞ্চলের অনুক্রম সম্পর্কে ব্যাপক কাজ করা হয়েছিল । Mads Tofte, লার্স Birkedal, মার্টিন Elsman, নিল্স Hallenberg বেশ পাঠযোগ্য লিখেছি ভূতাপেক্ষ অঞ্চল অনুমান উপর তাদের কাজের উপর, যার মধ্যে অনেক তারা একত্রিত MLKit কম্পাইলার । তারা খাঁটি অঞ্চল ভিত্তিক মেমরি পরিচালনা (যেমন কোনও আবর্জনা সংগ্রহকারী নয়) পাশাপাশি হাইব্রিড অঞ্চলভিত্তিক / আবর্জনা-সংগৃহীত মেমরি পরিচালনা নিয়ে পরীক্ষা-নিরীক্ষা করেছেন এবং জানিয়েছেন যে তাদের পরীক্ষার প্রোগ্রামগুলি খাঁটি আবর্জনার চেয়ে 10 গুণ দ্রুত এবং 4 গুণ ধীর "মাঝে চলেছে- সংগৃহীত সংস্করণ।


2
হাস্কেল ভাগ করে নেওয়া দরকার? যদি তা না হয় তবে আপনার প্রথম উদাহরণে, আপনি তালিকার একটি অনুলিপি (শ্রদ্ধা Nothing) loopপুরানো ব্যক্তির পুনরাবৃত্তির কলকে পাস করতে পারেন এবং কোনও অজানা জীবনধারণ করতে পারবেন না। অবশ্যই কেউ হাস্কেলকে অ ভাগ করে নেওয়ার বাস্তবায়ন চায় না কারণ এটি বড় ডেটা কাঠামোর জন্য মারাত্মকভাবে ধীর slow
নিমি

3
আমি এই উত্তরটি সত্যিই পছন্দ করি, যদিও আমার প্রথম বিভ্রান্তি প্রথম উদাহরণ দিয়ে। স্পষ্টতই যদি ব্যবহারকারী কখনও "ক্লিয়ার" টাইপ করেন না তবে এটি অসীম মেমরি ব্যবহার করতে পারে (একটি জিসি ছাড়াই), তবে এটি ঠিক ফুটো নয় কারণ মেমরিটি এখনও ট্র্যাক করা হচ্ছে।
পাব্বি

3
সি ++ 11 এর স্মার্ট পয়েন্টারগুলির একটি দুর্দান্ত বাস্তবায়ন রয়েছে। মূলত এটি রেফারেন্স গণনা নিয়োগ করে। আমার ধারণা, হাস্কেল জঞ্জাল সংগ্রহের অনুরূপ কোনও কিছুর পক্ষে কাজ করতে পেরেছিল এবং তাই নির্দোষ হতে পারে।
ইন্ট্রিপিডিস

3
@ ক্রিসনাশ - কাজ করে না। স্মার্ট পয়েন্টারগুলি হুডের নীচে রেফারেন্স গণনা ব্যবহার করে। রেফারেন্স গণনা চক্র সহ ডেটা স্ট্রাকচারের সাথে ডিল করতে পারে না। হাস্কেল চক্র সহ ডেটা স্ট্রাকচার তৈরি করতে পারে।
স্টিফেন সি

3
আমি এই উত্তরটির গতিশীল মেমরির বরাদ্দ অংশের সাথে একমত কিনা তা নিশ্চিত নই। কেবল কারণ প্রোগ্রামটি জানে না যখন কোনও ব্যবহারকারী অস্থায়ীভাবে লুপিং বন্ধ করে দেবে এটি গতিশীল করা উচিত নয়। সংকলক কিছু প্রসঙ্গে বাইরে চলে যাবে কিনা তা দ্বারা নির্ধারিত হয়। হাস্কেলের ক্ষেত্রে, যেখানে এটি ভাষা ব্যাকরণ দ্বারা আনুষ্ঠানিকভাবে সংজ্ঞায়িত করা হয়েছে, জীবন প্রসঙ্গে জানা যায়। যাইহোক, তালিকার এক্সপ্রেশন এবং প্রকারটি ভাষার মধ্যে গতিময়ভাবে তৈরি হওয়ার কারণে স্মৃতিশক্তিটি এখনও গতিশীল হতে পারে।
টিমোথি সোয়ান

27

আসুন একটি তুচ্ছ উদাহরণ গ্রহণ করা যাক। প্রদত্ত এই

f (x, y)

(x, y)কল করার আগে আপনাকে কোথাও এই জুটি বরাদ্দ করতে হবে f। আপনি কখন এই জুটি অবনতি করতে পারেন? তোমার কোন ধারণা নেই. fরিটার্ন করার সময় fএটি বিশিষ্ট হওয়া যায় না , কারণ এই জুটিটি কোনও ডেটা স্ট্রাকচারে রাখে (যেমন, f p = [p]), সুতরাং জোড়ের জীবনকালটি ফিরে আসার চেয়ে বেশি দীর্ঘ হতে পারে f। এখন, বলুন যে এই জুটিকে একটি তালিকায় রাখা হয়েছিল, যে কেউ এই তালিকাকে আলাদা করে নিতে পারলে তারা এই জুটিটি হ্রাস করতে পারে? না, কারণ এই জুটি ভাগ করা হতে পারে (যেমন, let p = (x, y) in (f p, p))। সুতরাং এই জুটিটি কখন হ্রাস করা যায় তা বলা সত্যিই কঠিন।

হাস্কেলের প্রায় সব বরাদ্দের ক্ষেত্রে একই কাজ। এটি বলেছিল, এটির একটি বিশ্লেষণ (অঞ্চল বিশ্লেষণ) থাকতে পারে যা আজীবন এক উচ্চতর আবদ্ধ দেয়। এটি কঠোর ভাষায় যুক্তিসঙ্গতভাবে ভালভাবে কাজ করে তবে অলস ভাষাগুলিতে কম (অলস ভাষাগুলি প্রয়োগের ক্ষেত্রে কঠোর ভাষাগুলির চেয়ে অনেক বেশি রূপান্তর করতে থাকে)।

সুতরাং আমি প্রশ্নটি ঘুরিয়ে দিতে চাই। আপনি কেন ভাবেন যে হাস্কেলের জিসির দরকার নেই। আপনি কীভাবে মেমরি বরাদ্দ করার পরামর্শ দিবেন?


18

আপনার অন্তর্নিহিততা যা বিশুদ্ধতার সাথে কিছু করার আছে এটির কিছুটা সত্য।

হাস্কেল আংশিকভাবে খাঁটি হিসাবে বিবেচিত হয় কারণ ফাংশনগুলির পার্শ্ব প্রতিক্রিয়াগুলি স্বাক্ষর প্রকার হিসাবে গণ্য হয়। সুতরাং যদি কোনও ফাংশনটিতে কোনও কিছু মুদ্রণের পার্শ্ব প্রতিক্রিয়া থাকে, তবে IOতার ফেরতের প্রকারের মধ্যে অবশ্যই একটি কোথাও উপস্থিত থাকতে হবে ।

তবে এমন একটি ফাংশন রয়েছে যা হাস্কেলের সর্বত্র নিখুঁতভাবে ব্যবহৃত হয় এবং যার ধরণের স্বাক্ষরের জন্য কোনও অর্থ হয় না, কোন দিক থেকে এটি একটি পার্শ্ব প্রতিক্রিয়া। যথা এমন ফাংশন যা কিছু ডেটা অনুলিপি করে এবং আপনাকে দুটি সংস্করণ ফিরিয়ে দেয়। ফণা অধীনে এটি অক্ষরে অক্ষরে কাজ করতে পারে, মেমরিতে ডেটা ডুপ্লিকেট করে বা 'কার্যত' aণ বাড়িয়ে যা পরে ফেরত দেওয়া দরকার।

এমনকি আরও নিয়ন্ত্রিত ধরণের সিস্টেম (খাঁটি "লিনিয়ার" বিষয়গুলি) দিয়ে অনুলিপি ডিজাইন করা সম্ভব যা কপির ফাংশনটিকে অস্বীকার করে। এই জাতীয় ভাষার কোনও প্রোগ্রামারের দৃষ্টিকোণ থেকে হাস্কেলকে কিছুটা অপবিত্র দেখায়।

আসলে, হাস্কেলের এক আত্মীয় ক্লিনের রৈখিক (আরও কঠোরভাবে: অনন্য) প্রকার রয়েছে এবং এটি অনুলিপিটি বর্জন করার মতো কী হবে তা সম্পর্কে কিছু ধারণা দিতে পারে। তবে ক্লিন এখনও "অ-অনন্য" প্রকারের জন্য অনুলিপি করার অনুমতি দেয়।

এই অঞ্চলে প্রচুর গবেষণা রয়েছে এবং আপনি যথেষ্ট পরিমাণে গুগল হলে আপনি খাঁটি লিনিয়ার কোডের উদাহরণগুলি খুঁজে পাবেন যার কোনও আবর্জনা সংগ্রহের প্রয়োজন নেই। আপনি এমন সমস্ত ধরণের সিস্টেম পাবেন যা সংকলকটিতে সংকেত দিতে পারে যে কোনও মেমরিটি কীভাবে কম্পিউটারকে জিসি মুছে ফেলার অনুমতি দেয় memory

একটি ধারণা রয়েছে যার মধ্যে কোয়ান্টাম অ্যালগোরিদমগুলিও সম্পূর্ণরূপে রৈখিক। প্রতিটি অপারেশন বিপরীত এবং তাই কোনও ডেটা তৈরি করা, অনুলিপি করা বা ধ্বংস করা যায় না। (এগুলি স্বাভাবিক গাণিতিক অর্থেও লিনিয়ার))

ফোরথ (বা অন্যান্য স্ট্যাক ভিত্তিক ভাষা) এর সাথে তুলনা করাও আকর্ষণীয় যার স্পষ্ট DUP ক্রিয়াকলাপ রয়েছে যা সদৃশ ঘটলে স্পষ্ট করে দেয়।

এ সম্পর্কে চিন্তাভাবনার আর একটি (আরও বিমূর্ত) উপায় হ'ল হাস্কেল কেবল টাইপড ল্যাম্বডা ক্যালকুলাস থেকে তৈরি যা কার্তেসিয়ান বদ্ধ শ্রেণির তত্ত্বের উপর ভিত্তি করে এবং এই জাতীয় বিভাগগুলি একটি তির্যক ফাংশন দিয়ে সজ্জিত হয় diag :: X -> (X, X)। অন্য শ্রেণির শ্রেণির উপর ভিত্তি করে কোনও ভাষাতে এ জাতীয় কোনও জিনিস থাকতে পারে না।

তবে সাধারণভাবে, সম্পূর্ণরূপে লিনিয়ার প্রোগ্রামিং কার্যকর হওয়া খুব কঠিন, তাই আমরা জিসির জন্য স্থির হয়ে থাকি।


3
যেহেতু আমি এই উত্তরটি লিখেছি জাস্ট প্রোগ্রামিং ভাষাটি জনপ্রিয়তায় খানিকটা বেড়েছে। সুতরাং এটি উল্লেখযোগ্য যে মরিচটিতে অ্যাক্সেস নিয়ন্ত্রণের জন্য মরিচা একটি রৈখিক-ইশ টাইপ সিস্টেম ব্যবহার করে এবং আপনি অনুশীলনে আমি যে ধারণাগুলি উল্লিখিত ধারণাগুলি দেখতে চাই সেগুলি দেখতে একবার নজর রাখা উচিত।
sigfpe

14

হাস্কেলের ক্ষেত্রে প্রয়োগকৃত স্ট্যান্ডার্ড বাস্তবায়ন কৌশলগুলির জন্য অন্যান্য বেশিরভাগ ভাষার তুলনায় প্রকৃতপক্ষে একটি জিসি প্রয়োজন, কারণ তারা আগের মানগুলির পরিবর্তে আগের মানগুলির পরিবর্তে নতুন, পরিবর্তিত মান তৈরি করে না previous যেহেতু এর অর্থ হল প্রোগ্রামটি ক্রমাগত বরাদ্দ করা হয় এবং আরও মেমরি ব্যবহার করে, সময় বাড়ার সাথে সাথে মানগুলির একটি বড় সংখ্যা বাতিল হয়ে যাবে।

এ কারণেই জিএইচসি প্রোগ্রামগুলিতে এ জাতীয় উচ্চ বরাদ্দের পরিসংখ্যান রয়েছে (গিগা বাইট থেকে টেরাবাইটে): তারা ক্রমাগত মেমরি বরাদ্দ করে চলেছে এবং দক্ষ জিসির জন্য এটি কেবল ধন্যবাদ যে তারা সঞ্চালনের আগেই এটি পুনরায় দাবি করে।


2
"এগুলি পূর্বের মানগুলিকে কখনও রূপান্তরিত করে না": আপনি haskell.org/haskellwiki/HaskellImplementorsWorkshop/2011/Takano পরীক্ষা করতে পারেন , এটি একটি পরীক্ষামূলক জিএইচসি সম্প্রসারণ সম্পর্কে যা স্মৃতি পুনরায় ব্যবহার করে।
gfour

11

যদি কোনও ভাষা (যে কোনও ভাষা) আপনাকে গতিশীলভাবে বস্তুগুলি বরাদ্দ করতে দেয় তবে মেমরির পরিচালনার জন্য তিনটি ব্যবহারিক উপায় রয়েছে:

  1. ভাষা আপনাকে কেবল স্ট্যাকে বা শুরুতে মেমরি বরাদ্দ করতে দেয়। কিন্তু এই বিধিনিষেধগুলি কোনও প্রোগ্রাম সম্পাদন করতে পারে এমন ধরণের গণনাকে মারাত্মকভাবে সীমাবদ্ধ করে। (অনুশীলনে। তত্ত্ব অনুসারে, আপনি একটি বড় অ্যারেতে ফোর্টরানকে উপস্থাপন করে গতিশীল ডেটা স্ট্রাকচারগুলি অনুকরণ করতে পারেন It এটি হররিয়াল ... এবং এই আলোচনার সাথে প্রাসঙ্গিক নয়))

  2. ভাষা একটি স্পষ্ট freeবা disposeপ্রক্রিয়া সরবরাহ করতে পারে। তবে এটি ঠিক করার জন্য এটি প্রোগ্রামারের উপর নির্ভর করে। স্টোরেজ পরিচালনায় যে কোনও ভুলের ফলে মেমরি ফাঁস হতে পারে ... বা আরও খারাপ হতে পারে।

  3. ভাষা (বা আরও কঠোরভাবে, ভাষা বাস্তবায়ন) গতিশীল বরাদ্দ স্টোরেজের জন্য একটি স্বয়ংক্রিয় স্টোরেজ ম্যানেজার সরবরাহ করতে পারে; অর্থ আবর্জনা সংগ্রহকারী কিছু ফর্ম।

কেবলমাত্র অন্য বিকল্পটি কখনই গতিযুক্ত বরাদ্দকৃত সঞ্চয়স্থান পুনরায় দাবি করা নয়। এটি ক্ষুদ্র গণনা সম্পাদনকারী ছোট প্রোগ্রামগুলি বাদ দিয়ে কোনও ব্যবহারিক সমাধান নয়।

হাস্কেলের কাছে এটি প্রয়োগ করে, ভাষার 1 টির সীমাবদ্ধতা থাকে না, এবং 2 অনুযায়ী কোনও ম্যানুয়াল ডিএলোকেশন অপারেশন নেই, সুতরাং, অপ্রয়োজনীয় জিনিসগুলির জন্য ব্যবহারযোগ্য হওয়ার জন্য, একটি হাস্কেল বাস্তবায়নের একটি আবর্জনা সংগ্রহকারীকে অন্তর্ভুক্ত করা দরকার ।

খাঁটি ভাষায় জিসি প্রয়োজনীয় হবে এমন কোনও ক্ষেত্রে আমি ভাবতে পারি না।

সম্ভবত আপনি একটি শুদ্ধ কার্যকরী ভাষা বোঝায়।

উত্তরটি হ'ল ভাষাটি তৈরি করা উচিত হিপ অবজেক্টগুলির পুনরায় দাবি করার জন্য হুডের নীচে একটি জিসি প্রয়োজন। উদাহরণ স্বরূপ.

  • একটি খাঁটি ফাংশনটির জন্য হ্যাপ অবজেক্ট তৈরি করা দরকার কারণ কিছু ক্ষেত্রে এটি তাদের ফিরিয়ে দিতে হয়। এর অর্থ হ'ল এগুলি স্ট্যাকের জন্য বরাদ্দ দেওয়া যায় না।

  • চক্র থাকতে পারে (এই let recউদাহরণস্বরূপ ফলে ) এর অর্থ হ'ল একটি রেফারেন্স গণনা পদ্ধতির হিপ অবজেক্টগুলির জন্য কাজ করবে না।

  • তারপরে ফাংশন বন্ধ রয়েছে ... যা স্ট্যাকের জন্য বরাদ্দও করা যায় না কারণ তাদের একটি আজীবন যা (সাধারণত) তারা তৈরি করা হয়েছিল সেই স্ট্যাক ফ্রেমের চেয়ে স্বতন্ত্র।

আমি উদাহরণস্বরূপ কোডটি সন্ধান করছি যা কোনও জিসি উপস্থিত না থাকলে ফাঁস হবে।

ক্লোজার বা গ্রাফ-আকারের ডেটা স্ট্রাকচারের সাথে জড়িত কোনও উদাহরণের মধ্যে এই শর্তগুলি ফাঁস হবে।


2
আপনি কেন আপনার বিকল্পগুলির তালিকাটি সম্পূর্ণরূপে ভাবেন? অবজেক্টিভ সি-তে এআরসি, এমএলকিট এবং ডিডিসিতে অঞ্চলের অনুক্রম, বুধে সংকলন-সময় আবর্জনা সংগ্রহ - তারা সকলেই এই তালিকার সাথে খাপ খায় না।
ডি সোম

@ ডিমন - এগুলি সমস্ত একটি বিভাগের সাথে খাপ খায়। আপনি যদি ভাবেন যে তারা তা করেন না কারণ আপনি বিভাগের সীমানা খুব শক্ত করে আঁকছেন। আমি যখন "আবর্জনা সংগ্রহের কিছু ফর্ম" বলি, তখন আমার অর্থ এমন কোনও প্রক্রিয়া যার মধ্যে স্টোরেজটি স্বয়ংক্রিয়ভাবে পুনরায় দাবি করা হয়।
স্টিফেন সি

1
সি ++ 11 স্মার্ট পয়েন্টার ব্যবহার করে। মূলত এটি রেফারেন্স গণনা নিয়োগ করে। এটি নির্বিচারক এবং স্বয়ংক্রিয়। আমি হাস্কেলের এই প্রয়োগটি ব্যবহার করে দেখতে দেখতে পছন্দ করব।
ইন্ট্রিপিডিস

2
@ ক্রিসনাশ - ১) এটি কাজ করবে না। চক্র থাকলে রেফারেন্স গণনা-বেস পুনঃনির্ধারণের তথ্য ফাঁস হয় ... যদি না আপনি চক্রটি ভাঙার জন্য অ্যাপ্লিকেশন কোডের উপর নির্ভর করতে পারেন। ২) এটি আধুনিক (বাস্তব) আবর্জনা সংগ্রাহকের সাথে তুলনা করলে রেফারেন্স গণনাটি খারাপভাবে সম্পাদন করে (এই বিষয়গুলি অধ্যয়নকারী লোকদের কাছে) এটি সুপরিচিত।
স্টিফেন সি

@ ডিমন - এ ছাড়াও কেন অঞ্চলের অনুমিতি হাস্কেলের সাথে ব্যবহারিক হবে না সে সম্পর্কে রাইনারপের উত্তর দেখুন।
স্টিফেন সি

8

কোনও আবর্জনা সংগ্রহকারী কখনই প্রয়োজন হয় না, যদি আপনার পর্যাপ্ত স্মৃতি থাকে। যাইহোক, বাস্তবে, আমাদের অসীম স্মৃতি নেই এবং তাই আমাদের স্মৃতি পুনরায় দাবি করার জন্য এমন কিছু পদ্ধতি প্রয়োজন যা এর আর প্রয়োজন নেই। সি এর মতো অপরিষ্কার ভাষায় আপনি স্পষ্ট করে বলতে পারেন যে এটিকে মুক্ত করার জন্য আপনি কিছু মেমোরি দিয়ে কাজ করেছেন - তবে এটি একটি মিউটেশন অপারেশন (আপনি যে স্মৃতি সবে মুক্তি পেয়েছেন তা আর পড়তে নিরাপদ নয়), সুতরাং আপনি এই পদ্ধতির ব্যবহার করতে পারবেন না একটি খাঁটি ভাষা। সুতরাং এটি কোনওভাবে স্ট্যাটিক্যালি বিশ্লেষণ করে যেখানে আপনি মেমরিটি মুক্ত করতে পারেন (সাধারণ ক্ষেত্রে সম্ভবত অসম্ভব), চালনার মতো মেমরি ফাঁস করে (আপনার রান আউট হওয়া পর্যন্ত দুর্দান্ত কাজ করে), বা একটি জিসি ব্যবহার করুন।


এটির জেসি সাধারণভাবে কেন অপ্রয়োজনীয় তা উত্তর দেয় তবে আমি বিশেষত হাস্কেলের প্রতি বেশি আগ্রহী।
পাব্বি

10
যদি কোনও জিসি তাত্ত্বিকভাবে সাধারণভাবে অপ্রয়োজনীয় হয়, তবে এটি তুচ্ছভাবে অনুসরণ করে যে এটি তাত্ত্বিকভাবে হাস্কেলের পক্ষেও অপ্রয়োজনীয়।
এহির্ড

@ehird আমি বলতে চাই প্রয়োজনীয় , আমি মনে করি আমার বানান পরীক্ষক অর্থ ফ্লিপ।
পাব্বি

1
এহির্ড মন্তব্যটি এখনও ধরে রেখেছে :-)
পল আর

2

খাঁটি এফপি ভাষায় জিসির "অবশ্যই" থাকতে হবে। কেন? অপারেশন বরাদ্দ এবং বিনামূল্যে অপরিষ্কার! এবং দ্বিতীয় কারণটি হ'ল, অপরিবর্তনীয় পুনরাবৃত্তির উপাত্ত কাঠামোর অস্তিত্বের জন্য জিসি দরকার কারণ ব্যাকলিংকটি মানুষের মনের জন্য অগাধ এবং অনিচ্ছাকৃত কাঠামো তৈরি করে। অবশ্যই, ব্যাকলিংক আশীর্বাদ, কারণ কাঠামোগুলি যা এটি ব্যবহার করে তা অনুলিপি করা খুব সস্তা।

যাইহোক, আপনি যদি আমাকে বিশ্বাস না করেন তবে কেবল এফপি ভাষা প্রয়োগের চেষ্টা করুন এবং আপনি দেখতে পাবেন যে আমি ঠিক আছি।

সম্পাদনা: আমি ভুলে গেছি অলসতা হ'ল জিসি ছাড়াই EL বিশ্বাস করবেন না? জিসি ছাড়া এটি চেষ্টা করুন, উদাহরণস্বরূপ, সি ++। আপনি দেখতে পাবেন ... জিনিস


1

হাস্কেল একটি অ-কঠোর প্রোগ্রামিং ভাষা, তবে বেশিরভাগ বাস্তবায়ন অ-কঠোরতা বাস্তবায়নের জন্য কল-বাই-প্রয়োজন (অলসতা) ব্যবহার করে। কল-বাই-প্রয়োজনে আপনি কেবল স্টাফগুলি মূল্যায়ন করুন যখন এটি "থঙ্কস" এর যন্ত্রপাতি ব্যবহার করে রানটাইম চলাকালীন পৌঁছে যায় (যে অভিব্যক্তিগুলি যাচাইয়ের জন্য অপেক্ষা করে এবং তারপরে সেগুলি নিজের ওভাররাইট করে, প্রয়োজনের সময় তাদের মানটি পুনরায় ব্যবহার করার জন্য দৃশ্যমান থাকে)।

সুতরাং, আপনি যদি থান ব্যবহার করে অলসভাবে আপনার ভাষা প্রয়োগ করেন তবে আপনি শেষ মুহুর্ত অবধি অবজেক্টের জীবনকাল সম্পর্কে সমস্ত যুক্তিকে পিছনে ফেলেছেন যা রানটাইম time যেহেতু আপনি এখন জীবনকাল সম্পর্কে কিছুই জানেন না, কেবলমাত্র আপনি যুক্তিসঙ্গতভাবে করতে পারেন জঞ্জাল সংগ্রহ ...


1
কিছু ক্ষেত্রে স্থির বিশ্লেষণ those থঙ্কস কোডটিতে সন্নিবেশ করতে পারে যা থঙ্কটি মূল্যায়নের পরে কিছু ডেটা মুক্ত করে। ডালোকেশন রানটাইমের সময় ঘটবে তবে এটি জিসি নয়। এটি সি ++ তে রেফারেন্স গণনা স্মার্ট পয়েন্টার ধারণার অনুরূপ। অবজেক্ট লাইফটাইম সম্পর্কে যুক্তি সেখানে রানটাইমগুলিতে ঘটে তবে কোনও জিসি ব্যবহৃত হয় না।
ডি সোম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.