অ-কার্যকরী সেটিংসে বন্ধের কার্যকরকরণে সমস্যা


18

প্রোগ্রামিং ভাষায় ক্লোজারগুলি একটি জনপ্রিয় এবং প্রায়শই পছন্দসই বৈশিষ্ট্য। উইকিপিডিয়া বলেছেন (জোর আমার):

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

সুতরাং একটি বন্ধ হ'ল মূলত একটি (বেনামে?) ফাংশন মান যা তার নিজস্ব ক্ষেত্রের বাইরে ভেরিয়েবল ব্যবহার করতে পারে। আমার অভিজ্ঞতায়, এর অর্থ এটি এর সংজ্ঞা বিন্দুতে স্কেরে থাকা ভেরিয়েবলগুলি অ্যাক্সেস করতে পারে।

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

এছাড়াও, ক্লোজারগুলি বাস্তবায়ন করার সময় বড় বাধা রয়েছে বলে মনে হয়। সর্বাধিক উল্লেখযোগ্য, জাভা 7 এগুলিকে অন্তর্ভুক্ত করার কথা ছিল তবে বৈশিষ্ট্যটি ভবিষ্যতের রিলিজে ফিরে গেছে।

ক্লোজারগুলি কেন এত কঠিন (বুঝতে এবং বুঝতে)? এটি খুব বিস্তৃত এবং অস্পষ্ট একটি প্রশ্ন, সুতরাং আমাকে এই আন্তঃসংযুক্ত প্রশ্নগুলির সাথে এটি আরও ফোকাস করতে দিন:

  • সাধারণ শব্দার্থিক রীতিতে (ক্ষুদ্র-পদক্ষেপ, বড় পদক্ষেপ, ...) ক্লোজার প্রকাশের সাথে সমস্যা আছে?
  • বিদ্যমান টাইপ সিস্টেমগুলি কি বন্ধের জন্য উপযুক্ত নয় এবং সহজেই প্রসারিত করা যায় না?
  • Aতিহ্যবাহী, স্ট্যাক-ভিত্তিক পদ্ধতির অনুবাদগুলির সাথে তাল মিলিয়ে ক্লোজারগুলি আনতে কি সমস্যা হয়?

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


ভাল প্রশ্ন. ক্লাসারগুলি স্কালায় প্রয়োগ করা হয়েছে এবং মার্টিন ওডারস্কি জাভা ১.২ সংকলক লিখেছিলেন, সুতরাং তারা জাভা 7. এ কেন নেই তা স্পষ্ট নয় C সি # তাদের রয়েছে। (আমি পরে আরও ভাল উত্তর লেখার চেষ্টা করব।)
ডেভ ক্লার্ক

4
লিস্প এবং এমএলের মতো অশুচি কার্যকরী ভাষাগুলি ক্লোসারের ঠিক সামঞ্জস্য করে, সুতরাং তাদের সমস্যাযুক্ত হওয়ার কোনও অন্তর্নিহিত সিন্থেটিক কারণ থাকতে পারে না।
গিলস 8 '19

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

1
কটাক্ষপাত pdfs.semanticscholar.org/73a2/... পাশাপাশি অ্যাপ্লিকেশন Lua লেখক এটা খুব চালাক ভাবে তৈরি এবং বাস্তবায়ন বন্ধ সাধারণ সমস্যা নিয়ে আলোচনা -
Bulat

উত্তর:


10

আমি কি আপনাকে ফানার্গ সমস্যা উইকিপিডিয়া পৃষ্ঠায় ডাইরেক্ট করতে পারি ? কমপক্ষে এভাবেই সংকলক লোকেরা ক্লোজার বাস্তবায়ন সমস্যাটি উল্লেখ করে।

সুতরাং একটি বন্ধ হ'ল মূলত একটি (বেনামে?) ফাংশন মান যা তার নিজস্ব ক্ষেত্রের বাইরে ভেরিয়েবল ব্যবহার করতে পারে। আমার অভিজ্ঞতায়, এর অর্থ এটি এর সংজ্ঞা বিন্দুতে স্কেরে থাকা ভেরিয়েবলগুলি অ্যাক্সেস করতে পারে।

যদিও এই সংজ্ঞাটি বোঝায়, এটি একটি aতিহ্যগত রানটাইম-স্ট্যাক ভিত্তিক ভাষায় প্রথম-শ্রেণীর ফাংশনগুলি প্রয়োগ করার সমস্যাটি বর্ণনা করতে সহায়তা করে না। যখন এটি বাস্তবায়নের সমস্যার কথা আসে, প্রথম শ্রেণির ফাংশনগুলি মোটামুটি দুটি শ্রেণিতে বিভক্ত করা যায়:

  • ফাংশনগুলির স্থানীয় ভেরিয়েবলগুলি ফাংশন ফেরার পরে কখনও ব্যবহার করা হয় না।
  • ফাংশন ফিরে আসার পরে স্থানীয় ভেরিয়েবলগুলি ব্যবহার করা যেতে পারে।

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

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


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

