এই পর্বে যা শিখবেন
- এই কোর্স কীভাবে কাজ করে — ডায়াগ্রাম, চালানো যায় এমন কোড, কুইজ, অগ্রগতি, পরীক্ষা আর সার্টিফিকেট
- C++ আজ কোথায় কোথায় চলে, আর কেন ঠিক সেখানেই
- C with Classes থেকে C++23 — ইতিহাসের মূল মোড়গুলো, আর ISO কমিটি কীভাবে ভাষাটি এগিয়ে নেয়
- “Zero-overhead” নীতির আসল মানে, আর একই ভাষায় চার রকম চিন্তার ধরন
- পুরোনো C-ধাঁচের কোড আর আধুনিক C++ কোডের পার্থক্য, এবং AI-এর লেখা C++ যাচাইয়ের চেকলিস্ট
১ · স্বাগতম — এই কোর্স কীভাবে চলে
ABCL TECH-এর C++ কোর্সে আপনাকে আন্তরিক স্বাগতম। আপনি হয়তো স্কুল বা কলেজে পড়েন, হয়তো বিশ্ববিদ্যালয়ে Computer Science পড়ছেন, হয়তো চাকরির পরীক্ষার প্রস্তুতি নিচ্ছেন, কিংবা হয়তো আপনি এর মধ্যেই অন্য কোনো ভাষায় কাজ করেন। যেখান থেকেই আসুন — এই কোর্স আপনার জন্যই বানানো।
আগে C জানা থাকলে ভালো, কিন্তু জরুরি নয়। আমরা একদম শুরু থেকে শুরু করব। যাঁরা আমাদের C কোর্স শেষ করে এসেছেন, তাঁদের জন্য মাঝে মাঝে “C জানলে” নামে ছোট একটি বাক্স থাকবে — C-র সাথে কী মিল, কী আলাদা। যাঁরা C পড়েননি, তাঁরা বাক্সটি নিশ্চিন্তে বাদ দিতে পারেন।
এই কোর্সে ৮টি মডিউলে মোট ৫৫টি পর্ব আছে। প্রতিটি পর্ব একই ছাঁচে সাজানো, যাতে কয়েকটি পর্ব পড়ার পর আপনি জানেন কোথায় কী পাবেন:
কনসেপ্ট আগে
প্রথমে “কেন” আর “ভেতরে কী ঘটে” — তারপর কোড। মুখস্থ নয়, বোঝা। বাংলাদেশের চেনা উদাহরণ দিয়ে ব্যাখ্যা।
উপমা, ছবি, ইতিহাসধাপে ধাপে ডায়াগ্রাম
“পরে” বোতাম চেপে চেপে দেখবেন মেমরি, কোড বা প্রক্রিয়া কীভাবে বদলায় — স্থির ছবিতে যা বোঝানো যায় না।
প্রতি পর্বে অন্তত ৩টিচালানো যায় এমন কোড
প্রতিটি পর্বে ছোট, এক-ধারণার কোড, যা এই পাতাতেই “Run” চেপে চালাতে পারবেন। কিছু ইনস্টল না করেও শুরু করা যায়।
আধুনিক C++23কুইজ, পরীক্ষা, সার্টিফিকেট
প্রতি পর্বের শেষে কুইজ। লগইন করলে অগ্রগতি সেভ হয়; ড্যাশবোর্ডে মডিউল টেস্ট আর ফাইনাল পরীক্ষা দিয়ে সার্টিফিকেট নিতে পারবেন।
সম্পূর্ণ বিনামূল্যেঅগ্রগতির নিয়মটি সহজ। লগইন করলে (Google বা ইমেইল দিয়ে) প্রতিটি পর্বের শেষে “পড়া শেষ” চিহ্ন দিতে পারবেন, আর সেটা যেকোনো ডিভাইস থেকে দেখা যাবে। লগইন না করেও সব পড়া, কোড চালানো আর কুইজ দেওয়া যায় — শুধু অগ্রগতি জমা থাকে না। ড্যাশবোর্ডে প্রতিটি মডিউলের জন্য একটি করে টেস্ট (১৫টি প্রশ্ন, ২০ মিনিট) আর পুরো কোর্সের ফাইনাল পরীক্ষা (৪০টি প্রশ্ন, ৬০ মিনিট) আছে। সব পর্ব পড়া শেষ করে ফাইনালে ৬০% বা তার বেশি পেলে সার্টিফিকেট পাবেন।
আমরা আপনাকে আধুনিক C++ শেখাব — ২০১১ সালের পরের C++, যেটা আজ পেশাদার কোম্পানিগুলো লেখে। পুরোনো ধাঁচ দেখাব শুধু তখনই, যখন সেটা দেখলে বোঝা যায় নতুন নিয়মটা কেন এল। কারণ পুরোনো বই, পুরোনো টিউটোরিয়াল আর অনেক AI-এর উত্তর এখনো সেই পুরোনো ধাঁচেই লেখা — আপনাকে দুটোই চিনতে হবে।
২ · C++ আজ কোথায় চলে
একটি সন্ধ্যার কথা ভাবুন। আপনি Chrome খুলে YouTube-এ একটি ভিডিও দেখলেন। তারপর ফোনে একটি গেম খেললেন — হয়তো PUBG বা অন্য কোনো বড় 3D গেম। এরপর একটি AI অ্যাপে প্রশ্ন করলেন। এই তিনটি কাজের প্রতিটির ভেতরে বড় একটি অংশ C++-এ লেখা।
- ব্রাউজারে: Chrome-এর মূল অংশ (যার নাম Chromium) আর JavaScript চালানোর ইঞ্জিন V8 — দুটোই C++. Firefox-এর মূল অংশও বহু বছর ধরে C++-এ, এখন তার সাথে কিছু Rust-ও আছে।
- গেমে: Unreal Engine — যা দিয়ে বিশ্বের অনেক বড় গেম তৈরি — C++-এ লেখা, আর এর ওপর গেমের যুক্তিও প্রায়ই C++-এ লেখা হয়। প্রতি সেকেন্ডে ৬০ বা তার বেশি ছবি আঁকতে হলে প্রতিটি মিলিসেকেন্ড গুরুত্বপূর্ণ।
- AI-তে: আপনি Python-এ
import torchলেখেন, কিন্তু PyTorch আর TensorFlow-এর ভারী হিসাবের মূল অংশ C++ (আর GPU-র জন্য CUDA)-তে লেখা। Python সেখানে শুধু “রিমোট কন্ট্রোল”।
🎮 গেম ও গ্রাফিক্স
গেম ইঞ্জিন, 3D সফটওয়্যার, ভিডিও এডিটিং। প্রতিটি ফ্রেম কয়েক মিলিসেকেন্ডে আঁকতে হয়, মেমরির সাজানো পর্যন্ত হাতে নিয়ন্ত্রণ লাগে।
Unreal Engine, Adobe-র অনেক সফটওয়্যার🌐 ব্রাউজার ও ডেটাবেস
কোটি মানুষ প্রতিদিন ব্যবহার করেন — তাই প্রতিটি অপ্রয়োজনীয় কাজ মানে কোটি গুণ অপচয়।
Chrome, Firefox, MySQL, MongoDB💹 Trading ও ফিনান্স
শেয়ার-বাজারে খুব দ্রুত কেনাবেচার সিস্টেমে মাইক্রোসেকেন্ডের পার্থক্যেও লাভ-ক্ষতি হয়। এই ক্ষেত্রে C++ বহু বছর ধরে প্রধান ভাষা।
High-frequency trading🚗 এমবেডেড ও গাড়ি
গাড়ির ড্যাশবোর্ড, সেন্সর, রোবট, ড্রোন, চিকিৎসার যন্ত্র — ছোট হার্ডওয়্যারে নির্ভরযোগ্য, দ্রুত কোড।
Automotive, ROS (রোবটিক্স)🧠 AI/ML-এর ভিত
Deep learning framework-এর ভেতরের অংশ, AI মডেল চালানোর ইঞ্জিন, ফোনে AI চালানোর লাইব্রেরি।
PyTorch, TensorFlow🛠️ Compiler ও টুল
যে টুল দিয়ে অন্য প্রোগ্রাম বানানো হয়, সেগুলোও অনেক সময় C++-এ লেখা। LLVM/Clang C++-এ লেখা, আর GCC নিজেও ২০১০-এর দশকের শুরু থেকে C++-এ লেখা হয়।
LLVM, Clang, GCCবাংলাদেশে C++ — কনটেস্ট আর বিশ্ববিদ্যালয়
বাংলাদেশের প্রোগ্রামিং জগতে C++-এর একটি বিশেষ জায়গা আছে। ICPC, Codeforces, AtCoder, দেশের জাতীয় প্রোগ্রামিং প্রতিযোগিতা — এসব জায়গায় বেশিরভাগ প্রতিযোগী C++ ব্যবহার করেন। কারণ তিনটি: C++ দ্রুত চলে (সময়ের সীমা থাকে), এর standard library-তে তৈরি করা sort, map, priority queue-এর মতো হাতিয়ার আছে, আর প্রায় সব judge সিস্টেম এটি সমর্থন করে। অনেক বিশ্ববিদ্যালয়ে প্রথম দিকের প্রোগ্রামিং, Object-Oriented Programming আর Data Structure কোর্সও C++ দিয়ে পড়ানো হয়। এই কোর্সের পর্ব ৫০-এ আমরা কনটেস্টের জন্য C++ আলাদা করে দেখব।
ঢাকা মেট্রো রেলের কথা ভাবুন। যাত্রীরা দেখেন ঝকঝকে স্টেশন, টিকিট কার্ড, ডিসপ্লে বোর্ড। কিন্তু ট্রেন কখন থামবে, কতটা গতিতে চলবে, দুটি ট্রেনের মধ্যে কতটা দূরত্ব থাকবে — এগুলো ঠিক করে ভেতরের নিয়ন্ত্রণ-ব্যবস্থা, যেখানে দেরি বা ভুলের কোনো সুযোগ নেই। সফটওয়্যার জগতে C++ প্রায়ই সেই ভেতরের ব্যবস্থা — যেখানে গতি আর নির্ভরযোগ্যতা দুটোই একসাথে লাগে।
C++ সব জায়গার ভাষা নয় — ছোট একটি ওয়েবসাইট বা দ্রুত ডেটা বিশ্লেষণের জন্য Python বা JavaScript প্রায়ই ভালো পছন্দ। C++ জেতে সেখানে, যেখানে তিনটি জিনিস একসাথে লাগে: খুব বেশি গতি, মেমরি ও হার্ডওয়্যারের ওপর নিয়ন্ত্রণ, আর বড়, জটিল কোডকে সাজিয়ে রাখার উপায়।
৩ · জন্মকথা — C with Classes থেকে C++23
C++-এর গল্প শুরু একজন তরুণ গবেষকের একটি হতাশা থেকে। ডেনমার্কের Bjarne Stroustrup Cambridge-এ PhD করার সময় Simula নামের একটি ভাষায় কাজ করেছিলেন। Simula-তে প্রোগ্রামকে “বস্তু” (object) দিয়ে সাজানো যেত — বড় সিস্টেম ভাবা খুব সহজ হতো। কিন্তু সেটা ছিল ভীষণ ধীর। অন্যদিকে C ছিল দ্রুত, কিন্তু বড় প্রোগ্রাম সাজানোর এমন সুবিধা তাতে ছিল না।
১৯৭৯ সালে Stroustrup যোগ দিলেন AT&T Bell Labs-এ — সেই একই প্রতিষ্ঠান, যেখানে কয়েক বছর আগে C আর Unix তৈরি হয়েছিল। তিনি ঠিক করলেন: C-এর গতি রেখে তার সাথে Simula-র মতো class যোগ করবেন। নিচের ডায়াগ্রামে প্রতিটি ধাপে দেখুন, ভাষাটি কীভাবে বদলেছে — আর প্রতিটি যুগের কোড দেখতে কেমন।
- C
1972Bell Labs - C with Classes
1979Stroustrup - নাম C++
1983–85প্রথম প্রকাশ - C++98
ISOপ্রথম standard - C++11
2011আধুনিক যুগ - C++14…23
৩ বছর পরপরনিয়মিত ট্রেন
struct Account { int balance; };
void deposit(struct Account *a, int amt) {
a->balance += amt; // ডেটা আর কাজ আলাদা জায়গায়
}
class Account { int balance; // বাইরের কেউ সরাসরি ছুঁতে পারবে না public: void deposit(int amt) { balance += amt; } }; // (আজকের লেখার ধরনে দেখানো)
account.cpp --Cfront--> account.c --C compiler--> program // নতুন যোগ: virtual ফাংশন, overloading, reference ...
std::vector<int> v;
v.push_back(5);
v.push_back(2);
std::sort(v.begin(), v.end());
auto v = std::vector<int>{5, 2, 9}; for (int x : v) { ... } // range-for auto p = std::make_shared<Account>(); // smart pointer auto big = [](int x) { return x > 3; }; // lambda
std::ranges::sort(v); // C++20: ranges std::println("Total: {}", v.size()); // C++23: print
- ১৯৭২ — C. Bell Labs-এ Dennis Ritchie তৈরি করেন C. দ্রুত আর হার্ডওয়্যারের কাছাকাছি — কিন্তু ডেটা (
struct) আর তার ওপর কাজ (ফাংশন) আলাদা আলাদা থাকে। কে কোন ডেটা বদলাচ্ছে, বড় প্রোগ্রামে সেটা খুঁজে পাওয়া কঠিন। - ১৯৭৯ — C with Classes. Stroustrup C-এর ওপর যোগ করলেন
class— ডেটা আর তার কাজ এক বাক্সে, আর বাইরের কেউ ভেতরের ডেটায় সরাসরি হাত দিতে পারবে না। প্রথম লক্ষ্য ছিল বড় সিস্টেম সাজানো, কিন্তু C-এর গতি না হারিয়ে। - ১৯৮৩ — নাম হলো C++; ১৯৮৫ — প্রথম বাণিজ্যিক প্রকাশ।
++হলো C-তে “এক বাড়াও” অপারেটর — অর্থাৎ “C-এর এক ধাপ পরের”। প্রথম compiler Cfront C++ কোডকে C-তে অনুবাদ করত, তারপর সাধারণ C compiler বাকি কাজ করত। ১৯৮৫ সালে Stroustrup-এর বই “The C++ Programming Language”-ও প্রকাশিত হয়। - ১৯৯৮ — C++98, প্রথম আন্তর্জাতিক standard. ISO (আন্তর্জাতিক মান সংস্থা) C++-এর নিয়ম লিখিতভাবে ঠিক করে দেয় — এখন সব compiler একই নিয়ম মানবে। এতে যুক্ত হয় STL — vector, sort-এর মতো তৈরি হাতিয়ার। ২০০৩ সালের C++03 ছিল মূলত ভুল-সংশোধনের সংস্করণ।
- ২০১১ — C++11, আধুনিক C++-এর শুরু। প্রায় ১৩ বছর পর বড় পরিবর্তন:
auto, range-for, lambda, smart pointer, move semantics. অনেক দিন এটার কাজের নাম ছিল “C++0x” — কারণ আশা ছিল ২০০০-এর দশকেই বের হবে! Stroustrup নিজেই বলেছিলেন, C++11 প্রায় নতুন একটি ভাষার মতো লাগে। - ২০১৪ থেকে — প্রতি ৩ বছরে একটি ট্রেন। C++14 (ছোট উন্নতি), C++17 (optional, filesystem), C++20 (concepts, ranges, modules, coroutines), C++23 (
std::print,std::expected). C++26-এর কাজ এখন শেষ পর্যায়ে। ট্রেন নির্দিষ্ট সময়ে ছাড়ে — যে feature তৈরি, সে ওঠে; যে তৈরি নয়, সে পরের ট্রেনের অপেক্ষা করে।
C++-এর কোনো মালিক কোম্পানি নেই। ভাষার নিয়ম ঠিক করে ISO-র একটি কমিটি — আনুষ্ঠানিক নাম WG21. এতে বিভিন্ন দেশের compiler-নির্মাতা, বড় প্রযুক্তি কোম্পানি, বিশ্ববিদ্যালয় আর স্বাধীন বিশেষজ্ঞরা স্বেচ্ছায় কাজ করেন। যেকোনো নতুন feature লিখিত প্রস্তাব (proposal) হিসেবে জমা পড়ে, বহু আলোচনা আর ভোটের পর তবেই ভাষায় ঢোকে। আর GCC, Clang, Microsoft-এর MSVC — এই compiler-গুলো সেই নিয়ম অনুযায়ী নিজেদের তৈরি করে। একটি সংস্করণের নাম যে বছর দিয়ে, সেটা আসলে কাজ শেষ হওয়ার বছর; ISO-র আনুষ্ঠানিক প্রকাশ কখনো কখনো পরের বছরে গড়ায়।
এই একটি স্বপ্ন থেকেই C++-এর জন্ম
৪ · মূলমন্ত্র — যা ব্যবহার করবেন না, তার দাম দেবেন না
C++ বুঝতে হলে একটি নীতি বুঝলেই অর্ধেক কাজ হয়ে যায়। এর নাম zero-overhead principle. Stroustrup নিজে নীতিটি দুই ভাগে বলেছেন:
২. যা ব্যবহার করেন, সেটা আপনি নিজে হাতে লিখেও এর চেয়ে ভালো করতে পারতেন না।
একটি ভালো রিকশাওয়ালার কথা ভাবুন, যিনি পুরো শহর চেনেন। আপনি তাঁকে শুধু ঠিকানা বলেন — কোন গলি দিয়ে যাবেন, কোথায় বাঁক নেবেন, সেটা তিনিই ঠিক করেন। আপনি যদি নিজে রাস্তা চিনতেন, তবুও এর চেয়ে ছোট পথে যেতে পারতেন না। আর তাঁকে গলির নাম জিজ্ঞেস না করলে তিনি আপনাকে বাড়তি ভাড়াও চাইবেন না। C++-এর ভালো abstraction ঠিক এমন: আপনি বলেন কী চান, compiler সবচেয়ে ছোট পথে কীভাবে করবে ঠিক করে — বাড়তি খরচ ছাড়া।
কথাটা শুনতে সুন্দর, কিন্তু সত্যি কি? নিচের ডায়াগ্রামে একটি ছোট পরীক্ষা দেখুন। একই কাজ — ৫টি সংখ্যার যোগফল — একবার C-ধাঁচের raw array দিয়ে, একবার C++-এর std::array দিয়ে।
int marks[5] = {72, 85, 64, 90, 78};
int total = 0;
for (int i = 0; i < 5; i++)
total += marks[i];
std::array<int, 5> marks = {72, 85, 64, 90, 78}; int total = 0; for (int m : marks) total += m; // marks.size() জানা আছে, কপি করা যায়, ফাংশনে পাঠালে আকার হারায় না
; raw.cpp ; modern.cpp mov eax, 389 mov eax, 389 ret ret ; হুবহু একই! compiler যোগফল আগেই হিসাব করে ফেলেছে
marks[7] // কোনো যাচাই নেই — দ্রুত, কিন্তু ভুল হলে বিপদ marks.at(7) // সীমা যাচাই করে, ভুল হলে পরিষ্কার error দেয় // যাচাইয়ের ছোট খরচটা আপনি নিজে বেছে নিলেন
- পুরোনো উপায়। একটি সাধারণ array, হাতে লেখা আকার
5, আর index দিয়ে লুপ। কাজ করে, কিন্তু আকারটা দুই জায়গায় লেখা — একটা বদলালে অন্যটা ভুলে যাওয়া খুব সহজ। - আধুনিক উপায়।
std::arrayনিজের আকার নিজে মনে রাখে, আর range-for দিয়ে index ছাড়াই প্রতিটি উপাদানে যাওয়া যায়। লেখা পরিষ্কার, ভুলের জায়গা কম। প্রশ্ন হলো — এই বাড়তি সুবিধার জন্য কি প্রোগ্রাম ধীর হলো? - উত্তর: না। Optimization চালু করে (
-O2) compile করলে দুটো থেকে একই machine code তৈরি হয়। এই উদাহরণে সংখ্যাগুলো আগে থেকে জানা, তাই compiler যোগফল 389 নিজেই হিসাব করে বসিয়ে দিয়েছে।std::array-এর সব সুবিধা কাজ করেছে compile-এর সময়ে; চলার সময় তার কোনো চিহ্নই নেই। এটাই “zero-overhead”. - দাম দেবেন শুধু যদি চান।
[]দিয়ে পড়লে সীমা যাচাই হয় না — C-এর মতোই দ্রুত, C-এর মতোই ঝুঁকি।.at()দিয়ে পড়লে প্রতিবার সীমা যাচাই হয়, যার সামান্য খরচ আছে। C++ এই সিদ্ধান্ত আপনার হাতে দেয় — জোর করে কোনো খরচ চাপায় না। এই স্বাধীনতাই C++-এর শক্তি, আবার এটাই তার ঝুঁকিও।
“Zero-overhead” মানে “সব কিছু বিনামূল্যে” নয়। কিছু সুবিধার আসল খরচ আছে — যেমন virtual ফাংশন ডাকতে একটি বাড়তি ধাপ লাগে, আর exception-এর জন্য প্রোগ্রাম ফাইল একটু বড় হয়। নীতিটা হলো: সেই খরচ আপনি দেবেন শুধু তখনই, যখন সুবিধাটি ব্যবহার করবেন, আর সেই খরচ হাতে লেখা সমাধানের চেয়ে বেশি হবে না। পর্ব ৪৯-এ আমরা মেপে দেখব কোথায় আসলে সময় যায়।
৫ · একটি ভাষা, চার রকম চিন্তা
অনেক ভাষা একটি নির্দিষ্ট ধাঁচে চিন্তা করতে বাধ্য করে। C++ তা করে না — এটি একটি multi-paradigm ভাষা। “Paradigm” মানে সমস্যা সমাধানের চিন্তার ধরন। একই প্রোগ্রামে আপনি দরকার অনুযায়ী চারটি ধরন মিশিয়ে ব্যবহার করতে পারেন:
| ধরন | মূল চিন্তা | C++-এ চেহারা | কোর্সের কোথায় |
|---|---|---|---|
| Procedural | ধাপে ধাপে নির্দেশ — “প্রথমে এটা, তারপর ওটা” | ফাংশন, লুপ, if | মডিউল ২ |
| Object-oriented (OOP) | সমস্যাকে বস্তু আর তাদের দায়িত্বে ভাঙা | class, inheritance, virtual | পর্ব ০২, মডিউল ৪ |
| Generic | একবার লিখুন, যেকোনো টাইপে চলুক | template, STL | মডিউল ৫ |
| Functional-ধাঁচ | কাজকে ছোট ছোট ফাংশনের পাইপলাইন হিসেবে দেখা | lambda, ranges | পর্ব ৩৪–৩৫ |
এর বাইরে C++-এর আরও তিনটি মৌলিক বৈশিষ্ট্য আছে, যেগুলো এই কোর্সের প্রায় প্রতিটি পর্বে ফিরে আসবে:
- সরাসরি machine code-এ compile হয়। চালানোর আগেই পুরো কোড একটি compiler দিয়ে CPU-র ভাষায় (machine code) অনুবাদ হয়। চলার সময় কোনো interpreter বা virtual machine থাকে না — তাই গতি।
- Static typing. প্রতিটি ভ্যারিয়েবলের টাইপ compile-এর সময়েই ঠিক থাকে (static typing). সংখ্যার জায়গায় লেখা পাঠালে প্রোগ্রাম তৈরির আগেই compiler আপত্তি জানায় — ভুলটা গ্রাহকের হাতে পৌঁছানোর আগেই ধরা পড়ে।
- হাতে নিয়ন্ত্রণ, কিন্তু নিরাপদ উপায়ে — RAII. Java বা Python-এ একটি garbage collector মাঝে মাঝে এসে অব্যবহৃত মেমরি পরিষ্কার করে। C++-এ সেটা নেই। তার বদলে আছে RAII — যে বস্তু কোনো রিসোর্স (মেমরি, ফাইল, নেটওয়ার্ক সংযোগ) নেয়, সে নিজের কাজ শেষে নিজেই তা ফেরত দেয়, ঠিক নির্দিষ্ট মুহূর্তে। পর্ব ১৭-এ এটা বিস্তারিত দেখব।
RAII বোঝার জন্য একটি লাইব্রেরির কথা ভাবুন, যেখানে বই নিয়ে যাওয়ার সময় একটি কার্ড পান, আর লাইব্রেরি থেকে বের হওয়ার গেটেই কার্ডটা স্বয়ংক্রিয়ভাবে বই ফেরত নিয়ে নেয়। আপনাকে মনে রাখতে হয় না, আর ভুলে যাওয়ারও উপায় নেই। C-তে malloc করলে free করার কথা আপনাকেই মনে রাখতে হয়; C++-এর std::vector বা std::string নিজের মেমরি নিজেই ফেরত দেয়।
৬ · কোড থেকে চলমান প্রোগ্রাম — আপনার প্রথম আধুনিক C++
C++ কোড লিখে সরাসরি চালানো যায় না — আগে সেটাকে একটি প্রোগ্রাম ফাইলে পরিণত করতে হয়। পুরো প্রক্রিয়াটা পর্ব ০৩-এ খুঁটিয়ে দেখব; এখানে শুধু বড় ছবিটা দেখে নিন:
- আপনার কোড
cities.cppমানুষ পড়তে পারে - Compiler
g++ / clang++যাচাই ও অনুবাদ - Linker
+ libraryটুকরো জোড়া - Executable
cities.exeতৈরি প্রোগ্রাম - CPU চালায়
Total: 6আউটপুট
- আপনি কোড লেখেন। একটি সাধারণ টেক্সট ফাইল, নাম সাধারণত
.cppদিয়ে শেষ হয়। এটা মানুষের জন্য লেখা — CPU এর একটি অক্ষরও সরাসরি বোঝে না। - Compiler যাচাই করে, তারপর অনুবাদ করে। প্রথমে দেখে ব্যাকরণ আর টাইপ ঠিক আছে কি না — ভুল থাকলে এখানেই থেমে error দেখায়। ঠিক থাকলে কোডকে machine code-এ অনুবাদ করে, আর optimization চালু থাকলে কোডকে আরও দ্রুত করার উপায় খোঁজে। Zero-overhead-এর জাদু ঘটে এই ধাপেই।
- Linker টুকরোগুলো জোড়া দেয়। আপনি
std::printlnনিজে লেখেননি — সেটার কোড আছে standard library-তে। Linker আপনার অনুবাদ করা কোডের সাথে library-র দরকারি অংশ জুড়ে দেয়। - তৈরি হলো executable. একটি সম্পূর্ণ প্রোগ্রাম ফাইল (executable) — Windows-এ সাধারণত
.exe. এখন আর compiler লাগবে না; ফাইলটা যতবার খুশি চালানো যায়। - OS প্রোগ্রামটা মেমরিতে আনে, CPU চালায়। চলার সময় কোনো অনুবাদ হয় না — CPU সরাসরি নির্দেশগুলো পালন করে। এজন্যই C++ প্রোগ্রাম দ্রুত চালু হয় আর দ্রুত চলে। এই পাতার “Run” বোতামও আড়ালে একটি সার্ভারে ঠিক এই ধাপগুলো করে।
এবার আপনার প্রথম আধুনিক C++ প্রোগ্রাম। এখানে বাংলাদেশের কয়েকটি বিভাগীয় শহরের নাম একটি তালিকায় রাখা হয়েছে, তারপর একে একে ছাপা হচ্ছে, শেষে একটি নতুন শহর যোগ করে মোট সংখ্যা গোনা হচ্ছে। এখনই প্রতিটি শব্দ বোঝার দরকার নেই — শুধু খেয়াল করুন কোডটা কতটা পড়ার মতো। “Run” চাপুন:
#include <print>
#include <string>
#include <vector>
int main() {
std::vector<std::string> cities = {"Dhaka", "Chattogram", "Rajshahi",
"Khulna", "Sylhet"};
for (const auto& city : cities) {
std::println("- {}", city);
}
cities.push_back("Barishal"); // list grows by itself
std::println("Total cities: {}", cities.size());
std::println("Last added: {}", cities.back());
}std::vector<std::string> মানে “লেখার (string) একটি তালিকা” — এই তালিকা দরকারমতো নিজে বড় হয় (std::vector). for (const auto& city : cities) হলো range-for: “তালিকার প্রতিটি শহরের জন্য” — কোনো index বা আকার হাতে গুনতে হয় না। std::println (C++23 থেকে) {}-এর জায়গায় মান বসিয়ে এক লাইন ছাপে (std::println). push_back দিয়ে নতুন শহর যোগ হলো, আর size() নিজেই বলে দিল এখন ৬টি। কোথাও মেমরি চাওয়া বা ফেরত দেওয়ার কোড নেই — vector নিজেই সামলায়। খেয়াল করুন, main-এর শেষে return 0;-ও নেই: C++-এ main-এর জন্য এটা না লিখলে ধরে নেওয়া হয় 0 ফেরত গেছে।
৭ · পুরোনো ধাঁচ বনাম আধুনিক C++
C++ শুরুতে C-কে প্রায় পুরোটাই নিজের ভেতরে রেখে দিয়েছিল। ফলে আজও প্রায় যেকোনো C-ধাঁচের কোড C++ compiler-এ চলে। এটা সুবিধা — পুরোনো কোড ফেলে দিতে হয় না। আবার এটাই সমস্যা — অনেকেই “C++” নামে আসলে C লেখেন, আর C-এর সব ঝুঁকি সাথে নিয়ে আসেন।
একটি ছোট কাজ ধরা যাক: কয়েকজন শিক্ষার্থীর নম্বরের যোগফল। নিচের ডায়াগ্রামে দেখুন পুরোনো কোড ধাপে ধাপে কীভাবে আধুনিক হয়, আর প্রতিটি ধাপে কোন ঝুঁকি দূর হয়:
int n = 5; int* marks = (int*)malloc(n * sizeof(int)); marks[0] = 72; marks[1] = 85; /* ... */ int total = 0; for (int i = 0; i < n; i++) total += marks[i]; free(marks);
int* marks = (int*)malloc(n * sizeof(int)); // ✗ malloc ব্যর্থ হলে? for (int i = 0; i <= n; i++) // ✗ একটি বেশি — সীমার বাইরে total += marks[i]; // ✗ free() ভুলে গেলে — memory leak // ✗ free()-এর পরে marks ব্যবহার করলে — undefined behavior
std::vector<int> marks = {72, 85, 64, 90, 78}; int total = 0; for (std::size_t i = 0; i < marks.size(); i++) total += marks[i]; // malloc নেই, free নেই — vector নিজেই ফেরত দেয় (RAII)
std::vector<int> marks = {72, 85, 64, 90, 78};
int total = 0;
for (int m : marks)
total += m;
// <= না < — এই ভুলের সুযোগই আর নেই
std::vector<int> marks = {72, 85, 64, 90, 78};
int total = std::ranges::fold_left(marks, 0, std::plus{}); // C++23
// অথবা পুরোনো standard-এ: std::accumulate(marks.begin(), marks.end(), 0)
- C-ধাঁচের কোড। মেমরি হাতে চাওয়া (
malloc), আকার আলাদা ভ্যারিয়েবলে, index দিয়ে লুপ, শেষে হাতে ফেরত দেওয়া (free). C++ compiler এটা মেনে নেয় — কিন্তু প্রতিটি লাইনে দায়িত্ব পুরোটাই আপনার। - ভুলের জায়গাগুলো দেখুন। লুপে
<-এর বদলে<=লিখলেই array-র সীমার বাইরে পড়া।freeভুলে গেলে মেমরি আটকে থাকে (memory leak). ফেরত দেওয়ার পরও ব্যবহার করলে undefined behavior — প্রোগ্রাম কী করবে কেউ বলতে পারে না। পৃথিবীর বহু নিরাপত্তা-ত্রুটি ঠিক এই ধরনের ভুল থেকে আসে। std::vectorনিল মেমরির দায়িত্ব। vector নিজের আকার জানে (size()), আর কাজ শেষে নিজেই মেমরি ফেরত দেয়।malloc/freeজোড়া মেলানোর ঝামেলা পুরোপুরি চলে গেল — দুটি বড় ঝুঁকিও।- Range-for নিল index-এর দায়িত্ব। “প্রতিটি নম্বরের জন্য” — সরাসরি এটাই লেখা। index নেই, তাই index ভুল হওয়ারও সুযোগ নেই। কোড পড়েই বোঝা যায় এটা কী করছে।
- উদ্দেশ্যটাই কোড। C++23-এর
std::ranges::fold_left(বা পুরোনোstd::accumulate) এক লাইনে বলে: “সবগুলো যোগ করো, 0 থেকে শুরু করে।” লুপটা library-র ভেতরে, পরীক্ষিত। আর optimization চালু থাকলে এর গতিও সাধারণত হাতে লেখা লুপের সমানই — zero-overhead.
এবার নিজে চালিয়ে দেখুন। নিচের প্রোগ্রামে একই নম্বরগুলো দুইভাবে যোগ করা হয়েছে — প্রথমে C-ধাঁচে, তারপর আধুনিক C++-এ। দুটোর ফল কি একই আসে?
#include <algorithm>
#include <cstdio>
#include <functional>
#include <print>
#include <vector>
int main() {
// Old style: raw array, size counted by hand, index loop
int marks_c[] = {72, 85, 64, 90, 78};
int n = sizeof(marks_c) / sizeof(marks_c[0]);
int total_c = 0;
for (int i = 0; i < n; i++) {
total_c += marks_c[i];
}
std::printf("Old style total: %d\n", total_c);
// Modern: the vector knows its size, no index needed
std::vector<int> marks = {72, 85, 64, 90, 78};
int total = std::ranges::fold_left(marks, 0, std::plus{});
std::println("Modern total: {} (from {} students)", total, marks.size());
}দুই লাইনেই যোগফল 389. পুরোনো অংশে আকার বের করতে হয়েছে একটি কৌশলে — পুরো array-র বাইট সংখ্যাকে একটি উপাদানের বাইট দিয়ে ভাগ (sizeof). এই কৌশল array-কে ফাংশনে পাঠালেই আর কাজ করে না, যা নতুনদের খুব পরিচিত একটি ফাঁদ। আধুনিক অংশে marks.size() সবসময় সঠিক আকার বলে, আর fold_left (C++23 থেকে) যোগ করার কাজটা এক লাইনে সারে। std::plus{} মানে “দুটো মান যোগ করার নিয়ম”। printf-এ %d লিখে টাইপ মেলানোর দায়িত্ব আপনার; println-এর {} টাইপ নিজেই বুঝে নেয়।
C জানলে — C-এর প্রায় সব কিছু C++-এ একইভাবে আছে: int, if, for, ফাংশন, pointer, এমনকি printf-ও। তবে C++ পুরোপুরি C-এর “superset” নয় — যেমন C-তে int *p = malloc(...) cast ছাড়া চলে, C++-এ চলে না। সবচেয়ে বড় পার্থক্য অভ্যাসে: C-তে যে কাজ হাতে করতেন (মেমরি, স্ট্রিং, array-র আকার), আধুনিক C++-এ সেটা দেন library-র হাতে। C কেন এত গুরুত্বপূর্ণ, তার পুরো ছবি পাবেন আমাদের C কোর্সের C কেন? পর্বে।
৮ · C, C++, Python, Java, Rust — সৎ তুলনা
“কোন ভাষা সেরা?” — এই প্রশ্নের সৎ উত্তর হলো, “কোন কাজের জন্য?” প্রতিটি ভাষা কিছু একটা দাম দিয়ে অন্য কিছু কেনে। নিচের টেবিলটা সাধারণ প্রবণতা দেখায়, কঠিন নিয়ম নয়:
| বিষয় | C | C++ | Python | Java | Rust |
|---|---|---|---|---|---|
| গতি | খুব বেশি | খুব বেশি | তুলনামূলক ধীর | বেশ ভালো | খুব বেশি |
| কীভাবে চলে | machine code | machine code | interpreter | JVM (virtual machine) | machine code |
| মেমরি সামলায় কে | আপনি, হাতে | আপনি, তবে RAII সাহায্য করে | garbage collector | garbage collector | compiler-এর মালিকানা-নিয়ম |
| মেমরি-নিরাপত্তা | কম | মাঝারি — আধুনিক ধাঁচে অনেক ভালো | বেশি | বেশি | বেশি (ডিফল্টভাবে) |
| শেখা কতটা কঠিন | ভাষা ছোট, ঝুঁকি বড় | অনেক বড় ভাষা, ধীরে শিখতে হয় | সবচেয়ে সহজ | মাঝারি | শুরুতে কঠিন |
| বেশি দেখা যায় | OS, firmware | গেম, ব্রাউজার, trading, AI ইঞ্জিন | ডেটা, AI, স্ক্রিপ্ট | ব্যাংকিং ব্যাকএন্ড, Android | নতুন সিস্টেম সফটওয়্যার |
টেবিল থেকে একটি জিনিস স্পষ্ট: গতি আর নিয়ন্ত্রণে C++-এর পাশে আছে শুধু C আর Rust. C-এর তুলনায় C++ বড় প্রোগ্রাম সাজানোর অনেক বেশি উপায় দেয়। Rust-এর তুলনায় C++-এর পেছনে আছে চার দশকের কোড, লাইব্রেরি, টুল আর অভিজ্ঞ প্রোগ্রামার। আর Python-Java-এর তুলনায় C++ দেয় চলার সময়ে বাড়তি খরচ ছাড়া কাজ করার ক্ষমতা — যার দাম হলো শেখার কষ্ট আর বেশি দায়িত্ব।
AI-এর যুগে কেন এখনো C++ শিখবেন
- গতির কাজ ফুরোবে না। AI মডেল যত বড় হচ্ছে, তাদের চালানোর ইঞ্জিন তত দ্রুত হওয়া দরকার। সেই ইঞ্জিনগুলো লেখা হয় মূলত C++ আর CUDA-তে। AI-এর জনপ্রিয়তা C++-এর চাহিদা কমায়নি, বরং পারফরম্যান্সের কাজে বাড়িয়েছে।
- AI-এর লেখা কোড বুঝতে হবে। AI দ্রুত কোড দেয়, কিন্তু C++-এ একটি ছোট ভুল মানে crash বা নিরাপত্তা-ত্রুটি। যিনি মেমরি, lifetime আর undefined behavior বোঝেন, শুধু তিনিই সেই ভুল ধরতে পারেন।
- ইন্টারভিউ আর প্রতিযোগিতা। কোডিং ইন্টারভিউ আর কনটেস্ট প্রোগ্রামিংয়ে C++ খুব জনপ্রিয়, আর অনেক সিস্টেম-লেভেলের চাকরির ইন্টারভিউতে C++-এর গভীর প্রশ্ন আসে।
- অন্য সব ভাষা বোঝা সহজ হয়। C++ শিখলে আপনি জানবেন stack আর heap কী, object আসলে মেমরিতে কীভাবে থাকে, compiler কী করে। এরপর Java, C#, Rust বা Python-এর ভেতরের কাজ বোঝা অনেক সহজ হয়ে যায়।
পরীক্ষা ও ইন্টারভিউতে — বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই বিষয়ে প্রায়ই যেসব প্রশ্ন আসে:
- C++ কে তৈরি করেন, কখন? Bjarne Stroustrup, Bell Labs-এ; কাজ শুরু ১৯৭৯ সালে “C with Classes” নামে, ১৯৮৩ সালে নাম হয় C++.
- C আর C++-এর মূল পার্থক্য কী? C procedural; C++ multi-paradigm — class, template, exception, RAII, বড় standard library যোগ করে, কিন্তু C-এর গতি রাখে।
- C++ কি C-এর superset? প্রায়, কিন্তু পুরোপুরি নয় — কিছু বৈধ C কোড C++-এ চলে না (যেমন cast ছাড়া
malloc-এর ফল বসানো)। - Zero-overhead principle কী? যা ব্যবহার করেন না তার দাম নেই; যা ব্যবহার করেন তা হাতে লিখেও এর চেয়ে ভালো করা যেত না।
- “Modern C++” বলতে কী বোঝায়? সাধারণত C++11 ও তার পরের standard-এর ধাঁচ — auto, range-for, smart pointer, move semantics, lambda.
৯ · কোর্সের মানচিত্র ও পড়ার কৌশল
পুরো কোর্সটি ৮টি মডিউলে ভাগ করা। প্রতিটি মডিউল আগেরটির ওপর দাঁড়িয়ে আছে, তাই ক্রম মেনে পড়াই সবচেয়ে ভালো। যেকোনো মডিউলের প্রথম পর্বে সরাসরি যেতে নিচের লিংকে চাপুন:
| মডিউল | বিষয় | পর্ব | শুরু করুন |
|---|---|---|---|
| ১ | ভিত্তি — C++ দিয়ে ভাবা | ০১–০৫ | C++ কেন? (এই পর্ব) |
| ২ | ভাষার মূল যন্ত্রপাতি — অপারেটর, I/O, লুপ, ফাংশন, reference | ০৬–১২ | অপারেটর |
| ৩ | মেমরি, স্ট্রিং আর রিসোর্স — vector, pointer, RAII | ১৩–১৯ | vector ও array |
| ৪ | অবজেক্ট-ওরিয়েন্টেড ডিজাইন | ২০–২৭ | class ও object |
| ৫ | জেনেরিক প্রোগ্রামিং ও STL | ২৮–৩৫ | function template |
| ৬ | আধুনিক C++ — move, constexpr, concepts, C++20/23 | ৩৬–৪৩ | move semantics |
| ৭ | সিস্টেম ও প্রজেক্ট — ফাইল, থ্রেড, CMake, টেস্টিং | ৪৪–৫১ | ফাইল I/O ও filesystem |
| ৮ | পরীক্ষা ও ইন্টারভিউ প্রস্তুতি | ৫২–৫৫ | আউটপুট কী হবে? |
মাঝখানে পর্ব ১৯-এ একটি মাঝপথের প্রজেক্ট আর পর্ব ৫১-এ একটি ক্যাপস্টোন প্রজেক্ট আছে — শেখা জিনিস দিয়ে আসল কিছু বানানোর জন্য।
কীভাবে পড়লে সবচেয়ে বেশি লাভ
- প্রতিটি ডায়াগ্রাম নিজে চালান। শুধু পড়ে গেলে চলবে না — “পরে” চাপার আগে ভাবুন, পরের ধাপে কী হবে। অনুমান মিলল কি না দেখুন।
- কোড চালান, তারপর বদলান। একটি সংখ্যা বদলান, একটি লাইন মুছুন — দেখুন কী হয়। error এলে ভয় নেই; error পড়তে শেখাও এই কোর্সের অংশ।
- ভাবনার প্রশ্নগুলো এড়িয়ে যাবেন না। উত্তর দেখার আগে নিজে দুই মিনিট ভাবুন। এগুলোই আপনাকে “syntax জানা” থেকে “সিস্টেম বোঝা”-র দিকে নিয়ে যাবে।
- সপ্তাহে কয়েকটি পর্ব, নিয়মিত। একদিনে দশটি পর্বের চেয়ে প্রতিদিন একটি পর্ব অনেক বেশি কাজের। প্রতিটি মডিউল শেষে ড্যাশবোর্ডের মডিউল টেস্টটি দিন।
- নিজের কম্পিউটারে সেটআপ করুন। পাতার “Run” দিয়ে শুরু করা যায়, কিন্তু পর্ব ০৩-এ নিজের কম্পিউটারে compiler বসানো শিখে নিন — আসল প্রজেক্টে এটাই লাগবে।
১০ · AI-এর যুগে — পুরোনো ধাঁচের C++ চেনা
ChatGPT, Claude, Copilot — সবাই C++ লিখতে পারে, আর খুব দ্রুত। কিন্তু এদের শেখার উপাদানের বড় অংশ ইন্টারনেটের পুরোনো কোড, পুরোনো টিউটোরিয়াল আর পুরোনো প্রশ্নোত্তর। তাই আলাদা করে না বললে AI প্রায়ই ২০০০-এর দশকের ধাঁচে C++ লেখে। কোড চলে, কিন্তু ঝুঁকিও সাথে আসে।
| AI প্রায়ই লেখে | সমস্যা | আধুনিক বিকল্প |
|---|---|---|
int* a = new int[n]; ... delete[] a; | delete ভুলে গেলে leak; ভুল delete-এ undefined behavior | std::vector<int> |
char name[20]; strcpy(name, s); | ২০ অক্ষরের বেশি এলে মেমরি নষ্ট — buffer overflow | std::string |
#define MAX 100 | টাইপ নেই, scope নেই, debug করা কঠিন | constexpr int max = 100; |
NULL, (int)x-এর মতো C-ধাঁচের cast | অস্পষ্ট, ভুল রূপান্তর লুকিয়ে ফেলে | nullptr, static_cast<int>(x) |
#include <bits/stdc++.h> + using namespace std; | কনটেস্টে চলে, কিন্তু standard নয় — সব compiler-এ নেই, বড় প্রজেক্টে নামের সংঘাত | দরকারি header আলাদা করে, std:: লিখে |
সমাধান সহজ — AI-কে শুরুতেই বলে দিন আপনি কোন C++ চান, আর কোন কোন জিনিস চান না। নিচের prompt-টি কপি করে নিজের কাজ অনুযায়ী বদলে নিন:
AI-এর লেখা C++ হাতে পেলে — যাচাইয়ের চেকলিস্ট
আধুনিক আর পুরোনো C++-এর পার্থক্য যিনি চেনেন, AI তাঁর হাতেই নিরাপদ।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। এগুলোই আপনাকে কোড-লেখক থেকে সিস্টেম-চিন্তক বানাবে।
প্র ০১C++ এত বড় আর জটিল কেন? পুরোনো জিনিস বাদ দিয়ে একটি পরিষ্কার ভাষা বানালেই তো হতো?
C++-এর জটিলতার মূলে আছে একটি সচেতন সিদ্ধান্ত: পুরোনো কোড ভাঙা যাবে না (backward compatibility). শুরু থেকেই Stroustrup চেয়েছিলেন, C-এর বিপুল কোড আর C প্রোগ্রামারদের অভিজ্ঞতা যেন সরাসরি কাজে লাগে। এই সিদ্ধান্তই C++-কে জনপ্রিয় করেছে — কোম্পানিগুলো পুরোনো C কোড ফেলে না দিয়েই ধীরে ধীরে C++-এ যেতে পেরেছে।
কিন্তু দাম আছে। প্রতিটি নতুন standard নতুন উপায় যোগ করে, পুরোনো উপায় সাধারণত সরায় না। ফলে আজ একই কাজ করার তিন-চারটি পথ আছে: লেখা রাখতে char* না std::string, array না vector, raw pointer না smart pointer, printf না cout না println. নতুন শিক্ষার্থী বুঝতে পারেন না কোনটা বেছে নেবেন — আর পুরোনো বই ও AI প্রায়ই ভুলটা দেখায়।
পুরোনো জিনিস সরানো কেন এত কঠিন? কারণ পৃথিবীতে কোটি কোটি লাইন C++ কোড চলছে — ব্যাংকে, বিমানে, হাসপাতালের যন্ত্রে। একটি feature সরালে সেই কোড compile হওয়া বন্ধ হয়ে যাবে, আর সবকিছু নতুন করে লেখা ও পরীক্ষা করার খরচ বিশাল। তবুও কমিটি খুব সাবধানে কিছু জিনিস সরিয়েছে — যেমন পুরোনো auto_ptr (C++17-এ বাদ)। Python 2 থেকে Python 3-এ যাওয়ার সময় পুরোনো কোড ভেঙেছিল, আর পুরো জগৎ বদলাতে প্রায় এক দশক লেগেছিল — C++ কমিটি সেই অভিজ্ঞতা ভালোভাবেই জানে।
Stroustrup-এর একটি বিখ্যাত উক্তি আছে: C++-এর ভেতরে একটি অনেক ছোট ও পরিষ্কার ভাষা বেরিয়ে আসার জন্য লড়ছে। আধুনিক C++ শেখা মানে ঠিক সেই ছোট ভাষাটি খুঁজে নেওয়া — আর C++ Core Guidelines (২০১৫ সালে Stroustrup ও Herb Sutter শুরু করেন) সেই পথ দেখায়। এই কোর্সও সেভাবে সাজানো: আমরা আধুনিক উপায়টা আগে শিখব, পুরোনোটা দেখব শুধু চিনে রাখার জন্য।
মূল উপলব্ধি: C++-এর জটিলতা কোনো দুর্ঘটনা নয় — চার দশকের কোডকে সম্মান করার দাম। আপনাকে পুরো ভাষা জানতে হবে না; জানতে হবে কোন অংশটা আধুনিক ও নিরাপদ, আর পুরোনো অংশ দেখলে চিনতে পারা।
প্র ০২C++ কি “অনিরাপদ” ভাষা? Memory safety নিয়ে এত আলোচনা কেন?
Memory safety মানে প্রোগ্রাম যেন ভুল মেমরিতে হাত না দেয় — array-র সীমার বাইরে লেখা, মুছে ফেলা মেমরি আবার ব্যবহার করা, বা কোনো কিছু না রেখেই পড়া। C আর C++ এগুলো স্বয়ংক্রিয়ভাবে আটকায় না, কারণ প্রতিবার যাচাই করলে গতি কমে — সেই zero-overhead-এর দর্শন।
সমস্যাটা বাস্তব। Microsoft ২০১৯ সালে জানায়, তাদের সফটওয়্যারে প্রতি বছর যত নিরাপত্তা-ত্রুটি ঠিক করা হয়, তার প্রায় ৭০% মেমরি-নিরাপত্তার ভুল। Google-এর Chromium প্রজেক্টও গুরুতর নিরাপত্তা-ত্রুটির ক্ষেত্রে প্রায় একই হিসাব দেয়। এরপর যুক্তরাষ্ট্রের NSA (২০২২) আর হোয়াইট হাউসের একটি প্রযুক্তি দপ্তর (২০২৪) প্রতিষ্ঠানগুলোকে memory-safe ভাষার দিকে যেতে পরামর্শ দেয়, আর C ও C++-কে উদাহরণ হিসেবে উল্লেখ করে। C++ জগতে এটা বড় আলোড়ন তোলে।
কিন্তু পুরো ছবিটা আরও সূক্ষ্ম। এই ভুলগুলোর বড় অংশ আসে C-ধাঁচের C++ থেকে — raw pointer, হাতে new/delete, char array, সীমা না দেখে index. আধুনিক C++ (vector, string, smart pointer, RAII, .at(), span) এই ঝুঁকির অনেকটাই কমায়, যদিও পুরোপুরি দূর করে না — যেমন dangling reference এখনো সম্ভব। পাশাপাশি টুলও অনেক এগিয়েছে: sanitizer, static analyzer, fuzzing. আর কমিটি C++26-এ standard library-র জন্য বাড়তি সীমা-যাচাইয়ের (hardening) মতো নিরাপত্তা-ব্যবস্থা যোগ করেছে।
অর্থাৎ প্রশ্নটা “C++ নিরাপদ না অনিরাপদ” নয়। প্রশ্ন হলো: আপনি কোন C++ লিখছেন? C-ধাঁচে লিখলে C-এর সব ঝুঁকি থাকবে। আধুনিক ধাঁচে লিখলে, warning আর sanitizer চালু রাখলে ঝুঁকি অনেক কমে যায় — যদিও Rust-এর মতো compiler-এর কঠোর গ্যারান্টি পাবেন না। পর্ব ১৮ আর ৪৩-এ আমরা এই বিপদগুলো সরাসরি দেখব।
মূল উপলব্ধি: C++ আপনাকে নিয়ন্ত্রণ দেয়, আর নিয়ন্ত্রণের সাথে আসে দায়িত্ব। আধুনিক ধাঁচ, ভালো টুল আর সতর্ক অভ্যাস — এই তিনটিই একজন পেশাদার C++ প্রোগ্রামারের নিরাপত্তা-জাল।
প্র ০৩Rust-এর মতো নতুন ভাষা থাকা সত্ত্বেও গেম ইঞ্জিন আর trading কোম্পানিগুলো কেন এখনো C++ বেছে নেয়?
এই দুই জগতের একটি মিল আছে: দুটোই নির্দিষ্ট সময়ের মধ্যে কাজ শেষ করতে চায়। একটি গেমকে সেকেন্ডে ৬০টি ছবি আঁকতে হলে প্রতিটি ছবির জন্য সময় মাত্র প্রায় ১৬ মিলিসেকেন্ড। একটি trading সিস্টেমকে বাজারের খবর পেয়ে মাইক্রোসেকেন্ডের মধ্যে সিদ্ধান্ত নিতে হয়। এখানে “গড়ে দ্রুত” যথেষ্ট নয় — প্রতিবার দ্রুত হতে হবে।
Garbage collector-ওয়ালা ভাষায় (Java, C#) মাঝে মাঝে মেমরি পরিষ্কারের জন্য ছোট বিরতি আসতে পারে — গেমে সেটা হঠাৎ ঝাঁকুনি, trading-এ হাতছাড়া সুযোগ। C++-এ মেমরি কখন নেওয়া আর ফেরত দেওয়া হবে, সেটা প্রোগ্রামার নিজে ঠিক করেন। তার ওপর ডেটা মেমরিতে কীভাবে পাশাপাশি সাজানো থাকবে, সেটাও নিয়ন্ত্রণ করা যায় — আধুনিক CPU-তে cache-এর সুবিধা নিতে এটা বিশাল পার্থক্য গড়ে।
Rust এই দিক দিয়ে C++-এর সমান সক্ষম, আর নিরাপত্তায় এগিয়ে। তাহলে কেন সবাই Rust-এ যায় না? কারণগুলো মূলত বাস্তব, প্রযুক্তিগত নয়:
- বিদ্যমান কোড: Unreal Engine-এর মতো ইঞ্জিনে কয়েক দশকের কাজ জমে আছে। নতুন করে লেখা মানে বছরের পর বছর আর বিপুল খরচ, এবং নতুন বাগের ঝুঁকি।
- ইকোসিস্টেম: গেম কনসোলের SDK, গ্রাফিক্স ও ফিজিক্স লাইব্রেরি, trading-এর বিশেষ নেটওয়ার্ক টুল — অনেক কিছুই প্রথমে C++-এর জন্য বানানো।
- মানুষ: অভিজ্ঞ C++ প্রকৌশলী অনেক; দল বদলানো ভাষা বদলানোর চেয়েও কঠিন।
তবে ছবিটা বদলাচ্ছে। নতুন প্রজেক্টে, বিশেষ করে নিরাপত্তা যেখানে প্রধান, Rust ক্রমে জায়গা নিচ্ছে। অনেক কোম্পানি একই সিস্টেমে দুটোই ব্যবহার করে।
মূল উপলব্ধি: প্রযুক্তি বাছাই শুধু “কোন ভাষা ভালো” প্রশ্ন নয় — বিদ্যমান কোড, লাইব্রেরি, দল আর ঝুঁকির হিসাবও। C++ জানলে আপনি এই বিপুল বিদ্যমান জগতে কাজ করতে পারবেন, আর Rust শেখাও অনেক সহজ হবে।
প্র ০৪Google কেন Carbon নিয়ে পরীক্ষা করছে, আর Microsoft কেন Rust-এ বিনিয়োগ করছে? একজন নতুন শিক্ষার্থীর জন্য এর মানে কী?
বড় প্রযুক্তি কোম্পানিগুলোর হাতে কোটি কোটি লাইন C++ কোড আছে, আর তারা দুটো জিনিস একসাথে চায় — C++-এর গতি, এবং আরও বেশি নিরাপত্তা ও সহজ লেখা। এই চাওয়া থেকে কয়েকটি আলাদা পথ তৈরি হয়েছে:
- Carbon (Google-এর প্রকৌশলীদের উদ্যোগ, ২০২২ সালে ঘোষণা): একটি পরীক্ষামূলক ভাষা, যার লক্ষ্য বিদ্যমান C++ কোডের সাথে পাশাপাশি চলা আর ধীরে ধীরে তার উত্তরসূরি হওয়া — যেমন Kotlin জাভার পাশে চলে। এটা এখনো পরীক্ষার পর্যায়ে; উৎপাদনের কাজে ব্যবহারের জন্য প্রস্তুত নয়।
- Rust: Microsoft Windows-এর কিছু অংশ, Google Android-এর নতুন কিছু অংশ Rust-এ লিখছে, আর Linux kernel-এও ২০২২ সাল থেকে Rust-এ কোড লেখার সুযোগ যোগ হয়েছে। মূল কারণ memory safety.
- C++-এর ভেতর থেকে সংস্কার: Herb Sutter-এর cppfront-এর মতো পরীক্ষা, C++ Core Guidelines, আর standard-এ নিরাপত্তা বাড়ানোর প্রস্তাব।
খেয়াল করুন, এর কোনোটিই বলছে না “C++ কোড ফেলে দাও।” বরং সবগুলো পথই ধরে নিচ্ছে যে বিদ্যমান C++ বহু দশক চলবে, আর তার সাথে মিলে চলতে হবে। Carbon তো স্পষ্টভাবেই C++-এর সাথে যোগাযোগকে প্রধান লক্ষ্য বানিয়েছে।
একজন শিক্ষার্থীর জন্য এর অর্থ তিনটি। প্রথমত, C++-এর চাকরি আর কাজ দীর্ঘদিন থাকবে — বিদ্যমান সিস্টেম চালু রাখা, উন্নত করা আর নতুন ভাষার সাথে জোড়া দেওয়ার জন্য। দ্বিতীয়ত, ভাষা বদলায়, কিন্তু ধারণা থাকে: মালিকানা (ownership), lifetime, RAII, zero-overhead abstraction — C++-এ যা শিখবেন, Rust-এ প্রায় একই ধারণা আরও কঠোর নিয়মে পাবেন। তৃতীয়ত, আধুনিক ও নিরাপদ C++ লেখার অভ্যাস এখন আরও বেশি মূল্যবান, কারণ শিল্পজগৎ ঠিক সেটাই খুঁজছে।
মূল উপলব্ধি: নতুন ভাষার আগমন C++-এর মৃত্যু নয়, বরং C++-এর শিক্ষাগুলোর স্বীকৃতি। ভালো করে C++ শিখলে আপনি ভবিষ্যতের যেকোনো সিস্টেম ভাষার জন্য প্রস্তুত থাকবেন।
প্র ০৫C++ কমিটি কেন ঠিক প্রতি ৩ বছর পরপর নতুন standard বের করে? “Feature তৈরি হলে বের করো” — এটাই কি বেশি যুক্তিসংগত নয়?
উত্তরটা আছে C++11-এর ইতিহাসে। C++98-এর পর পরের বড় সংস্করণের কাজের নাম ছিল “C++0x” — অর্থাৎ ধরে নেওয়া হয়েছিল ২০০x সালে, মানে এই দশকেই বের হবে। কিন্তু কমিটি সিদ্ধান্ত নিয়েছিল “যখন সব বড় feature তৈরি হবে, তখন।” ফলে একটি feature-এর দেরি পুরো সংস্করণকে আটকে রাখত। শেষ পর্যন্ত সেটা বের হলো ২০১১ সালে — C++98-এর ১৩ বছর পর। মজা করে বলা হতো, “x” আসলে hexadecimal-এর একটি অঙ্ক!
এই অভিজ্ঞতা থেকে কমিটি পদ্ধতি বদলায় — ট্রেন মডেল। ট্রেন নির্দিষ্ট সময়ে ছাড়বে, প্রতি ৩ বছরে একবার। যে feature সময়মতো তৈরি ও পরীক্ষিত, সে উঠবে; যে তৈরি নয়, সে পরের ট্রেনের জন্য অপেক্ষা করবে — কিন্তু পুরো ট্রেন তার জন্য থামবে না। এরপর থেকে C++14, C++17, C++20, C++23 ঠিক সময়মতো এসেছে।
এর সুবিধা অনেক। Compiler-নির্মাতারা (GCC, Clang, MSVC) জানেন কখন কী আসছে, তাই আগে থেকে পরিকল্পনা করতে পারেন। কোম্পানিগুলো জানে কবে নতুন সংস্করণে যাওয়ার কথা ভাববে। আর বড় feature-কে ভাগ ভাগ করে পাঠানো যায় — যেমন ranges-এর প্রথম অংশ এল C++20-এ, fold_left-এর মতো আরও অংশ এল C++23-এ।
অসুবিধাও আছে। কিছু বড় feature কয়েক ট্রেন ধরে অপেক্ষা করেছে — concepts নিয়ে আলোচনা চলেছে বহু বছর, শেষে এসেছে C++20-এ। আবার নতুন standard বের হওয়া মানেই সব compiler সাথে সাথে সব feature সমর্থন করে না; যেমন C++20-এর modules সব compiler আর build টুলে ভালোভাবে চালু হতে কয়েক বছর লেগে গেছে, আর সেই কাজ এখনো চলছে। তাই পেশাদার দলগুলো সাধারণত দেখে, তাদের compiler কোন feature কতটা সমর্থন করে।
মূল উপলব্ধি: নিয়মিত, নির্ধারিত সময়ে ছোট ছোট উন্নতি — “সবকিছু নিখুঁত হলে একবারে”-এর চেয়ে প্রায়ই ভালো কাজ করে। সফটওয়্যার প্রজেক্টেও একই শিক্ষা: নিয়মিত release, বড় কাজকে ছোট ভাগে ভাঙা।
অনুশীলন
এগুলোর বেশিরভাগে কোড লিখতে হবে না — হাতে-কলমে দেখা আর ভাবাই আসল কাজ।
-
আপনার চারপাশের C++: আপনি প্রতিদিন ব্যবহার করেন এমন ৫টি সফটওয়্যার বা অ্যাপের তালিকা করুন। প্রতিটির জন্য অনুমান করুন — এর ভেতরে কোথাও C++ থাকার সম্ভাবনা কতটা, আর কেন?
সাধারণ একটি উত্তর: Chrome (মূল অংশ C++ — প্রায় নিশ্চিত); বড় 3D গেম (ইঞ্জিন সম্ভবত C++); Facebook/YouTube অ্যাপ (অ্যাপের ওপরের অংশ Kotlin/Swift, কিন্তু ভিডিও চালানো বা ছবি প্রক্রিয়ার নিচের অংশে প্রায়ই C/C++); Microsoft Office (বড় অংশ C++); bKash বা ব্যাংকের অ্যাপ (অ্যাপে কম, তবে ডেটাবেস বা সার্ভারের কোনো স্তরে থাকতে পারে)। মূল শিক্ষা: যেখানে গতি, বড় হিসাব বা হার্ডওয়্যার জড়িত, সেখানে C++ থাকার সম্ভাবনা বেশি; যেখানে শুধু বোতাম আর ফর্ম, সেখানে কম।
-
Zero-overhead নিজের চোখে দেখুন: godbolt.org-এ C++ বেছে নিন। একটি ফাংশন লিখুন যা
int a[5]-এর যোগফল ফেরত দেয়, আরেকটি যাstd::array<int, 5>-এর যোগফল ফেরত দেয়। compiler option-এ-O2দিয়ে দুটোর assembly তুলনা করুন।দুটো ফাংশনের assembly প্রায় হুবহু একই দেখবেন — কয়েকটি
addবা vector-নির্দেশ, তারপরret.std::arrayআসলে ভেতরে একটি সাধারণ array-ই; তারsize()বা range-for-এর সুবিধা compile-এর সময়েই মিলিয়ে যায়। এবার-O0দিয়ে দেখুন — তখনstd::array-এর দিকে কিছু বাড়তি ফাংশন-ডাক দেখা যেতে পারে। শিক্ষা: zero-overhead-এর প্রতিশ্রুতি পূর্ণ হয় optimization চালু থাকলে, তাই আসল প্রোগ্রাম সবসময়-O2দিয়ে তৈরি করা হয়। -
AI অডিট: যেকোনো AI-কে শুধু বলুন “C++ এ একটি student record program লেখো যেখানে নাম আর নম্বর থাকবে।” কোনো শর্ত দেবেন না। তারপর অংশ ১০-এর টেবিল আর চেকলিস্ট দিয়ে উত্তরটি যাচাই করুন। এরপর একই কাজ অংশ ১০-এর prompt দিয়ে চান — দুটো উত্তরে কী পার্থক্য?
শর্ত ছাড়া চাইলে প্রায়ই দেখা যায়:
#include <bits/stdc++.h>আরusing namespace std;, নাম রাখতেchar name[50], নির্দিষ্ট আকারের array (Student s[100]), কখনোnew/delete. কোড চলে, কিন্তু ৫০ অক্ষরের বেশি নাম বা ১০০-র বেশি ছাত্র এলেই বিপদ। শর্তসহ prompt দিলে সাধারণত পাবেনstd::string,std::vector<Student>, range-for আরstruct-এর পরিষ্কার ব্যবহার। শিক্ষা: AI-এর উত্তরের মান অনেকটাই নির্ভর করে আপনি কতটা স্পষ্ট করে চান তার ওপর — আর যাচাইয়ের দায়িত্ব সবসময় আপনার। -
প্রথম প্রোগ্রামটি বদলান: অংশ ৬-এর
cities.cpp-তে আপনার নিজের জেলার নাম যোগ করুন (ইংরেজি অক্ষরে), আর শেষে প্রথম শহরের নামও ছাপুন। ইঙ্গিত: শেষেরটির জন্যback(), প্রথমটির জন্যfront().ধরা যাক জেলা Bogura.
cities.push_back("Barishal");-এর পরে যোগ করুনcities.push_back("Bogura");, আর শেষেstd::println("First city: {}", cities.front());. এখন আউটপুটে মোট শহর আসবে 7, শেষ যোগ হওয়া শহর Bogura, আর প্রথম শহর Dhaka. খেয়াল করুন, আকার কোথাও হাতে বদলাতে হয়নি —size()নিজেই নতুন সংখ্যা বলেছে। C-ধাঁচের array হলে আকার আগে থেকে ঠিক করে রাখতে হতো, আর একটি বেশি শহর যোগ করলেই সীমার বাইরে লেখার ঝুঁকি।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমC ও C++-এর ইতিহাসের মোড়গুলো সময়ের ক্রমে সাজান (▲▼ চেপে সরান)
- 📜 Bell Labs-এ C ভাষার জন্ম
- 🧩 Stroustrup-এর “C with Classes”
- ➕ ভাষার নাম রাখা হলো C++
- 📘 প্রথম ISO standard — C++98
- 🚀 আধুনিক C++-এর শুরু — C++11
- 🖨️
std::printlnএল — C++23
“C with Classes” নামে C++-এর কাজ কে, কোথায় শুরু করেন?
- Dennis Ritchie, Bell Labs-এ
- Bjarne Stroustrup, Bell Labs-এ
- James Gosling, Sun Microsystems-এ
- Guido van Rossum, CWI-তে
C++-এর “zero-overhead principle”-এর সঠিক অর্থ কোনটি?
- C++-এর কোনো feature-এরই কোনো খরচ নেই
- C++ সব ভুল স্বয়ংক্রিয়ভাবে আটকায়, তাই বাড়তি কাজ লাগে না
- যা ব্যবহার করেন না তার দাম দিতে হয় না; যা ব্যবহার করেন তা হাতে লিখেও এর চেয়ে দক্ষ করা যেত না
- C++ প্রোগ্রাম compile হতে কোনো সময় লাগে না
কোন standard-কে সাধারণত “আধুনিক C++”-এর শুরু ধরা হয়?
- C++11
- C++98
- C++03
- C++23
C-ধাঁচে malloc দিয়ে নেওয়া array-র তুলনায় std::vector-এর বড় সুবিধা কোনটি?
- vector সবসময় দশ গুণ দ্রুত চলে
- vector-এ [] দিয়ে পড়লে সবসময় সীমা যাচাই হয়
- vector-এর আকার একবার ঠিক করলে আর বদলানো যায় না
- নিজের আকার মনে রাখে আর কাজ শেষে মেমরি নিজেই ফেরত দেয়
C++14 থেকে ISO C++ কমিটি নতুন standard প্রকাশের কোন নিয়ম মেনে চলছে?
- প্রতি বছর একটি নতুন standard
- প্রতি ৩ বছরে একটি, তৈরি feature নিয়ে নির্দিষ্ট সময়ে
- সব বড় feature তৈরি হলে, যত সময়ই লাগুক
- যখন একটি নির্দিষ্ট কোম্পানি সিদ্ধান্ত নেয়
AI একটি C++ প্রোগ্রাম দিল, যাতে char name[20], strcpy আর new/delete আছে। সবচেয়ে ভালো পদক্ষেপ কোনটি?
- প্রোগ্রাম চলছে, তাই যেমন আছে তেমনই ব্যবহার করা
- Compiler-এর warning বন্ধ করে দেওয়া
- std::string ও std::vector দিয়ে আধুনিক রূপ চেয়ে, warning চালু রেখে নানা ইনপুটে যাচাই করা
- C++ বাদ দিয়ে অন্য ভাষায় লেখানো
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- C++ = C-এর গতি ও নিয়ন্ত্রণ + এমন abstraction, যার জন্য চলার সময় বাড়তি দাম লাগে না।
- C++ চলে যেখানে গতি জরুরি: গেম ইঞ্জিন, ব্রাউজার, ডেটাবেস, trading, এমবেডেড, AI ইঞ্জিন, compiler — আর কনটেস্ট প্রোগ্রামিংয়ে।
- ১৯৭৯ C with Classes → ১৯৮৩ C++ → C++98 → C++11 (আধুনিক যুগ) → প্রতি ৩ বছরে নতুন standard; নিয়ম ঠিক করে ISO কমিটি।
- C++ multi-paradigm: procedural, object-oriented, generic, functional-ধাঁচ; machine code-এ compile হয়, static typing, আর RAII দিয়ে নিরাপদ রিসোর্স-নিয়ন্ত্রণ।
- আধুনিক ধাঁচে লিখুন — vector, string, range-for; পুরোনো ধাঁচ (raw new/delete, char array, macro) চিনে রাখুন, বিশেষ করে AI-এর কোডে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০২ · বস্তু দিয়ে ভাবা — সমস্যাকে দায়িত্বে ভাঙাপরবর্তী পর্বকোড লেখার আগে সমস্যাকে object আর দায়িত্বে ভাগ করার অভ্যাস।
- C++ প্রোগ্রামিং · কোর্স হোম৫৫টি পর্বপুরো কোর্সের রোডম্যাপ — ৮টি মডিউল, কোন পর্ব কখন।
- C প্রোগ্রামিংভিত্তিমেমরি, pointer আর হার্ডওয়্যারের কাছাকাছি কাজ — C++-এর শিকড় আরও গভীরে বুঝতে।
- Data Structures & Algorithmsপাশের ট্র্যাকC++ শেখার সাথে সাথে সমস্যা সমাধানের কৌশল — কনটেস্ট আর ইন্টারভিউর প্রস্তুতি। কনটেস্টের জন্য C++ নিয়ে আলাদা আলোচনা পাবেন এই কোর্সের পর্ব ৫০-এ।