নির্ভীক কনকারেন্সি
কনকারেন্ট প্রোগ্রামিং নিরাপদে এবং দক্ষতার সাথে পরিচালনা করা Rust-এর অন্যতম প্রধান লক্ষ্য। কনকারেন্ট প্রোগ্রামিং (Concurrent programming), যেখানে একটি প্রোগ্রামের বিভিন্ন অংশ স্বাধীনভাবে এক্সিকিউট হয়, এবং প্যারালাল প্রোগ্রামিং (parallel programming), যেখানে একটি প্রোগ্রামের বিভিন্ন অংশ একই সময়ে এক্সিকিউট হয়, এই দুটি বিষয় ক্রমশ গুরুত্বপূর্ণ হয়ে উঠছে কারণ আরও বেশি কম্পিউটার তাদের একাধিক প্রসেসরের সুবিধা নিচ্ছে। ঐতিহাসিকভাবে, এই প্রেক্ষাপটে প্রোগ্রামিং করা কঠিন এবং ভুল-প্রবণ ছিল। Rust সেই ধারণা পরিবর্তন করার আশা রাখে।
প্রথমদিকে, Rust টিম ভেবেছিল যে মেমরি সেফটি নিশ্চিত করা এবং কনকারেন্সি সমস্যা প্রতিরোধ করা দুটি ভিন্ন চ্যালেঞ্জ যা ভিন্ন পদ্ধতিতে সমাধান করতে হবে। সময়ের সাথে সাথে, টিম আবিষ্কার করে যে ওনারশিপ এবং টাইপ সিস্টেম মেমরি সেফটি এবং কনকারেন্সি সমস্যা উভয়ই পরিচালনা করতে সাহায্য করার জন্য একটি শক্তিশালী টুল সেট! ওনারশিপ এবং টাইপ চেকিং ব্যবহার করে, অনেক কনকারেন্সি এরর Rust-এ রানটাইম এররের পরিবর্তে কম্পাইল-টাইম এরর হিসেবে ধরা পড়ে। সুতরাং, একটি রানটাইম কনকারেন্সি বাগ ঠিক কোন পরিস্থিতিতে ঘটছে তা পুনরুৎপাদন করার জন্য অনেক সময় ব্যয় করার পরিবর্তে, ভুল কোড কম্পাইল হতেই拒绝 করবে এবং সমস্যা ব্যাখ্যা করে একটি এরর দেখাবে। ফলস্বরূপ, আপনি আপনার কোড প্রোডাকশনে পাঠানোর পরে ঠিক করার পরিবর্তে, কাজ করার সময়ই এটি ঠিক করতে পারেন। আমরা Rust-এর এই দিকটির ডাকনাম দিয়েছি নির্ভীক কনকারেন্সি (fearless concurrency)। নির্ভীক কনকারেন্সি আপনাকে এমন কোড লিখতে দেয় যা সূক্ষ্ম বাগমুক্ত এবং নতুন বাগ তৈরি না করেই রিফ্যাক্টর করা সহজ।
নোট: সরলতার জন্য, আমরা অনেক সমস্যাকে আরও সুনির্দিষ্টভাবে কনকারেন্ট এবং/অথবা প্যারালাল না বলে শুধু কনকারেন্ট হিসাবে উল্লেখ করব। এই অধ্যায়ের জন্য, আমরা যখনই কনকারেন্ট শব্দটি ব্যবহার করব, অনুগ্রহ করে মানসিকভাবে এটিকে কনকারেন্ট এবং/অথবা প্যারালাল দিয়ে প্রতিস্থাপন করবেন। পরবর্তী অধ্যায়ে, যেখানে এই পার্থক্যটি আরও গুরুত্বপূর্ণ, আমরা আরও সুনির্দিষ্ট হব।
অনেক ল্যাঙ্গুয়েজ কনকারেন্ট সমস্যা সমাধানের জন্য তাদের দেওয়া সমাধান সম্পর্কে একরোখা। উদাহরণস্বরূপ, Erlang-এর মেসেজ-পাসিং কনকারেন্সির জন্য চমৎকার কার্যকারিতা রয়েছে তবে থ্রেডগুলোর মধ্যে স্টেট শেয়ার করার জন্য শুধুমাত্র অস্পষ্ট উপায় রয়েছে। সম্ভাব্য সমাধানের শুধুমাত্র একটি উপসেট সমর্থন করা হায়ার-লেভেল ল্যাঙ্গুয়েজগুলোর জন্য একটি যুক্তিসঙ্গত কৌশল কারণ একটি হায়ার-লেভেল ল্যাঙ্গুয়েজ অ্যাবস্ট্রাকশন পাওয়ার জন্য কিছু নিয়ন্ত্রণ ছেড়ে দেওয়ার মাধ্যমে সুবিধা দেওয়ার প্রতিশ্রুতি দেয়। যাইহোক, লোয়ার-লেভেল ল্যাঙ্গুয়েজগুলো থেকে আশা করা হয় যে কোনো পরিস্থিতিতে সেরা পারফরম্যান্সের সমাধান দেবে এবং হার্ডওয়্যারের উপর কম অ্যাবস্ট্রাকশন থাকবে। তাই, Rust আপনার পরিস্থিতি এবং প্রয়োজনীয়তার জন্য উপযুক্ত যেকোনো উপায়ে সমস্যা মডেল করার জন্য বিভিন্ন টুল সরবরাহ করে।
এই অধ্যায়ে আমরা যে বিষয়গুলো আলোচনা করব তা এখানে দেওয়া হলো:
- একই সময়ে কোডের একাধিক অংশ চালানোর জন্য কীভাবে থ্রেড তৈরি করতে হয়
- মেসেজ-পাসিং কনকারেন্সি, যেখানে চ্যানেলগুলো থ্রেডের মধ্যে মেসেজ পাঠায়
- শেয়ারড-স্টেট কনকারেন্সি, যেখানে একাধিক থ্রেডের কিছু ডেটাতে অ্যাক্সেস থাকে
Sync
এবংSend
ট্রেইট, যা Rust-এর কনকারেন্সি গ্যারান্টিকে ইউজার-ডিফাইন্ড টাইপের পাশাপাশি স্ট্যান্ডার্ড লাইব্রেরি দ্বারা প্রদত্ত টাইপের ক্ষেত্রেও প্রসারিত করে