এমন কোনও কার্যকরী ভাষা রয়েছে যা সুযোগের শেষে স্ট্যাক শব্দার্থবিজ্ঞান - স্বয়ংক্রিয় নিরঙ্কুশ ধ্বংসকে ব্যবহার করতে দেয়?
এমন কোনও কার্যকরী ভাষা রয়েছে যা সুযোগের শেষে স্ট্যাক শব্দার্থবিজ্ঞান - স্বয়ংক্রিয় নিরঙ্কুশ ধ্বংসকে ব্যবহার করতে দেয়?
উত্তর:
আমি জানি না, যদিও আমি কোনও কার্যনির্বাহী প্রোগ্রামিং বিশেষজ্ঞ নই।
এটি নীতিগত দিক থেকে বেশ কঠিন বলে মনে হচ্ছে, কারণ ফাংশন থেকে প্রত্যাবর্তিত মানগুলিতে একই ফাংশনের মধ্যে তৈরি হওয়া (স্ট্যাকের উপরে) অন্যান্য মানগুলির উল্লেখ থাকতে পারে বা প্যারামিটার হিসাবে সহজেই পাস করা হয়েছে বা পাস হওয়া কিছু দ্বারা রেফারেন্স থাকতে পারে প্যারামিটার হিসাবে সি-তে এই সমস্যাটি মোকাবেলা করা হয় যে প্রোগ্রামার যদি জিনিসগুলি সঠিকভাবে না পায় তবে ঝুঁকিপূর্ণ পয়েন্টারগুলি (বা আরও স্পষ্টভাবে, অপরিজ্ঞাত আচরণ) ঘটতে পারে। এটি সেই ধরণের সমাধান নয় যা কার্যকরী ভাষা ডিজাইনাররা অনুমোদন করে।
যদিও এর সম্ভাব্য সমাধান রয়েছে। একটি ধারণা হ'ল আজীবন মূল্যকে তার ধরণের উল্লেখের সাথে একটি অংশের অংশ হিসাবে তৈরি করুন এবং টাইপ-ভিত্তিক নিয়মগুলি সংজ্ঞায়িত করুন যা স্ট্যাক-বরাদ্দকৃত মানগুলি থেকে ফিরে আসা থেকে বা প্রতিস্থাপিত কিছু থেকে রেফারেন্স প্রতিরোধ করে, একটি ফাংশন। আমি প্রভাবগুলির মধ্যে দিয়ে কাজ করি নি, তবে আমার সন্দেহ হয় এটি ভয়াবহ হবে।
মোনাডিক কোডের জন্য, আরও একটি সমাধান রয়েছে যা (প্রকৃতপক্ষে বা প্রায়) মোনাডিকও, এবং একধরণের স্বয়ংক্রিয়ভাবে নির্বিচারে-ধ্বংসাত্মক আইওরিফ দিতে পারে। নীতি হ'ল "বাসা বাঁধার" ক্রিয়া সংজ্ঞায়িত করা। একত্রিত হয়ে গেলে (কোনও সহযোগী অপারেটর ব্যবহার করে), এগুলি নীড় নিয়ন্ত্রণ নিয়ন্ত্রণ প্রবাহকে সংজ্ঞায়িত করে - আমি মনে করি "এক্সএমএল উপাদান", বাম-সর্বাধিক মানগুলি বহিরাগত আরম্ভ এবং শেষের সাথে ট্যাগ যুগল সরবরাহ করে। এই "এক্সএমএল ট্যাগগুলি" বিমূর্তনের অন্য স্তরে স্রেফ 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 সাধারণ নীড়ের সুযোগের উপর ভিত্তি করে। মেমরি পরিচালনার জন্য আপনার এখনও একটি আবর্জনা সংগ্রহকারী দরকার তবে আপনি অন্যান্য সংস্থাগুলির নিরাপদ এবং সময়মতো স্বয়ংক্রিয় নির্বিচারক ক্লিনআপ পান।
shared_ptr<>
), আপনি এখনও নিরস্তক ধ্বংস অবধি রাখেন । আরআইআইয়ের জন্য যে জিনিসটি মুশকিল তা হ'ল চক্রীয় রেফারেন্স; মালিকানা গ্রাফ যদি একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ হয় তবে RAII পরিষ্কারভাবে কাজ করে।
আপনি যদি সি ++ কে একটি কার্যকরী ভাষা হিসাবে বিবেচনা করেন (এটিতে ল্যাম্বডাস রয়েছে) তবে এটি কোনও ভাষার উদাহরণ যা কোনও আবর্জনা সংগ্রহ ব্যবহার করে না।
আমার বলতে হবে যে প্রশ্নটি কিছুটা সংজ্ঞায়িত কারণ এটি ধরে নিয়েছে যে "কার্যকরী ভাষাগুলির" একটি মানক সংগ্রহ রয়েছে। প্রায় প্রতিটি প্রোগ্রামিং ভাষা কিছু পরিমাণে কার্যকরী প্রোগ্রামিং সমর্থন করে। এবং, প্রায় প্রতিটি প্রোগ্রামিং ভাষা কিছু পরিমাণ অত্যাবশ্যক প্রোগ্রামিং সমর্থন করে। কোনটি একটি সংস্কৃত কুসংস্কার এবং জনপ্রিয় মতবাদ দ্বারা পরিচালিত ব্যতীত কোন কার্যকরী ভাষা এবং কোনটি অপরিহার্য ভাষা বলার লাইন আঁকবে?
প্রশ্নের বাক্য গঠনের আরও ভাল উপায় হ'ল "স্ট্যাক বরাদ্দ মেমরিতে ফাংশনাল প্রোগ্রামিং সমর্থন করা কি সম্ভব"? উত্তরটি ইতিমধ্যে উল্লিখিত হিসাবে, খুব কঠিন। কার্যকরী প্রোগ্রামিং শৈলী ইচ্ছামত পুনরাবৃত্ত তথ্য স্ট্রাকচারের বরাদ্দকে প্রচার করে, যার জন্য একটি হিপ মেমরি প্রয়োজন (আবর্জনা সংগ্রহ করা হোক বা রেফারেন্স গণনা করা হোক)। তবে অঞ্চল-ভিত্তিক মেমরি বিশ্লেষণ নামে একটি সুন্দর পরিশীলিত সংকলক বিশ্লেষণ কৌশল রয়েছে যার সাহায্যে সংকলকটি স্তূপকে বরাদ্দ করার মতো এবং একত্রে বরাদ্দ করা এবং স্বয়ংক্রিয়ভাবে বিলোপ করা যায় এমন বৃহত ব্লকে ভাগ করতে পারে। উইকিপিডিয়া পৃষ্ঠাটি "কার্যকরী" এবং "অপরিহার্য" উভয় ভাষার জন্য কৌশলটির বিভিন্ন বাস্তবায়ন তালিকাভুক্ত করে।