এই পেপারটি ধারণা (concepts) ব্যবহার করে C++ সাধারণ প্রোগ্রামিং সুবিধা এবং নীতিগুলি ব্যাখ্যা করার প্রোগ্রামিং কৌশল প্রদর্শন করে। ধারণা হল C++ তে সাধারণ কোডের সীমাবদ্ধতা প্রকাশ করার পদ্ধতি। প্রাথমিক উদাহরণ হিসাবে, এই পেপারটি একটি সহজ টাইপ সিস্টেম প্রদান করে যা সংকীর্ণকরণ রূপান্তর দূর করে এবং অপ্রয়োজনীয় প্রতীক বা রানটাইম ওভারহেড ছাড়াই পরিসীমা পরীক্ষা প্রদান করে। ধারণাগুলি ব্যবহারকারী-সংজ্ঞায়িত টাইপ সিস্টেম সম্প্রসারণ প্রদানের জন্য ব্যাপকভাবে ব্যবহৃত হয়। এই পেপারটি ধারণার ব্যবহারিকতা এবং এর পিছনের মৌলিক ধারণাগুলি প্রদর্শন করার লক্ষ্য রাখে, C++ সাধারণ প্রোগ্রামিং ভাষা সমর্থন বা মান লাইব্রেরি ব্যাপক সমর্থনের বিস্তারিত বা সম্পূর্ণ ব্যাখ্যা প্রদান করা নয়। সাধারণ প্রোগ্রামিং C++ এর একটি উপাদান, একটি বিচ্ছিন্ন উপভাষা নয়। অবশেষে, এই পেপারটি ধারণা ডিজাইনের মূল অংশগুলির ডিজাইন দর্শন এবং উৎস প্রদান করে, যার মধ্যে রয়েছে ব্যবহারের নিদর্শন, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে সম্পর্ক, মূল্য পরামিতি, প্রতীকী প্রতিনিধিত্ব, ধারণা টাইপ ম্যাচিং এবং সংজ্ঞা পরীক্ষা।
১. সাধারণ প্রোগ্রামিংয়ের চ্যালেঞ্জ: ঐতিহ্যবাহী C++ সাধারণ প্রোগ্রামিং স্পষ্ট ইন্টারফেস বিশেষ নির্দিষ্টকরণের অভাব রয়েছে, যার ফলে সংকলন সময়ের ত্রুটি বার্তা অস্পষ্ট হয়, প্রোগ্রামার এবং সংকলক উভয়ই টেমপ্লেট ইন্টারফেস বুঝতে এবং ব্যবহার করতে অসুবিধা পান।
२. টাইপ নিরাপত্তা সমস্যা: C++ C ভাষার অন্তর্নিহিত টাইপ রূপান্তর নিয়ম উত্তরাধিকার সূত্রে পেয়েছে, বিশেষত পাটিগণিত প্রকারগুলির মধ্যে সংকীর্ণকরণ রূপান্তর (যেমন বড় পূর্ণসংখ্যা থেকে ছোট পূর্ণসংখ্যায় রূপান্তর তথ্য হারাতে পারে), এটি ত্রুটি এবং নিরাপত্তা সমস্যার একটি গুরুত্বপূর্ণ উৎস।
३. পরিসীমা পরীক্ষার অভাব: ঐতিহ্যবাহী পয়েন্টার এবং অ্যারে ব্যবহার বাফার ওভারফ্লো ইত্যাদি নিরাপত্তা সমস্যার দিকে পরিচালিত করে, কার্যকর পরিসীমা পরীক্ষা প্রক্রিয়ার অভাব রয়েছে।
এই পেপারের মূল প্রেরণা হল C++20 দ্বারা প্রবর্তিত ধারণা (concepts) ব্যবহার করে কীভাবে প্রদর্শন করা যায়:
পেপারটি Alex Stepanov দ্বারা প্রস্তাবিত সাধারণ প্রোগ্রামিং লক্ষ্য অনুসরণ করে: "সবচেয়ে সাধারণ, সর্বোচ্চ দক্ষ, সবচেয়ে নমনীয় ধারণা প্রতিনিধিত্ব", এবং নিম্নলিখিত ডিজাইন প্রয়োজনীয়তা পূরণ করে:
१. ধারণা-ভিত্তিক টাইপ নিরাপদ প্রোগ্রামিং কৌশল প্রস্তাব করা: সংকীর্ণকরণ রূপান্তর দূর করতে এবং পরিসীমা পরীক্ষা প্রদান করতে ধারণা কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করা, একই সাথে শূন্য রানটাইম ওভারহেড বজায় রাখা।
२. ব্যবহারিক টাইপ সিস্টেম সম্প্রসারণ তৈরি করা:
Number<T> টাইপ বাস্তবায়ন করা, বিপজ্জনক সংকীর্ণকরণ রূপান্তর দূর করাSpan টাইপ ডিজাইন করা, পরিসীমা পরীক্ষা সহ অ্যারে অ্যাক্সেস প্রদান করা३. ধারণা ডিজাইনের গভীর দর্শন প্রদান করা: সংকলন সময়ের ফাংশন হিসাবে ধারণা, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে সম্পর্ক, প্রতীকী প্রতিনিধিত্ব পছন্দ ইত্যাদি মূল ডিজাইন বিবেচনা বিস্তারিতভাবে ব্যাখ্যা করা।
४. সাধারণ প্রোগ্রামিংয়ের একতা প্রদর্শন করা: প্রমাণ করা যে সাধারণ প্রোগ্রামিং C++ এর একটি উপাদান, একটি বিচ্ছিন্ন উপভাষা নয়, এবং অন্যান্য ভাষা বৈশিষ্ট্যের সাথে (যেমন lambda, পরিবর্তনশীল টেমপ্লেট, স্ট্যাটিক প্রতিফলন) নির্বিঘ্নে একীভূত।
ধারণা হল সংকলন সময়ে মূল্যায়িত ফাংশন (বিধেয়), যা টাইপ পরামিতি গ্রহণ করতে পারে:
template<typename T>
concept Num = integral<T> || floating_point<T>;
template<typename T, typename U>
concept Can_narrow_to =
! same_as<T, U> // ভিন্ন প্রকার
&& Num<T> && Num<U> // উভয়ই সংখ্যাসূচক প্রকার
&& (
(floating_point<T> && integral<U>) // দশমিক অংশ হারাতে পারে
|| (numeric_limits<T>::digits > numeric_limits<U>::digits) // কাটা হতে পারে
|| (signed_integral<T>!=signed_integral<U> && sizeof(T)==sizeof(U)) // চিহ্ন পরিবর্তন হতে পারে
);
template<Num U, Num T>
constexpr bool will_narrow(U u) {
if constexpr (!Can_narrow_to<T, U>)
return false;
// শুধুমাত্র সংকীর্ণকরণ সম্ভব হলে রানটাইম পরীক্ষা করুন
T t = u;
return (t != u);
}
template<Num T>
class Number {
T val;
public:
template<Num U>
constexpr Number(const U u) : val{convert_to<T>(u)} { }
operator T() { return val; }
};
template<class T>
class Span {
T* p;
unsigned n;
public:
Span(Spanable auto& s) : p{data(s)}, n{size(s)} {}
T& operator[](Number<unsigned> i) {
return p[check(i)];
}
private:
unsigned check(unsigned nn) {
if (n <= nn) throw Span_range_error{};
return nn;
}
};
template<typename R, typename Pred = ranges::less>
concept Sortable_range =
ranges::random_access_range<R>
&& sortable<ranges::iterator_t<R>, Pred>;
template<typename R, typename Pred = ranges::less>
requires Sortable_range<R,Pred>
void sort(R& r, Pred p = {}) {
sort(r.begin(), r.end(), p);
}
ধারণা ব্যবহারের নিদর্শনের মাধ্যমে প্রয়োজনীয়তা সংজ্ঞায়িত করে, শ্রেণী সংজ্ঞার মতো ফাংশন সংগ্রহের মাধ্যমে নয়:
template<typename T, typename U = T>
concept equality_comparable = requires(T a, U b) {
{a==b} -> Boolean;
{a!=b} -> Boolean;
{b==a} -> Boolean;
{b!=a} -> Boolean;
}
এই পদ্ধতির সুবিধা:
ধারণা টাইপের টাইপ বা টাইপের বৈশিষ্ট্য হিসাবে নয়, সংকলন সময়ের ফাংশন হিসাবে ডিজাইন করা হয়েছে:
সংকলন সময়ের পরীক্ষা এবং শর্তসাপেক্ষ সংকলনের মাধ্যমে শূন্য রানটাইম ওভারহেড অর্জন করা:
template<Num U, Num T>
constexpr bool will_narrow(U u) {
if constexpr (!Can_narrow_to<T, U>)
return false; // সংকলন সময়ে নির্ধারিত, কোনো রানটাইম খরচ নেই
// শুধুমাত্র প্রয়োজনে রানটাইম পরীক্ষা করুন
}
পেপারটি পদ্ধতির কার্যকারিতা যাচাই করতে অসংখ্য বাস্তব কোড উদাহরণের মাধ্যমে:
१. পাটিগণিত রূপান্তর উদাহরণ: Number প্রকার কীভাবে সংকীর্ণকরণ রূপান্তর প্রতিরোধ করে তা প্রদর্শন করা २. পরিসীমা অ্যাক্সেস উদাহরণ: Span প্রকার কীভাবে নিরাপদ অ্যারে অ্যাক্সেস প্রদান করে তা প্রদর্শন করা ३. সাজানো অ্যালগরিদম উদাহরণ: ধারণা কীভাবে অ্যালগরিদম ইন্টারফেসের স্পষ্টতা এবং নিরাপত্তা উন্নত করে তা প্রদর্শন করা
१. টাইপ নিরাপত্তা উন্নতি:
Number<int> test() {
Number<unsigned int> ii = 0;
ii = 2; // ঠিক আছে
ii = -2; // ব্যতিক্রম - চিহ্ন ত্রুটি ধরা পড়েছে
}
२. পরিসীমা নিরাপত্তা:
Span<int> sa{array};
int x = sa[10]; // ঠিক আছে যদি পরিসীমায় থাকে
int y = sa[-1]; // ব্যতিক্রম - নেতিবাচক সূচক ত্রুটি ধরা পড়েছে
३. অ্যালগরিদম ইন্টারফেস উন্নতি:
sort(vec); // সংক্ষিপ্ত ইন্টারফেস
sort(lst); // সংকলন সময়ের ত্রুটি: তালিকা র্যান্ডম অ্যাক্সেস সমর্থন করে না
পেপারটি নির্দেশ করে যে অনেক সীমাবদ্ধতা সিস্টেম ফাংশন সংগ্রহের উপর নির্ভর করে (শ্রেণী সংজ্ঞার মতো), যখন C++ ধারণা একটি কার্যকরী পদ্ধতি ব্যবহার করে, আরও বেশি নমনীয়তা প্রদান করে।
१. ধারণা সংকলন সময়ের ফাংশন: এই ডিজাইন নমনীয়তা এবং দক্ষতার সর্বোত্তম ভারসাম্য প্রদান করে।
२. সাধারণ প্রোগ্রামিং এবং OOP পরিপূরক:
३. একীভূত প্রোগ্রামিং মডেল: সাধারণ প্রোগ্রামিং একটি বিচ্ছিন্ন উপভাষা নয়, বরং C++ এর একটি উপাদান।
// আদর্শ কার্যকরী সিনট্যাক্স (গৃহীত হয়নি)
void sort(Sortable_range& r);
// প্রকৃত গৃহীত আপস সিনট্যাক্স
void sort(Sortable_range auto& r);
१. স্বতঃসিদ্ধ (Axioms): বিশ্লেষক এবং কোড জেনারেটরের জন্য নির্মাণের শব্দার্থিক বৈশিষ্ট্য নির্দিষ্ট করা
२. আউটপুট পরিসীমা: পরিসীমা নিরাপত্তা বৃদ্ধি করা, আউটপুট অপারেশনের জন্য পরিসীমা পরীক্ষা করা
३. প্রতীকী প্রতিনিধিত্ব উন্নতি: ধারণার পরে auto অপ্রয়োজনীয়তা দূর করা
४. শ্রেণীর ওভারলোডিং: ধারণার উপর ভিত্তি করে শ্রেণী ওভারলোডিং অনুমতি দেওয়া
५. প্যাটার্ন ম্যাচিং: কার্যকরী প্রোগ্রামিং শৈলীর প্যাটার্ন ম্যাচিং
६. একীভূত ফাংশন কল: কার্যকরী এবং OOP শৈলী কল সিনট্যাক্স একীভূত করা
१. শক্তিশালী ব্যবহারিকতা: সরাসরি প্রয়োগযোগ্য প্রোগ্রামিং কৌশল প্রদান করে, বাস্তব টাইপ নিরাপত্তা সমস্যা সমাধান করে।
२. তত্ত্ব এবং অনুশীলনের সমন্বয়: গভীর তাত্ত্বিক ভিত্তি (গাণিতিক ধারণা) এবং নির্দিষ্ট বাস্তবায়ন উদাহরণ উভয়ই রয়েছে।
३. শূন্য ওভারহেড ডিজাইন: সংকলন সময়ের পরীক্ষা ডিজাইনের মাধ্যমে, টাইপ নিরাপত্তা অর্জন করা হয় কর্মক্ষমতা হ্রাস ছাড়াই।
४. ব্যাপক ডিজাইন বিবেচনা: মৌলিক সিনট্যাক্স থেকে উন্নত বৈশিষ্ট্য (যেমন স্ট্যাটিক প্রতিফলন) পর্যন্ত সম্পূর্ণ ডিজাইন স্থান কভার করে।
५. কর্তৃত্ব: লেখক Bjarne Stroustrup হলেন C++ ভাষার স্রষ্টা, অপ্রতিদ্বন্দ্বী কর্তৃত্ব রয়েছে।
१. খাড়া শেখার বক্ররেখা: ধারণার সিনট্যাক্স এবং ব্যবহারের নিদর্শন শিক্ষানবিসদের জন্য জটিল হতে পারে।
२. সংকলন সময় প্রভাব: বিস্তৃত সংকলন সময়ের পরীক্ষা সংকলন সময় বৃদ্ধি করতে পারে, পেপার এটি যথেষ্ট আলোচনা করে না।
३. পিছিয়ে সামঞ্জস্যতা চ্যালেঞ্জ: সামঞ্জস্য বজায় রাখা হয়েছে, তবে নতুন এবং পুরানো কোড মিশ্রিত ব্যবহার করার সময় বিভ্রান্তি হতে পারে।
४. ত্রুটি বার্তা গুণমান: যদিও ধারণা ত্রুটি বার্তা উন্নত করেছে, জটিল ধারণার ত্রুটি বার্তা এখনও বোঝা কঠিন হতে পারে।
१. C++ সম্প্রদায়ের উপর প্রভাব: C++20 ধারণার বাস্তব প্রয়োগের জন্য কর্তৃপক্ষ নির্দেশনা প্রদান করে।
२. অন্যান্য ভাষার অনুপ্রেরণা: ধারণা ডিজাইন দর্শন অন্যান্য ভাষার সীমাবদ্ধতা সিস্টেম ডিজাইনকে প্রভাবিত করতে পারে।
३. শিক্ষামূলক মূল্য: সাধারণ প্রোগ্রামিং শিক্ষার জন্য চমৎকার শিক্ষা উপকরণ প্রদান করে।
४. ব্যবহারিক মূল্য: প্রদত্ত কৌশল সরাসরি কোডের টাইপ নিরাপত্তা উন্নত করতে ব্যবহার করা যেতে পারে।
१. সিস্টেম-স্তরের প্রোগ্রামিং: উচ্চ কর্মক্ষমতা এবং টাইপ নিরাপত্তা প্রয়োজন এমন নিম্ন-স্তরের কোড।
२. লাইব্রেরি ডিজাইন: সাধারণ লাইব্রেরির জন্য স্পষ্ট ইন্টারফেস বিশেষ নির্দিষ্টকরণ প্রদান করা।
३. শিক্ষা এবং প্রশিক্ষণ: সাধারণ প্রোগ্রামিং ধারণা এবং কৌশলের শিক্ষা উপকরণ হিসাবে।
४. কোড পুনর্গঠন: বিদ্যমান অনিরাপদ কোডকে টাইপ নিরাপদ সংস্করণে পুনর্গঠন করা।
পেপারটিতে C++ ভাষা ডিজাইন থেকে সাধারণ প্রোগ্রামিং তত্ত্ব পর্যন্ত বিভিন্ন দিক কভার করে সমৃদ্ধ রেফারেন্স রয়েছে, প্রধানত অন্তর্ভুক্ত:
সংক্ষিপ্তসার: এটি একটি গুরুত্বপূর্ণ তাত্ত্বিক এবং ব্যবহারিক মূল্যের পেপার, C++ ভাষার স্রষ্টা দ্বারা ব্যক্তিগতভাবে লিখিত, যা C++ সাধারণ প্রোগ্রামিংয়ে ধারণার প্রয়োগ সম্পূর্ণভাবে প্রদর্শন করে। পেপারটি শুধুমাত্র ব্যবহারিক প্রোগ্রামিং কৌশল প্রদান করে না, বরং ডিজাইন দর্শনও গভীরভাবে ব্যাখ্যা করে, C++ প্রোগ্রামার এবং প্রোগ্রামিং ভাষা গবেষকদের উভয়ের জন্য গুরুত্বপূর্ণ রেফারেন্স মূল্য রয়েছে।