আমিও এই ধরনের কি যেমন "ঐন্দ্রজালিক" ভেরিয়েবল না করার সিদ্ধান্ত নেওয়ার মতো অন্যান্য বিষয় আছে যা প্রথম শ্রেণীর ফাংশন কম বাস্তবায়ন তুচ্ছ করতে, মনে করতে পারেন এই , স্ব বা সুপার এবং কিভাবে যেমন বিদ্যমান নিয়ন্ত্রণ প্রবাহ অপারেটর, সাথে যোগাযোগ করার জন্য বিরতি এবং রিটার্ন (আমরা কি অ-স্থানীয় রিটার্নের অনুমতি দিতে চাই না?)। তবে শেষ অবধি, প্রথম-শ্রেণীর ক্রিয়াকলাপগুলির সাম্প্রতিক জনপ্রিয়তা ইঙ্গিত দেয় যে যে ভাষাগুলির এগুলির নেই সেগুলি বেশিরভাগ historicalতিহাসিক কারণে বা কিছু তাৎপর্যপূর্ণ নকশার সিদ্ধান্তের কারণে শুরুতে ঘটে।


1
আপনি কি এমন কোনও ভাষা জানেন যা wardর্ধ্বমুখী- এবং নিম্নমুখী ক্ষেত্রে পৃথক করে? .NET ভাষায়, একটি জেনেরিক পদ্ধতি যা কেবলমাত্র নিম্নগামী ফাংশনটি অর্জনের প্রত্যাশা করে জেনেরিক ধরণের একটি কাঠামো পাশাপাশি একটি প্রতিনিধি যা বায়ারফের মতো কাঠামো গ্রহণ করতে পারে (সি #, একটি " refপ্যারামিটার")। যদি কলার কাঠামোর প্রতি আগ্রহের সমস্ত ভেরিয়েবলকে সজ্জিত করে, তবে প্রতিনিধি পুরোপুরি স্থিতিশীল হতে পারে, গাদা বরাদ্দের কোনও প্রয়োজন এড়ানো যায় না। সংকলকগণ এই জাতীয় নির্মাণের জন্য কোনও দুর্দান্ত সিনট্যাক্স সহায়তা দেয় না, তবে ফ্রেমওয়ার্কটি তাদের সমর্থন করতে পারে।
সুপারক্যাট

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

5

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

নিম্নলিখিত সিউডো-সি # বিবেচনা করুন (আমি কিছুটা সি # নির্দিষ্ট জিনিস কেটে ফেলেছি):

int x = 1;
function f = function() { x++; };
for (int i = 1; i < 10; i++) {
    f();
}
print x; // Should print 9

সংকলক এটিকে এমন কিছুতে রূপান্তরিত করে:

class FunctionStuff {
   int x;
   void theFunction() {
       x++;
   }
}

FunctionStuff theClosureObject = new FunctionStuff();
theClosureObject.x = 1;
for (int i = 1; i < 10; i++) {
    theClosureObject.theFunction();
}
print theClosureObject.x; // Should print 9

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

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


আমি দেখতে পাচ্ছি যে এটি কোথায় চলছে; একাধিক ক্লোজার হওয়া এবং একই সুযোগের মূল স্কোপ অ্যাক্সেস করা অগোছালো হতে চলেছে।
রাফেল

সত্যি কথা বলতে, এটি ক্লোজার্স বাস্তবায়নের জন্য বিদ্যমান ওও কাঠামোটি ব্যবহার করার কারণে তাদের সাথে পরে কোনও আসল সমস্যা বেশি হ'ল। অন্যান্য ভাষাগুলি কেবল পৃথক, পদ্ধতি-কম, কাঠামোর মধ্যে ভেরিয়েবলগুলি বরাদ্দ করে এবং তারপরে একাধিক ক্লোজার চাইলে এটি ভাগ করে দিন।
hugomg

@ রাফেল: বন্ধের অভ্যন্তরে বন্ধ হওয়া সম্পর্কে আপনি কেমন অনুভব করছেন? হ্যাঙ্গ এ, আমাকে যে যোগ করা যাক।
অ্যালেক্স দশ কিনারা

5

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


রেফারেন্সের জন্য আপনাকে ধন্যবাদ! এটি হালকা পড়ার জন্য বলে মনে হয় না তবে এটি সম্ভবত শব্দার্থবিজ্ঞানের কাগজ থেকে প্রত্যাশিত।
রাফেল

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

হতে পারে আপনি একটি মোটামুটি ওভারভিউ শ্রম দিতে পারেন। আপনার উত্তর কেন্দ্রীয় ধারণা?
রাফেল

2
@Raphael। সম্ভবত আমি আপনাকে আমার বক্তৃতা নোটগুলিতে উল্লেখ করতে পারি যেগুলি আমি একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ কোর্সের জন্য ব্যবহার করি যা আপনাকে দ্রুত পরিচয় দেয়। দয়া করে হ্যান্ডআউটগুলি 8 এবং 9 সন্ধান করুন
উদয় রেড্ডি

1
সেই লিঙ্কটি মৃত বা অদৃশ্য প্রমাণীকরণের পিছনে প্রদর্শিত হবে। ( cs.cmu.edu/afs/cs/user/rW/public/www/home/papers/gcpoly/tr.pdf )। আমি 403 নিষিদ্ধ পেয়েছি।
বেন ফ্লেচার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.