জেনেরিক সি ++ র‌্যাপার দিয়ে রাস্টের মালিকানার মডেল অর্জন করা সম্ভব?


15

মরিচা এর সম্মতি সুরক্ষা উপর এই নিবন্ধটির মাধ্যমে খুঁজছেন:

http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html

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


লিঙ্কটি থেকে কিছু উদ্ধৃতি এই প্রশ্নের উন্নতি করবে
মার্টিন বা

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

3
আপনি ভাবেন না যে আপনি সি ++ সংকলকটি যাচাই করতে পারে এমনভাবে orrowণ প্রকাশ করতে পারেন, সুতরাং আপনাকে সংশ্লিষ্ট পারফরম্যান্স হিট দিয়ে রানটাইম প্রয়োগের অবলম্বন করতে হবে।
কোডসইনচওস 10:38

1
C ++ 11-এ স্মার্ট পয়েন্টারগুলির দ্বারা ইতিমধ্যে স্কোপের মালিকানাগুলি প্রয়োগ করা হচ্ছে না?
অক্ষত মহাজন

1
@ জেরি জেরেমিয়া রাস্টের বিভিন্ন ধরণের রেফারেন্স রয়েছে। মূলগুলি,, &কোনও প্রকার প্রচারের প্রয়োজন হয় না promoting আপনি যদি &mutকিছুক্ষণ পাওয়ার চেষ্টা করেন তবে একই আইটেমটির জন্য আপনি এখনও অন্য একটি রেফারেন্স পেয়েছেন (পরিবর্তনযোগ্য বা না), আপনি সংকলন করতে পারবেন না। RefCell<T>চেকটি চালানোর সময়কে চালিত করে, তাই আপনি যদি .borrow_mut()ইতিমধ্যে একটি সক্রিয় .borrow()বা এমন কিছু করার চেষ্টা করেন তবে আপনি আতঙ্ক পাবেন .borrow_mut()। মরিচা Rc<T>(শেয়ারিং এর নিজস্ব পয়েন্টার) এবং এর ভাইবাল রয়েছে Weak<T>তবে সেগুলি মালিকানার বিষয়ে, পরিবর্তনের পরিবর্তে নয়। একটি লাঠি RefCell<T>পরিবর্তনশীলতা জন্য তাদের ভিতরে।
বিট্রি

উত্তর:


8

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

যাইহোক, এগুলি "কনভেনশন দ্বারা" হয়ে থাকে এবং সর্বদা সংকলক দ্বারা পরীক্ষা করা যায় না। এবং আপনি দুর্ঘটনাক্রমে ব্যবহার করে একটি মূল্যমানের রেফারেন্সকে একটি মূল্যবান রেফারেন্সে রূপান্তর করতে পারেন std::move()। কংক্রিটের সাথে তিনটি সমস্যা রয়েছে:

  • একটি রেফারেন্স তার উল্লেখ রেফারেন্সটিকে আউটলাইভ করতে পারে। জং এর আজীবন ব্যবস্থা এটি প্রতিরোধ করে।

  • একসাথে একাধিক মিউটেবল / নন-কনস্ট্যান্ট রেফারেন্স সক্রিয় থাকতে পারে যে কোনও সময়। জং এর bণ চেকার এটি প্রতিরোধ করে।

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

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

std::weak_ptrস্মার্ট পয়েন্টার একটি প্লেইন রেফারেন্স অনুরূপ সঙ্কেতাক্ষরে লিখা মালিকানা শব্দার্থবিদ্যা না, কিন্তু প্রয়োজন যে রেফারেন্সড বস্তুর একটি মাধ্যমে পরিচালিত হয় shared_ptr, অর্থাত্ রেফারেন্স-গণনা করা হয়। এটি কোনও শূন্য ব্যয়ের বিমূর্ততা নয়।

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

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

স্মার্ট পয়েন্টারগুলির সাথে সাধারণ সমস্যা হ'ল তারা মূল ভাষার শীর্ষে গ্রন্থাগার। মূল ভাষার বৈশিষ্ট্যগুলির সেট এই স্মার্ট পয়েন্টারগুলিকে সক্ষম করে, যেমন মুভি std::unique_ptr-কনস্ট্রাক্টরগুলির প্রয়োজন। তবে তারা মূল ভাষার মধ্যে ঘাটতিগুলি ঠিক করতে পারে না। কোনও ফাংশন কল করার সময় স্পষ্টতই রেফারেন্স তৈরি করার দক্ষতা এবং একসাথে জড়িয়ে থাকা রেফারেন্স থাকার অর্থ মূল সি ++ ভাষা নিরবচ্ছিন্ন। একক একের জন্য পরিবর্তনীয় রেফারেন্সকে সীমাবদ্ধ করতে অক্ষমতার অর্থ সি ++ কোনও ধরণের সম্মতিতে বর্ণের অবস্থার বিরুদ্ধে সুরক্ষার গ্যারান্টি দিতে পারে না।

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


যদি সমস্যাটি হয় যে সি ++ মূল ভাষার মালিকানা ট্র্যাক করে না, তাহলে কী মেটা-প্রোগ্রামিংয়ের মাধ্যমে সেই কার্যকারিতাটি বাস্তবায়ন করা সম্ভব হবে? এর অর্থ যে আপনি একটি নতুন স্মার্ট পয়েন্টার শ্রেণি তৈরি করবেন যা মেমোরি নিরাপদ থাকবে (১) এটি কেবলমাত্র একই শ্রেণীর স্মার্ট পয়েন্টার ব্যবহারকারী বস্তুর দিকে নির্দিষ্টভাবে নির্দেশ করতে বাধ্য করবে এবং (২) টেমপ্লেটের মাধ্যমে মালিকানা ট্র্যাক করবে
এলিয়ট গোরোকভস্কি

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

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