ক্রিয়ামূলক প্রোগ্রামিং ভাষার কেন আবর্জনা সংগ্রহের প্রয়োজন?


14

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

সম্পাদনা: এখানে সরানো হয়েছে /programming/39440412/why-do-functional-programming-languages-require-garbage-col લેક્શન


বিড়াল প্রোগ্রামিং ভাষা একটি ফাংশন, স্ট্যাক ভিত্তিক ভাষা একটি উদাহরণ মত দেখায়।
পেটর পুদলিক

1
এই না একটি গবেষণা-স্তরের প্রশ্ন, যেমন গার্বেজ কালেকশন (এটা প্রয়োজনীয়তার পাশাপাশি) ভাষাগুলির প্রোগ্রামিং এর উপর স্নাতকোত্তর কোর্সের মধ্যে আবৃত করা হয়। দয়া করে cs.stackexchange.com
বাউয়ার

আমার ভুল. আপনি কি আমার প্রশ্নের উত্তর জানেন?
নিকোলাস গ্র্যাসেভস্কি

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

2
λ

উত্তর:


16

নিম্নলিখিত ক্রিয়াকলাপের মানগুলি এবং একটি কল-বাই-মূল্য মূল্যায়ন আদেশ উপস্থাপনের জন্য ক্লোজার ব্যবহার করে একটি স্ট্যান্ডার্ড বাস্তবায়ন কৌশল নির্বাচনের উপর ভিত্তি করে নীচের সমস্ত মন্তব্য রয়েছে:

  1. খাঁটি ল্যাম্বদা ক্যালকুলাসের জন্য, আবর্জনা সংগ্রহের প্রয়োজন নেই। এটি হ'ল গাদা করে চক্র গঠন করা সম্ভব নয়: প্রতিটি সদ্য বরাদ্দকৃত মানটিতে পূর্ববর্তী বরাদ্দকৃত মানগুলি কেবলমাত্র রেফারেন্স থাকতে পারে এবং তাই মেমরি গ্রাফ একটি ডিএজি গঠন করে - সুতরাং স্মৃতি পরিচালনার ক্ষেত্রে রেফারেন্স গণনা যথেষ্ট।

  2. বেশিরভাগ বাস্তবায়ন দুটি কারণে রেফারেন্স গণনা ব্যবহার করে না।

    1. তারা পয়েন্টার টাইপের একটি ফর্মকে সমর্থন করে (যেমন, refএমএলে টাইপ কনস্ট্রাক্টর) এবং তাই স্তূপে সত্যিকারের চক্র গঠিত হতে পারে।
    2. যেহেতু আবর্জনা সংগ্রহের তুলনায় রেফারেন্স গণনা অনেক কম দক্ষ
      • রেফারেন্স গণনা রাখতে এটির জন্য প্রচুর অতিরিক্ত স্থান প্রয়োজন, এবং
      • গণনাগুলি আপডেট করা সাধারণত কাজের অপচয় হয় এবং
      • গণনাগুলিতে আপডেটগুলি সমান্তরাল পারফরম্যান্সকে হত্যা করে এমন একটি লেখার বিতর্ক তৈরি করে।
  3. লিনিয়ার-টাইপযুক্ত ভাষাগুলি রেফারেন্স গণনাটি মুছে ফেলতে পারে (মূলত কারণগুলি গণনা 0-1 হয়: হয় মানটির সাথে তার একক রেফারেন্স থাকে অথবা এটি মৃত এবং মুক্ত হতে পারে)।

  4. তবে, স্ট্যাক বরাদ্দ এখনও যথেষ্ট নয় not এটি কারণ ফাংশন মানগুলি গঠন করা সম্ভব যা ফ্রি ভেরিয়েবলগুলি বোঝায় (যেমন, আমাদের ফাংশন ক্লোজারগুলি বাস্তবায়ন করতে হবে), যদি আপনি স্ট্যাকের উপর কিছু বরাদ্দ করেন তবে লাইভ মানগুলি মৃত মানগুলির সাথে আন্তঃবিশ্লেষিত হতে পারে এবং এটি ভুল অ্যাসিপোটিকের কারণ হতে পারে স্থান ব্যবহার।

  5. "স্প্যাগেটি স্ট্যাক" দিয়ে একটি স্ট্যাক প্রতিস্থাপন করে আপনি সঠিক অ্যাসিপটোটিকগুলি পেতে পারেন (অর্থাত, স্তূপে একটি লিঙ্কযুক্ত তালিকা হিসাবে স্ট্যাকটি কার্যকর করুন, যাতে আপনি প্রয়োজন মতো মৃত ফ্রেমগুলি কাটাতে পারেন)।

  6. আপনি যদি সত্যিকারের স্ট্যাক শৃঙ্খলা চান তবে আপনি "অর্ডারযুক্ত যুক্তি" (মূলত রৈখিক ধরণের বিয়োগ বিনিময়) এর ভিত্তিতে টাইপ সিস্টেমগুলি ব্যবহার করতে পারেন।


2
(২) এর আরও মূল কারণ কি নয় - এমনকি পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া ছাড়াই - বাস্তবায়নগুলি (পারস্পরিক) পুনরাবৃত্তির জন্য একটি কার্যকর অপারেটর রাখতে চায়, যা আসলে গাদাতে একটি চক্র গঠন করে?
Andreas রসবার্গ

@ অ্যান্ড্রিআস্রোসবার্গ: আমি এটি উল্লেখ করার বিষয়ে ভেবেছিলাম, তবে যেহেতু আপনি পুনরায় পুনর্বার জন্য y কম্বিনেটরটি ব্যবহার করতে পারবেন তা ছেড়ে দিয়েছি।
নীল কৃষ্ণস্বামী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.