সমস্ত কার্যকরী ভাষা কি আবর্জনা সংগ্রহ ব্যবহার করে?


32

এমন কোনও কার্যকরী ভাষা রয়েছে যা সুযোগের শেষে স্ট্যাক শব্দার্থবিজ্ঞান - স্বয়ংক্রিয় নিরঙ্কুশ ধ্বংসকে ব্যবহার করতে দেয়?


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

আমি প্রশ্নটির প্রসঙ্গে আগ্রহী, উটাহারের সাথে কী করতে পেল?
ম্যাটঞ্জ

1
আবর্জনা সংগ্রহ ছাড়াই একটি কার্যকরী ভাষায়, আমি দেখতে পাচ্ছি না যে অপরিবর্তনীয় ডেটা কাঠামোর কাঠামোগত অংশীকরণ কীভাবে সম্ভব। এ জাতীয় ভাষা তৈরি করা সম্ভব হতে পারে তবে আমি এটি ব্যবহার করব না not
ড্যান_ওয়াটারওয়ার্থ

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

উত্তর:


10

আমি জানি না, যদিও আমি কোনও কার্যনির্বাহী প্রোগ্রামিং বিশেষজ্ঞ নই।

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

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

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

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

এই বিশেষ ক্রিয়াকলাপগুলির মধ্যে অনেকের নাল "শেষ-ট্যাগ" পদক্ষেপ থাকবে এবং কিছু সাধারণ মনাদিক ক্রিয়াকলাপের সাথে "শুরু-ট্যাগ" পদক্ষেপের সমতুল্য হবে। কিছু কিছু পরিবর্তনশীল ঘোষণার প্রতিনিধিত্ব করবে। এগুলি সূচনা-ট্যাগ সহ নির্মাতা এবং শেষ-ট্যাগ সহ ধ্বংসকারীকে উপস্থাপন করবে। সুতরাং আপনি কিছু পেতে ...

act = terminate ((def-var "hello" ) >>>= \h ->
                 (def-var " world") >>>= \w ->
                 (use-val ((get h) ++ (get w)))
                )

নিম্নলিখিত সম্পাদন আদেশের সাথে একটি monadic রচনাতে অনুবাদ করা, প্রতিটি ট্যাগ (উপাদান নয়) একটি সাধারণ monadic ক্রিয়া হয়ে উঠছে ...

<def-var val="hello">  --  construction
  <def-var val=" world>  --  construction
    <use-val ...>
      <terminator/>
    </use-val>  --  do nothing
  </def-val>  --  destruction
</def-val>  --  destruction

এর মতো বিধিগুলি C ++ - শৈলী RAII প্রয়োগ করার অনুমতি দিতে পারে। আইওরিফের মতো রেফারেন্সগুলি তাদের স্কোপ থেকে বাঁচতে পারে না, কারণ সাধারণ আইওরিফরা কেন মোনাদ থেকে বাঁচতে পারে না - একইভাবে এসোসিয়েটিভ রচনার নিয়মগুলি রেফারেন্সকে পালানোর কোনও উপায় দেয় না।

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

সুতরাং, নির্মাণ যেমন একটি ফাইল খুলতে পারে যা ধ্বংস বন্ধ হয়ে যায়। নির্মাণ একটি সকেট খুলতে পারে যা ধ্বংস বন্ধ হয়ে যায়। মূলত, সি ++ এর মতো ভেরিয়েবলগুলি রিসোর্স ম্যানেজারে পরিণত হয়। তবে সি ++ এর বিপরীতে কোনও হ্যাপ-বরাদ্দকৃত বস্তু নেই যা স্বয়ংক্রিয়ভাবে ধ্বংস হতে পারে না।

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

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


সমস্ত কার্যকরী ভাষায় কেন জিসি প্রয়োজনীয় তা আমি দেখতে ব্যর্থ হয়েছি । আপনার যদি সি ++ স্টাইলের RAII কাঠামো থাকে তবে সংকলক সেই প্রক্রিয়াটিও ব্যবহার করতে পারে। ভাগ করা মানগুলি RAII ফ্রেমওয়ার্কগুলির জন্য কোনও সমস্যা নয় (দেখুন সি ++ এর shared_ptr<>), আপনি এখনও নিরস্তক ধ্বংস অবধি রাখেন । আরআইআইয়ের জন্য যে জিনিসটি মুশকিল তা হ'ল চক্রীয় রেফারেন্স; মালিকানা গ্রাফ যদি একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ হয় তবে RAII পরিষ্কারভাবে কাজ করে।
এমসাল্টার্স

