একটি ভাল সমাবর্তন গল্পটি মরিচা প্রকল্পের অন্যতম প্রধান লক্ষ্য, সুতরাং উন্নতির প্রত্যাশা করা উচিত, যদি আমরা প্রকল্পটির লক্ষ্য অর্জনে বিশ্বাস করি। সম্পূর্ণ অস্বীকৃতি: আমি মরিচা সম্পর্কে একটি উচ্চ মতামত আছে এবং এটি বিনিয়োগ করা হয়। অনুরোধ হিসাবে, আমি মান বিচারগুলি এড়াতে চেষ্টা করব এবং (আইএমএইচও) উন্নতির পরিবর্তে পার্থক্য বর্ণনা করব ।
নিরাপদ এবং অনিরাপদ জং
"মরিচা" দুটি ভাষার সমন্বয়ে গঠিত: একটি যা সিস্টেম প্রোগ্রামিংয়ের বিপদ থেকে আপনাকে আলাদা করার জন্য খুব চেষ্টা করে এবং এরকম কোনও আকাঙ্ক্ষা ছাড়াই আরও শক্তিশালী।
অনিরাপদ মরিচা একটি অদ্ভুত, বর্বর ভাষা যা অনেকটা সি ++ এর মতো অনুভব করে। এটি আপনাকে নির্বিচারে বিপজ্জনক কাজ করতে, হার্ডওয়্যারের সাথে কথা বলার জন্য, (ভুল) ম্যানুয়ালি ম্যানুয়ালি পরিচালনা করতে পারে, নিজেকে পায়ে গুলি করতে পারে etc. এবং এতে জড়িত অন্যান্য সমস্ত প্রোগ্রামারদের হাত। আপনি কীওয়ার্ডের সাহায্যে এই ভাষাটিকে বেছে unsafe
নিয়েছেন এবং সি এবং সি ++ এর মতোই, কোনও একক স্থানে থাকা একটি একক ভুল পুরো প্রকল্পটিকে ক্র্যাশ করে দিতে পারে।
নিরাপদ মরিচটি "ডিফল্ট", মরিচা কোডের বিস্তীর্ণ অংশই নিরাপদ এবং আপনি যদি আপনার কোডটিতে কীওয়ার্ডটি উল্লেখ না করেন তবে আপনি কখনই unsafe
নিরাপদ ভাষা ছেড়ে যাবেন না। বাকী পোস্টটি বেশিরভাগ ক্ষেত্রে সেই ভাষা নিয়েই নিজেকে উদ্বেগ জানায়, কারণ unsafe
সুরক্ষিত মুরগি আপনাকে যে পরিশ্রম দেওয়ার পক্ষে কঠোর পরিশ্রম করে তাতে কোড যে কোনও এবং সমস্ত গ্যারান্টি ভঙ্গ করতে পারে। ফ্লিপ দিকে, unsafe
কোডটি খারাপ নয় এবং সম্প্রদায়ের দ্বারা যেমন ব্যবহার করা হয় না (এটি অবশ্য দৃ strongly়রূপে নিরুত্সাহিত হয় যখন প্রয়োজন হয় না)।
এটি বিপজ্জনক, হ্যাঁ, তবে এটিও গুরুত্বপূর্ণ, কারণ এটি নিরাপদ কোড ব্যবহার করে এমন বিমূর্ততা তৈরি করতে দেয়। ভাল অনিরাপদ কোডটি অন্যকে এর অপব্যবহার থেকে রোধ করার জন্য টাইপ সিস্টেমটি ব্যবহার করে এবং তাই কোনও জং প্রোগ্রামে অনিরাপদ কোডের উপস্থিতি নিরাপদ কোডকে বিরক্ত করার দরকার নেই। নিম্নলিখিত সমস্ত পার্থক্য বিদ্যমান কারণ রাস্টের টাইপ সিস্টেমে এমন সরঞ্জাম রয়েছে যা সি ++ এর না থাকে এবং কারণ যে সুরক্ষিত বিমূর্ততা প্রয়োগ করে এমন অনিরাপদ কোড কার্যকরভাবে এই সরঞ্জামগুলি ব্যবহার করে।
অ-পার্থক্য: ভাগ করা / পরিবর্তনীয় মেমরি
যদিও মরিচ বার্তা প্রেরণের উপর বেশি জোর দেয় এবং ভাগ করে নেওয়া মেমরিটিকে খুব কঠোরভাবে নিয়ন্ত্রণ করে, তবে এটি ভাগ করা মেমরির সম্মতি অস্বীকার করে না এবং স্পষ্টভাবে সাধারণ বিমূর্তিগুলিকে সমর্থন করে (তালা, পারমাণবিক ক্রিয়াকলাপ, শর্ত ভেরিয়েবল, সমবর্তী সংগ্রহ)।
অধিকন্তু, সি ++ এর মতো এবং কার্যকরী ভাষার মতো নয়, মরচে আসলেই প্রথাগত অপরিহার্য ডেটা স্ট্রাকচার পছন্দ করে। স্ট্যান্ডার্ড লাইব্রেরিতে স্থির / অপরিবর্তিত লিঙ্কের কোনও তালিকা নেই। আছে std::collections::LinkedList
কিন্তু এটা মত std::list
C ++ এবং একই কারণে নিরুৎসাহিত std::list
(ক্যাশের খারাপ ব্যবহার)।
যাইহোক, এই বিভাগের শিরোনামের সাথে ("শেয়ার করা / মিউটেবল মেমোরি"), মরচে সি ++ এর একটি পার্থক্য রয়েছে: এটি দৃ strongly়ভাবে উত্সাহ দেয় যে মেমরিটিকে "শেয়ার করা এক্সওআর মিউটেটেবল" হতে হবে, অর্থাত, সেই স্মৃতি কখনও একইভাবে ভাগ করা যায় না এবং পরিবর্তিত হয় না same সময়। "আপনার নিজের থ্রেডের গোপনীয়তায়" মেমোরিটিকে মিউটেট করুন, তাই কথা বলতে। এটি সি ++ এর সাথে বিপরীতে করুন যেখানে ভাগ করা মিউটেবল মেমরিটি ডিফল্ট বিকল্প এবং ব্যাপকভাবে ব্যবহৃত হয়।
যদিও ভাগ করা-এক্সওর-মিউটটেবল দৃষ্টান্তটি নীচের পার্থক্যের জন্য খুব গুরুত্বপূর্ণ, এটি বেশ আলাদা প্রোগ্রামিং দৃষ্টান্ত যা অভ্যস্ত হতে কিছুটা সময় নেয় এবং এটি উল্লেখযোগ্য সীমাবদ্ধতা রাখে। মাঝে মাঝে কাউকে এই দৃষ্টান্তটি বেছে নিতে হবে, যেমন পারমাণবিক প্রকারের সাথে ( AtomicUsize
ভাগ করে নেওয়া পারস্পরিক মেমোরির মূল অংশ)। নোট করুন যে লকগুলি ভাগ করা-জোর-মিউটেটেবল বিধিও মেনে চলে, কারণ এটি একযোগে পড়া এবং লেখার বিধি নিষেধ করে (যখন একটি থ্রেড লিখে অন্য কোনও থ্রেড পড়তে বা লিখতে পারে না)।
অ-পার্থক্য: ডেটা দৌড়গুলি অনির্ধারিত আচরণ (ইউবি)
আপনি যদি মরিচা কোডে কোনও ডেটা রেসকে ট্রিগার করেন তবে সি ++ এর মতোই এটি খেলা শেষ। সমস্ত বেট বন্ধ আছে এবং সংকলক যা খুশি তা করতে পারে।
তবে এটি একটি শক্ত গ্যারান্টি যে নিরাপদ মরচে কোডে ডেটা রেস না থাকে (বা সেই বিষয়ে কোনও ইউবি)। এটি মূল ভাষা এবং স্ট্যান্ডার্ড লাইব্রেরি উভয় প্রসারিত। আপনি যদি কোনও রুট প্রোগ্রাম লিখতে পারেন যা ব্যবহার না করে unsafe
(তৃতীয় পক্ষের লাইব্রেরিগুলিতে অন্তর্ভুক্ত তবে স্ট্যান্ডার্ড লাইব্রেরি বাদে) যা ইউবিটিকে ট্রিগার করে, তবে এটি একটি বাগ হিসাবে বিবেচিত হবে এবং এটি স্থির হয়ে যাবে (এটি ইতিমধ্যে বেশ কয়েকবার ঘটেছে)। এটি অবশ্যই সি ++ এর সম্পূর্ণ বিপরীতে যেখানে ইউবির সাথে প্রোগ্রাম লেখার ক্ষেত্রে এটি তুচ্ছ।
পার্থক্য: কঠোর লকিং শৃঙ্খলা
C ++ -এর মত মরচে (ইন একটি লক std::sync::Mutex
, std::sync::RwLock
ইত্যাদি) মালিক ডেটা রক্ষা করছে। কোনও ডকুমেন্টেশনে লকটির সাথে সম্পর্কিত এমন কিছু ভাগ করা মেমরির পরিবর্তে কোনও লক নেওয়ার পরিবর্তে ভাগ করা ডেটা অ্যাক্সেসযোগ্য যখন আপনি লকটি ধরে না রাখেন। একজন RAII প্রহরী লক রাখে এবং একই সাথে লক করা ডেটাতে অ্যাক্সেস দেয় (এটি অনেকটা C ++ দ্বারা প্রয়োগ করা যেতে পারে তবে std::
লক দ্বারা নয় )। আজীবন সিস্টেম নিশ্চিত করে যে আপনি লকটি প্রকাশের পরে ডেটা অ্যাক্সেস করতে পারবেন না (RAII গার্ডটি ছেড়ে দিন)।
আপনার অবশ্যই একটি লক থাকতে পারে যাতে কোনও কার্যকর ডেটা ( Mutex<()>
) থাকে না এবং কেবলমাত্র সেই লকটির সাথে স্পষ্টভাবে সংযুক্ত না করে কিছু মেমরি ভাগ করে নেওয়া যায়। তবে, সম্ভাব্য অপরিবর্তিত শেয়ার্ড মেমরির প্রয়োজন unsafe
।
পার্থক্য: দুর্ঘটনা ভাগাভাগি প্রতিরোধ
যদিও আপনি মেমরি ভাগ করে নিতে পারেন, আপনি কেবল তখনই ভাগ করবেন যখন আপনি স্পষ্টভাবে এটির জন্য জিজ্ঞাসা করবেন। উদাহরণস্বরূপ, আপনি যখন বার্তা পাসিং (উদাহরণস্বরূপ চ্যানেলগুলি std::sync
) ব্যবহার করেন, আজীবন সিস্টেম নিশ্চিত করে যে আপনি অন্য থ্রেডে প্রেরণের পরে ডেটাতে কোনও রেফারেন্স রাখবেন না। একটি লকের পিছনে ডেটা ভাগ করতে, আপনি স্পষ্টভাবে লকটি তৈরি করে অন্য থ্রেডে দেন give আপনার সাথে অপরিবর্তিত মেমরি ভাগ unsafe
করতে, ভাল, ব্যবহার করতে হবে unsafe
।
পরবর্তী পয়েন্টের সাথে এই সম্পর্কগুলি:
পার্থক্য: থ্রেড-সুরক্ষা ট্র্যাকিং
মরিচা টাইপ সিস্টেম থ্রেড সুরক্ষার কিছু ধারণা ট্র্যাক। বিশেষত, Sync
বৈশিষ্ট্যটি এমন ধরণের চিহ্নকে বোঝায় যেগুলি ডেটা দৌড়ের ঝুঁকি ছাড়াই বেশ কয়েকটি থ্রেড দ্বারা ভাগ করা যায়, এবং Send
সেইগুলি চিহ্নিত করে যা এক থ্রেড থেকে অন্য থ্রেডে স্থানান্তরিত হতে পারে। এটি পুরো প্রোগ্রাম জুড়েই সংকলক দ্বারা প্রয়োগ করা হয়েছে, এবং এইভাবে গ্রন্থাগার ডিজাইনাররা এমন অপ্টিমাইজেশানগুলি করার সাহস করে যা এই স্থির চেকগুলি ব্যতীত মূর্খতার সাথে বিপজ্জনক হবে be উদাহরণস্বরূপ, সি ++ এর std::shared_ptr
যা সর্বদা তার রেফারেন্স গণনাটি হস্তান্তর করতে পারমাণবিক ক্রিয়াকলাপগুলি ব্যবহার করে, ইউবি এড়াতে যদি কোনও shared_ptr
থ্রেড দ্বারা ব্যবহৃত হয় তবে। মরচে হয়েছে Rc
এবং Arc
, যা শুধুমাত্র যে পার্থক্য Rc
ব্যবহারসমূহ অ পারমাণবিক refcount অপারেশন এবং threadsafe (অর্থাত বাস্তবায়ন করে না Sync
বা Send
) যখন Arc
হয় খুব মতshared_ptr
(এবং উভয় বৈশিষ্ট্য প্রয়োগ করে)।
মনে রাখবেন যে কোনও ধরণের যদি ম্যানুয়ালি সিঙ্ক্রোনাইজেশন প্রয়োগ করতে ব্যবহার unsafe
না করা হয় তবে বৈশিষ্ট্যের উপস্থিতি বা অনুপস্থিতি সঠিকভাবে অনুমান করা হয়।
পার্থক্য: খুব কঠোর নিয়ম
যদি সংকলকটি সম্পূর্ণরূপে নিশ্চিত না হতে পারে যে কোনও কোড ডেটা রেস এবং অন্যান্য ইউবি থেকে মুক্ত, এটি সময়কাল সংকলন করবে না । পূর্বোক্ত নিয়মাবলী এবং অন্যান্য সরঞ্জামগুলি আপনাকে বেশ দূরে পেতে পারে তবে খুব শীঘ্রই বা পরে আপনি সঠিক কিছু করতে চাইবেন তবে সংক্ষেপকারীর নজরে এড়ানো সূক্ষ্ম কারণে। এটি একটি জটিল লক-মুক্ত ডেটা কাঠামো হতে পারে, তবে এটি "জাগ্রত অ্যারেতে এলোমেলো অবস্থানগুলিতে লিখি তবে সূচকগুলি এমনভাবে গণনা করা হয় যে প্রতিটি অবস্থান কেবল একটি থ্রেড দ্বারা লেখা থাকে"।
সেই মুহুর্তে আপনি বুলেটটি কামড়ান এবং কিছুটা অপ্রয়োজনীয় সিঙ্ক্রোনাইজেশন যুক্ত করতে পারেন, বা আপনি কোডটি এমনভাবে লিখে ফেলেন যে সংকলকটি তার সঠিকতা দেখতে পাবে (প্রায়শই কার্যকর, কখনও কখনও শক্ত, কখনও কখনও অসম্ভব), অথবা আপনি unsafe
কোডে ফেলে যান । তবুও, এটি অতিরিক্ত মানসিক ওভারহেড এবং জাস্ট unsafe
কোডের সঠিকতার জন্য কোনও গ্যারান্টি দেয় না ।
পার্থক্য: কম সরঞ্জাম
পূর্বোক্ত পার্থক্যের কারণে, মরিচায় এটি অনেক বেশি বিরল যে কোনও একটি কোড লেখেন যার মধ্যে একটি ডেটা রেস থাকতে পারে (বা ফ্রি ব্যবহারের পরে, বা একটি ডাবল ফ্রি, বা ...) থাকতে পারে। এটি দুর্দান্ত হলেও, এটির দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া রয়েছে যে এই জাতীয় ত্রুটিগুলি সনাক্ত করার জন্য বাস্তুসংস্থানটি তার চেয়েও অনুন্নত এবং তার সম্প্রদায়ের যুবক এবং ছোট আকারের প্রত্যাশার চেয়ে আরও অনুন্নত।
যদিও ভ্যালগ্রিন্ড এবং এলএলভিএমের থ্রেড স্যানিটাইজারের মতো সরঞ্জামগুলি নীতিগতভাবে মরিচা কোডে প্রয়োগ করা যেতে পারে, এটি আসলে কাজ করে কিনা তা সরঞ্জাম থেকে অন্য সরঞ্জামে পরিবর্তিত হয় (এবং এমনকি যেগুলি কাজ করে সেগুলি সেট আপ করা শক্তও হতে পারে, বিশেষত যেহেতু আপনি কোনও আপ-আপ নাও পেতে পারেন এটি কীভাবে করা যায় তার তারিখের তারিখ)। এটি সত্যিই সহায়তা করে না যে জাস্ট বর্তমানে একটি সত্য স্পেসিফিকেশন এবং বিশেষত একটি আনুষ্ঠানিক মেমরি মডেল অভাব আছে।
সংক্ষেপে, unsafe
জাস্ট কোডটি সঠিকভাবে লেখার পক্ষে সি ++ কোডটি সঠিকভাবে লেখার চেয়ে শক্ত , যদিও উভয় ভাষাই সামর্থ্য এবং ঝুঁকির দিক থেকে প্রায় তুলনীয় comp অবশ্যই এটি অবশ্যই এই সত্যের তুলনায় ভারী হওয়া উচিত যে একটি সাধারণ মরিচা প্রোগ্রামটিতে কেবলমাত্র একটি অপেক্ষাকৃত ছোট ভগ্নাংশ থাকে unsafe
, যেখানে একটি সি ++ প্রোগ্রাম, পুরোপুরি সি ++ থাকে।