বিষয়টি হ'ল, কার্যকরী প্রোগ্রামিং স্টাইলটি প্রায় বন্ধ / ল্যাম্বডাস / বেনাম ফাংশনগুলির চারপাশে নির্মিত is জিসি ছাড়া আপনার ক্লোজারগুলি ব্যবহার করার মতো স্বাধীনতা আপনার নেই, সুতরাং আপনার ভাষা উল্লেখযোগ্যভাবে কম কার্যক্ষম হয়ে উঠবে।
আসন্ন ঝড়

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

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

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

3

আপনি যদি সি ++ কে একটি কার্যকরী ভাষা হিসাবে বিবেচনা করেন (এটিতে ল্যাম্বডাস রয়েছে) তবে এটি কোনও ভাষার উদাহরণ যা কোনও আবর্জনা সংগ্রহ ব্যবহার করে না।


8
আপনি যদি সি ++ কে একটি কার্যকরী ভাষা হিসাবে বিবেচনা না করেন (আইএমএইচও এটি নয়, যদিও আপনি এটির সাথে একটি কার্যকরী প্রোগ্রাম লিখতে পারেন, আপনি এটির সাথে কিছু অতি-অ-ফাংশনাল (ক্রিয়াকলাপ ....) প্রোগ্রামও লিখতে পারেন)
mattnz

@mattnz তারপরে আমি অনুমান করি উত্তরটি কার্যকর হয় না। আমি নিশ্চিত কি (যেমন উদাহরণ haskel জন্য) অন্যান্য ভাষায় ঘটবে নই
BЈовић

9
সি ++ বলা কার্যকরী বলতে পার্ল হ'ল পার্স অবজেক্ট-ওরিয়েন্টেড ...
ডায়নামিক

কমপক্ষে সি ++ সংকলকগুলি পার্শ্ব প্রতিক্রিয়াগুলি পরীক্ষা করতে পারে। (
কনস্টের

@ টিপি 1 - (1) আমি আশা করি এটি কার ভাষা সবচেয়ে ভাল তা নিয়ে পুনরায় প্রতিক্রিয়া ঘটবে না এবং (২) এটি সত্য নয়। প্রথমত, সত্যিকারের গুরুত্বপূর্ণ প্রভাবগুলি বেশিরভাগ আই / ও are দ্বিতীয়ত, এমনকি পরিবর্তনীয় মেমরির প্রভাবের জন্যও কনস্ট তাদের ব্লক করে না। এমনকি যদি আপনি ধরে নেন যে টাইপ সিস্টেমটি (সাধারণত সি ++ এর ক্ষেত্রে যুক্তিসঙ্গত) নষ্ট করার কোনও সম্ভাবনা নেই, তবে এখানে যৌক্তিক দৃ const়তা এবং "পরিবর্তনীয়" সি ++ কীওয়ার্ডের সমস্যা রয়েছে। মূলত, আপনার এখনও কনস্ট্যান্ট সত্ত্বেও মিউটেশন থাকতে পারে। আপনি ফলাফলটি এখনও "যৌক্তিকভাবে" একই, তবে অগত্যা একই শ্রদ্ধা নয় তা নিশ্চিত করার আশা করা হচ্ছে।
স্টিভ 314

2

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

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


1
আইএমও রেফারেন্স গণনা হ'ল আবর্জনা সংগ্রহ, এবং একটি গাদা থাকা বোঝায় না যে যেভাবে সেগুলি কেবলমাত্র বিকল্প। সি ম্যালোকস এবং এমফ্রিগুলি একটি হিপ ব্যবহার করে তবে এর কোনও (মানক) আবর্জনা সংগ্রহকারী নেই এবং কেবলমাত্র রেফারেন্স-গণনা রয়েছে যদি আপনি এটি করার জন্য কোডটি লিখে থাকেন। সি ++ প্রায় একই - এতে রেফারেন্স গণনাতে অন্তর্নিহিত স্মার্ট পয়েন্টার রয়েছে (সি স্ট্যান্ডার্ড হিসাবে সি ++ 11 এ) তবে আপনি এখনও প্রয়োজন ম্যানুয়াল নতুন করতে এবং মুছতে পারেন really
স্টিভ 314

রেফারেন্স গণনা দাবি করার একটি সাধারণ কারণ এটি আবর্জনা সংগ্রহ নয় যে এটি রেফারেন্স চক্র সংগ্রহ করতে ব্যর্থ। এটি অবশ্যই সহজ বাস্তবায়নের জন্য প্রযোজ্য (সম্ভবত সি ++ স্মার্ট পয়েন্টার সহ - আমি চেক করি নি) তবে এটি সবসময় হয় না। কমপক্ষে একটি জাভা ভার্চুয়াল মেশিন (আইবিএম, আইআইআরসি দ্বারা) রেফারেন্স গণনাটিকে এর আবর্জনা সংগ্রহের ভিত্তি হিসাবে ব্যবহার করেছে।
স্টিভ 314
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.