এই পর্বে যা শিখবেন
- কম্পিউটার সিস্টেমের স্তরগুলো — অ্যাপ থেকে হার্ডওয়্যার পর্যন্ত — আর তার ঠিক কোথায় C থাকে
- Python-এ একটি লাইন চালালে নিচে নিচে কীভাবে C কাজ করে
- C-এর জন্মকথা, আর একটি ১৯৭২ সালের ভাষা কেন আজও টিকে আছে
- “Portability” আর “হার্ডওয়্যারের কাছাকাছি” কথাগুলোর আসল মানে
- C-এর শক্তি ও ঝুঁকি; C, Python, Java — কোন কাজে কোনটি, আর AI-এর যুগে C জানার মূল্য
১ · আপনি প্রতিদিন C ব্যবহার করেন — না জেনেই
একটি সাধারণ সকালের কথা ভাবুন। সাতটায় ফোনের অ্যালার্ম বাজল। ঘুমচোখে Facebook খুলে একটু স্ক্রল করলেন। তারপর bKash অ্যাপে মাকে কিছু টাকা পাঠালেন। বের হওয়ার আগে ওয়াশিং মেশিনে কাপড় দিয়ে বোতাম চাপলেন। রাস্তায় নামতেই ফোন বাসার Wi-Fi ছেড়ে মোবাইল ডেটায় চলে গেল।
এই কয়েক মিনিটে আপনি একটি লাইন কোডও লেখেননি। অথচ এর মধ্যেই C ভাষায় লেখা কোড অসংখ্যবার চলে গেছে। কোথায় কোথায়? দেখুন:
- ফোনে: Android-এর একদম নিচে আছে Linux kernel — যা মূলত C-তে লেখা। iPhone-এর kernel-এরও বড় অংশ C.
- Facebook খোলার সময়: আপনার নিউজফিড আসে বিশাল সব সার্ভার থেকে। পৃথিবীর বেশিরভাগ সার্ভার চলে Linux-এ — আবার সেই C.
- অ্যাপের ভেতরে: অনেক মোবাইল অ্যাপ ফোনেই তথ্য জমিয়ে রাখে SQLite নামের ছোট্ট একটি ডেটাবেসে। এটি C-তে লেখা, আর Android ও iPhone দুটোতেই আগে থেকে বসানো থাকে।
- Wi-Fi রাউটারে: রাউটারের ভেতরে চলে একটি firmware. অনেক রাউটারের firmware Linux-ভিত্তিক, আর তার প্রায় পুরোটাই C.
- ওয়াশিং মেশিনে: কতক্ষণ পানি ঢুকবে, কখন ড্রাম ঘুরবে — এসব ঠিক করে একটি ছোট চিপ, যার নাম microcontroller. এমন চিপের প্রোগ্রাম সাধারণত C-তেই লেখা হয়।
ঢাকার রাস্তার কথা ভাবুন। ওপরে আমরা দেখি গাড়ি, রিকশা, দোকানপাট। কিন্তু রাস্তার নিচে চলে গেছে পানির পাইপ, গ্যাসের লাইন, বিদ্যুতের তার। কেউ সেগুলো দেখে না, কিন্তু একদিন পানি বা গ্যাস বন্ধ হলেই পুরো শহর থেমে যায়। ডিজিটাল দুনিয়ায় C হলো সেই মাটির নিচের লাইন — চোখে পড়ে না, কিন্তু সবকিছু তার ওপর নির্ভর করে।
আরেকটু বড় পরিসরে দেখি। C আজ মূলত চার ধরনের জায়গায় রাজত্ব করে:
🐧 অপারেটিং সিস্টেম
Linux kernel প্রায় পুরোটাই C. Windows ও macOS-এর kernel আর নিচের দিকের অংশগুলোর বড় ভাগও C-তে লেখা।
Linux, Android, Windows, macOS🔌 এমবেডেড যন্ত্র
মাইক্রোওয়েভ, ওয়াশিং মেশিন, রাউটার, গাড়ির ইঞ্জিন ও ব্রেক নিয়ন্ত্রণের চিপ — এসব embedded system-এ C প্রধান ভাষা।
Microcontroller, Arduino, রাউটার🗄️ ডেটাবেস ও সার্ভার
অনেক ডেটাবেস ও নেটওয়ার্ক সার্ভারের মূল ইঞ্জিন C-তে লেখা — কারণ এখানে প্রতিটি মিলিসেকেন্ডের দাম আছে।
SQLite, Redis, PostgreSQL, Nginx🧰 অন্য ভাষা ও টুলের ভিত
Python-এর প্রচলিত interpreter (CPython) C-তে লেখা। প্রোগ্রামারদের প্রতিদিনের টুল Git-ও C-তে লেখা।
CPython, PHP, GitC সাধারণত আপনার চোখের সামনে থাকে না — থাকে নিচে, ভিত হয়ে। আপনি যে programming language-ই শিখুন, যে অ্যাপই বানান, তার নিচের কোনো না কোনো স্তরে C কাজ করছে। তাই C শেখা মানে শুধু একটি ভাষা শেখা নয় — কম্পিউটার আসলে কীভাবে চলে, সেটা বোঝা।
২ · কম্পিউটারের স্তর — C ঠিক কোথায় থাকে
একটি বহুতল ভবনের কথা ভাবুন। ওপরের তলায় দোকান, অফিস, মানুষজন — সেটাই সবাই দেখে। কিন্তু প্রতিটি তলা দাঁড়িয়ে আছে নিচের তলার ওপর, আর সবার নিচে আছে ভিত। ভিতে গোলমাল হলে ওপরের সাজসজ্জা কোনো কাজে আসে না।
কম্পিউটারও ঠিক এভাবে কয়েকটি স্তরে সাজানো। আপনি যে অ্যাপে আঙুল ছোঁয়ান, সেটি সবার ওপরের তলা। নিচের ডায়াগ্রামে “পরে” চেপে একেকটি স্তর নিচে নামুন। যে স্তরে C-এর বড় ভূমিকা আছে, সেটি লাল দাগে চিহ্নিত হবে।
Android অ্যাপ → Kotlin, Java
iPhone অ্যাপ → Swift
ওয়েবসাইট → JavaScript
ডেটা বিশ্লেষণ → Python
/* এখানে C কম দেখা যায় — কিন্তু নিচে নামতেই পাবেন */
python3 → CPython — C-তে লেখা Chrome-এর JS → V8 ইঞ্জিন — C++ Android অ্যাপ → ART — মূলত C++ /* C আর তার “ছোট ভাই” C++ এখানে প্রধান */
libc → printf, malloc, ফাইল খোলা C SQLite → ফোনের ভেতরের ডেটাবেস C zlib → ফাইল ছোট করা (compression) C OpenSSL → https-এর এনক্রিপশন C
Linux (Android, সার্ভার) → প্রায় পুরোটাই C Windows NT kernel → বেশিরভাগ C, কিছু C++ ও assembly XNU (macOS, iPhone) → বেশিরভাগ C, কিছু C++ /* কে কখন CPU পাবে, কে কতটুকু মেমরি পাবে — সব সিদ্ধান্ত এখানে */
Wi-Fi কার্ডের driver → C GPU driver → C / C++ ওয়াশিং মেশিনের firmware → সাধারণত C /* কোন রেজিস্টারে কোন বিট বসালে মোটর ঘুরবে — এই স্তরের কাজ */
CPU শুধু বোঝে machine code — 0 আর 1
10110000 01100001 ...
/* ওপরের সব স্তরের কোড শেষ পর্যন্ত এই রূপে এসেই চলে */
Apps ← আপনি এখানে থাকেন
Runtime / Interpreter
System libraries
OS kernel
Firmware & drivers ← C এখানে রাজত্ব করে
Hardware ← সব কোড শেষে এখানে চলে
- স্তর ১ — Apps. আপনি এখানেই থাকেন: Facebook, bKash, Chrome. এই স্তরের কোড সাধারণত Kotlin, Swift, JavaScript বা Python-এর মতো high-level language-এ লেখা — যেখানে মেশিনের খুঁটিনাটি নিয়ে ভাবতে হয় না। কিন্তু অ্যাপ নিজে একা কিছুই করতে পারে না — তার প্রতিটি কাজ নিচের স্তরকে দিয়ে করাতে হয়।
- স্তর ২ — Runtime ও Interpreter. Python বা JavaScript-এর কোড সরাসরি CPU-তে চলে না। একটি প্রোগ্রাম সেই কোড পড়ে পড়ে চালায় — তাকে বলে interpreter বা runtime. Python-এর প্রচলিত interpreter CPython পুরোপুরি C-তে লেখা। অর্থাৎ Python চালানো মানে আসলে একটি C প্রোগ্রাম চালানো।
- স্তর ৩ — System libraries. স্ক্রিনে লেখা, ফাইল খোলা, ডেটা এনক্রিপ্ট করা — এসব কাজ প্রায় সব প্রোগ্রামেরই লাগে। তাই একবার লিখে সবাই ভাগ করে ব্যবহার করে — একে বলে library. সবচেয়ে মৌলিকটির নাম libc — “C library”. নাম থেকেই বুঝছেন কোন ভাষায় লেখা।
- স্তর ৪ — OS kernel. Operating system-এর একদম ভেতরের অংশ হলো kernel. কোন প্রোগ্রাম কখন CPU পাবে, কে কতটুকু মেমরি পাবে, কে কোন ফাইল ছুঁতে পারবে — সব সিদ্ধান্ত এখানে। Linux, Windows ও macOS — তিনটির kernel-ই মূলত C-তে লেখা। এখানে গতি আর নিয়ন্ত্রণ দুটোই চাই, আর C ঠিক সেটাই দেয়।
- স্তর ৫ — Firmware ও Drivers. প্রতিটি যন্ত্রের নিজস্ব “ভাষা” আছে। Kernel আর একটি নির্দিষ্ট যন্ত্রের মধ্যে দোভাষীর কাজ করে device driver. আর যন্ত্রের ভেতরের চিপে স্থায়ীভাবে বসানো প্রোগ্রাম হলো firmware. দুটোই যন্ত্রের রেজিস্টার আর মেমরির ঠিকানা ধরে ধরে কাজ করে — এজন্য এখানে C প্রায় একচেটিয়া।
- স্তর ৬ — Hardware. একদম নিচে আসল যন্ত্র: CPU, মেমরি, স্ক্রিন। এখানে কোনো প্রোগ্রামিং ভাষা নেই — CPU বোঝে শুধু 0 আর 1-এর machine code. ওপরের সব স্তরের কোড, C হোক বা Python, শেষ পর্যন্ত এই রূপে এসেই চলে।
- পুরো ছবি। খেয়াল করুন, লাল দাগের চারটি স্তর ঠিক মাঝখানে — অ্যাপ আর হার্ডওয়্যারের মধ্যে সেতু হয়ে। ওপরের অ্যাপ বদলায় প্রতি বছর; কিন্তু এই মাঝের স্তরগুলো টিকে থাকে দশকের পর দশক। C শেখা মানে এই সেতুটা চেনা।
এটি একটি সরল করা ছবি। বাস্তবে স্তরগুলোর সীমানা একটু ঝাপসা — যেমন kernel-এর ছোট কিছু অংশ assembly-তে লেখা, আর অনেক runtime C++-এ। তবে মূল কথাটি ঠিক: অ্যাপের নিচের প্রায় প্রতিটি স্তরে C-এর বড় ভূমিকা আছে।
যে ভাষা মেশিনের খুঁটিনাটি লুকিয়ে রাখে, সেটি high-level (Python, Java). যে ভাষায় মেমরি আর হার্ডওয়্যার সরাসরি নিয়ন্ত্রণ করা যায়, সেটি low-level (assembly). C দাঁড়িয়ে আছে দুইয়ের মাঝখানে — মানুষের পড়ার মতো যথেষ্ট সহজ, আবার মেশিনের কাছে যাওয়ার মতো যথেষ্ট খোলা। এই “মাঝামাঝি” অবস্থানই C-এর আসল শক্তি।
৩ · Python-এর print-এর নিচে লুকানো C
অনেকে ভাবেন, “আমি তো Python শিখব, C দিয়ে আমার কী কাজ?” চলুন একটি পরীক্ষা করি। Python-এর সবচেয়ে সহজ লাইনটি নিন — print("Hi"). স্ক্রিনে “Hi” আসতে এক মুহূর্তও লাগে না। কিন্তু সেই মুহূর্তের ভেতরে কত হাত বদল হয়, দেখুন। “চালান” চাপলে ডায়াগ্রাম নিজে থেকেই এগোবে।
- আপনার কোড
hi.pyPython - CPython
python3C-তে লেখা - print ফাংশন
bltinmodule.cC ফাংশন - C library
write()libc - Kernel
system callC-তে লেখা - স্ক্রিন
Hiআপনি দেখলেন
print("Hi")
LOAD_NAME print # print নামের জিনিসটি খুঁজে আনো LOAD_CONST 'Hi' # "Hi" লেখাটি হাতে নাও CALL 1 # একটি জিনিস দিয়ে ফাংশন ডাকো # Python-এর সংস্করণভেদে নামগুলো একটু আলাদা হতে পারে
static PyObject * builtin_print_impl(PyObject *module, PyObject *args, ...) { /* প্রতিটি জিনিসকে লেখায় বদলে stdout-এ পাঠাও */ ... }
write(1, "Hi\n", 3); /* 1 = স্ক্রিন (stdout), "Hi\n" = লেখা, 3 = কয়টি byte */
write(1, "Hi\n", 3) = 3 /* kernel জানাল: ৩টি byte লেখা হয়েছে */
$ python3 hi.py
Hi
- ধাপ ১ — আপনার Python কোড। একটি লাইন:
print("Hi"). এটি শুধু একটি লেখা ফাইল। CPU এটি পড়তে পারে না — কাউকে না কাউকে এটি বুঝে চালাতে হবে। - ধাপ ২ — CPython কোডটি পড়ল। আপনি
python3লিখে যে প্রোগ্রাম চালান, সেটিই CPython — আর এটি C-তে লেখা একটি প্রোগ্রাম। সে প্রথমে আপনার কোডকে bytecode নামের সরল নির্দেশে ভাঙে। তারপর C-তে লেখা একটি বিশাল লুপ নির্দেশগুলো একে একে চালায়। - ধাপ ৩ — print আসলে একটি C ফাংশন। অবাক হবেন — Python-এর
printPython-এ লেখা নয়! CPython-এর সোর্স কোডেbltinmodule.cনামের ফাইলে এটি একটি C ফাংশন হিসেবে লেখা। Python-এরlen,sum-এর মতো অনেক built-in ফাংশনও তাই। - ধাপ ৪ — C library-র দরজায়। লেখাটি স্ক্রিনে পাঠাতে শেষ পর্যন্ত ডাকা হয়
writeনামের একটি C ফাংশন। এটি একটি ছোট্ট মোড়ক — আসল কাজ এটি নিজে করে না, kernel-কে দিয়ে করায়। - ধাপ ৫ — Kernel-এর কাছে অনুরোধ। সাধারণ কোনো প্রোগ্রাম সরাসরি স্ক্রিন বা হার্ডওয়্যার ছুঁতে পারে না। তাকে kernel-এর কাছে অনুরোধ পাঠাতে হয় — একে বলে system call. Kernel (C-তে লেখা) অনুমতি যাচাই করে কাজটি করে দেয়, আর জানায় কয়টি byte লেখা হলো।
- ধাপ ৬ — স্ক্রিনে Hi. Kernel লেখাটি terminal প্রোগ্রামের কাছে পৌঁছে দিল, আর terminal সেটি আঁকল স্ক্রিনে। একটি Python লাইনের পেছনে অন্তত তিনটি স্তরে C কাজ করল — অথচ আপনি একবারও C-এর নাম শোনেননি।
System call বোঝার সহজ উপায় — ব্যাংকের কাউন্টার। আপনি ব্যাংকে গিয়ে নিজে ভল্টে ঢুকে টাকা তুলতে পারেন না। একটি স্লিপ পূরণ করে কাউন্টারে দেন; ক্যাশিয়ার যাচাই করে ভল্ট থেকে টাকা এনে দেন। প্রোগ্রাম হলো গ্রাহক, kernel হলো ক্যাশিয়ার, আর system call হলো সেই স্লিপ। এই নিয়মের কারণেই একটি খারাপ অ্যাপ চাইলেই অন্য অ্যাপের তথ্য চুরি করতে পারে না।
এই ছবিটি মাথায় রাখুন। এই কোর্সে আপনি যখন printf লিখবেন, তখন আসলে ধাপ ৪ থেকে কাজ শুরু করছেন — মাঝখানের interpreter-এর কোনো স্তর নেই। এজন্যই C এত দ্রুত। আর কোড থেকে চালানো যায় এমন প্রোগ্রাম তৈরির পুরো প্রক্রিয়াটি আমরা বিস্তারিত দেখব পর্ব ০৩-এ (টুলচেইন).
৪ · জন্মকথা — Bell Labs থেকে C23
C হঠাৎ করে কারও মাথায় আসেনি। এটি তৈরি হয়েছিল একটি বাস্তব সমস্যার সমাধান করতে — একটি operating system লিখতে হবে, যা এক কম্পিউটার থেকে আরেক কম্পিউটারে সহজে নেওয়া যায়। নিচের সময়রেখায় ধাপে ধাপে এগোন।
- B ভাষা
১৯৬৯Ken Thompson - C-এর জন্ম
১৯৭২Dennis Ritchie - Unix আবার লেখা
১৯৭৩বিপ্লবের শুরু - K&R বই
১৯৭৮সবার হাতে C - ANSI C
C89 / C90প্রথম স্ট্যান্ডার্ড - আধুনিক C
C99 → C23আজও চলমান
main()
{
printf("hello, world\n");
}
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
C99 → // দিয়ে মন্তব্য, long long, for-এর ভেতরে ভ্যারিয়েবল
C11 → একসাথে একাধিক কাজ (thread), gets() বাতিল
C17 → মূলত ভুল সংশোধন, নতুন বৈশিষ্ট্য প্রায় নেই
C23 → bool, true, false সরাসরি শব্দ; nullptr; 0b1010
- ১৯৬৯ — B ভাষা। আমেরিকার Bell Labs-এ Ken Thompson ছোট একটি কম্পিউটারে Unix নামের নতুন operating system বানাচ্ছিলেন। এর জন্য তিনি BCPL নামের একটি ভাষাকে ছেঁটে-কেটে তৈরি করেন “B”. সমস্যা ছিল — B-তে ডেটার কোনো ধরন (type) ছিল না; সংখ্যা, অক্ষর সবই একই রকম “শব্দ” হিসেবে দেখা হতো।
- ১৯৭২-এর দিকে — C-এর জন্ম। Bell Labs-এর নতুন কম্পিউটার PDP-11 মেমরিকে byte ধরে ধরে ব্যবহার করত, যা B ঠিকমতো সামলাতে পারত না। Dennis Ritchie তাই B-তে
char,int-এর মতো type যোগ করে একটি নতুন ভাষা দাঁড় করালেন। B-এর পরের অক্ষর — নাম হলো C. - ১৯৭৩ — Unix নতুন করে লেখা হলো C-তে। সেই সময়ে operating system লেখা হতো assembly-তে, যা একটি নির্দিষ্ট CPU-র সাথে বাঁধা। Thompson ও Ritchie Unix-এর kernel প্রায় পুরোটাই C-তে নতুন করে লিখলেন। ফল: নতুন কোনো কম্পিউটারে Unix নিতে চাইলে আর পুরো OS নতুন করে লিখতে হতো না — শুধু সেই কম্পিউটারের জন্য একটি C compiler আর অল্প কিছু অংশ লিখলেই চলত। এটাই ছিল আসল বিপ্লব।
- ১৯৭৮ — K&R বই। Brian Kernighan ও Dennis Ritchie লিখলেন “The C Programming Language”. মানুষ ভালোবেসে বইটিকে ডাকে “K&R”. প্রথম প্রোগ্রাম হিসেবে “hello, world” ছাপানোর রীতিটি এই বইয়ের মাধ্যমেই সারা দুনিয়ায় ছড়িয়ে পড়ে। প্রায় এক দশক এই বইটিই ছিল C-এর অঘোষিত নিয়মের বই।
- ১৯৮৯ — প্রথম আনুষ্ঠানিক স্ট্যান্ডার্ড। ততদিনে নানা কোম্পানি নিজেদের মতো C compiler বানাচ্ছিল, আর এক compiler-এর কোড আরেকটিতে সবসময় চলত না। তাই আমেরিকার ANSI ১৯৮৯ সালে C-এর আনুষ্ঠানিক নিয়ম প্রকাশ করে — C89. পরের বছর আন্তর্জাতিক সংস্থা ISO একই নিয়ম গ্রহণ করে — C90. একে বলে C standard.
- ১৯৯৯ থেকে আজ — আধুনিক C. এরপর এসেছে C99, C11, C17 আর C23 — নামের সংখ্যাটি মোটামুটি প্রকাশের বছর বোঝায় (C17 আসলে প্রকাশ পায় ২০১৮ সালে, আর C23 প্রকাশ পায় ২০২৪ সালে)। ভাষাটি খুব সাবধানে বদলায়, যাতে পুরোনো কোড ভেঙে না যায়। ৫০ বছর আগের অনেক কোড আজও সামান্য বদলে compile হয় — এই স্থিরতাই C-এর বড় গুণ।
১৯৮৩ সালে Ken Thompson ও Dennis Ritchie Unix তৈরির জন্য কম্পিউটার বিজ্ঞানের সর্বোচ্চ সম্মান Turing Award পান। Ritchie মারা যান ২০১১ সালের অক্টোবরে — একই মাসে Apple-এর Steve Jobs-ও মারা যান। Jobs-এর মৃত্যু নিয়ে সারা দুনিয়ায় শোক হলো, কিন্তু Ritchie-র খবর অনেকে টেরই পাননি। অথচ Jobs-এর তৈরি প্রতিটি iPhone আর Mac-এর ভেতরে Ritchie-র কাজ চলছে আজও। নিচের স্তরের কাজ এমনই — সবাই নির্ভর করে, কিন্তু খুব কম মানুষ চেনে।
৫ · Portability — এক কোড, অনেক যন্ত্র
সময়রেখার ধাপ ৩-এ যে “বিপ্লব”-এর কথা বললাম, সেটি এবার ভালো করে দেখি। এর নাম portability — একই কোড ভিন্ন ভিন্ন যন্ত্রে চালাতে পারা।
ব্যাপারটা বুঝতে একটি সত্য মনে রাখুন: প্রতিটি CPU পরিবারের machine code আলাদা। আপনার ল্যাপটপের Intel/AMD CPU, ফোনের ARM CPU, আর Arduino-র ছোট AVR চিপ — তিনজন তিন রকম “ভাষা” বোঝে। Assembly-তে লেখা প্রোগ্রাম একটির জন্যই কাজ করে। C তাহলে কীভাবে সবার জন্য কাজ করে? দেখুন:
return 0;দুই CPU-র assembly (সরল করা); x86-64 (ল্যাপটপ) mov eax, 0 ret ; ARM64 (ফোন) mov w0, #0 ret
- একটি সোর্স ফাইল। আপনি একবার
hello.cলিখলেন। এতে কোনো নির্দিষ্ট CPU-র নাম নেই, কোনো রেজিস্টারের নাম নেই — শুধু “এটা ছাপাও, ওটা হিসাব করো” ধরনের সাধারণ নির্দেশ। - ল্যাপটপের জন্য। ল্যাপটপে
gccচালালে সে x86-64 CPU-র machine code বানায়। তৈরি ফাইলটি শুধু এই ধরনের CPU-তেই চলবে। - ফোনের জন্য। একই
hello.c, কিন্তু এবার ARM CPU-র জন্য compiler. ফলাফল সম্পূর্ণ আলাদা 0/1, অথচ আপনার কোডের একটি অক্ষরও বদলাতে হলো না। - ছোট্ট চিপের জন্য। Arduino Uno-র চিপের জন্যও আছে C compiler (
avr-gcc). এখানে স্ক্রিন নেই, তাইprintf-এর জায়গায় হয়তো একটি LED জ্বলবে — কিন্তু হিসাব-নিকাশের মূল যুক্তি একই C-তে লেখা থাকে। এক ভাষা দিয়ে সুপারকম্পিউটার থেকে খেলনা পর্যন্ত — এটাই C-এর পরিসর। - রহস্যটা কোথায়? একই
return 0;দুই CPU-তে দুই রকম নির্দেশে বদলায়। এই অনুবাদের ঝামেলা compiler নিজের ঘাড়ে নেয়। তাই নতুন কোনো CPU বাজারে এলে প্রথমে তার জন্য একটি C compiler বানানো হয় — আর সাথে সাথে পৃথিবীর বিপুল পরিমাণ C কোড সেই CPU-তে চলার পথ খুলে যায়।
এবার নিজে একটি C প্রোগ্রাম চালিয়ে দেখুন। কোড নিয়ে এখনই মাথা ঘামানোর দরকার নেই — প্রতিটি লাইনের মানে আমরা পর্ব ০৪-এ ধরে ধরে দেখব। শুধু “Run” চাপুন:
#include <stdio.h>
int main(void) {
printf("Hello, Bangladesh!\n");
printf("This same file can be compiled for a laptop,\n");
printf("a phone, or a tiny chip.\n");
return 0;
}Run চাপার সাথে সাথে এই কোড একটি সার্ভারে পাঠানো হলো। সেখানে একটি C compiler একে সেই সার্ভারের CPU-র machine code-এ বদলাল, চালাল, আর ফলাফল আপনাকে ফেরত পাঠাল। একই ফাইল আপনার ল্যাপটপে compile করলে তৈরি হবে আরেক রকম machine code — কিন্তু স্ক্রিনে লেখা আসবে হুবহু এক। ভাষাটা এক, অনুবাদ যন্ত্র অনুযায়ী আলাদা। (লক্ষ্য করুন, printf-এর ভেতরে ইংরেজি লেখা রেখেছি — কিছু অনলাইন compiler বাংলা অক্ষর ঠিকমতো দেখাতে পারে না।)
৬ · “হার্ডওয়্যারের কাছাকাছি” — কথাটির আসল মানে
C সম্পর্কে সবচেয়ে বেশি শোনা কথা: “C হার্ডওয়্যারের কাছাকাছি ভাষা।” কিন্তু এর মানে কী? তিনটি সহজ কথায়:
- যা লেখেন, প্রায় তাই চলে। C-এর একটি যোগ সাধারণত CPU-র একটি বা অল্প কয়েকটি নির্দেশে বদলায়। মাঝখানে কোনো লুকানো কাজ নেই।
- মেমরি আপনার চোখের সামনে। প্রতিটি ভ্যারিয়েবল মেমরির কোন ঠিকানায় আছে, কত byte জায়গা নিচ্ছে — C আপনাকে সব দেখতে ও নিয়ন্ত্রণ করতে দেয়।
- প্রায় কোনো বাড়তি বোঝা নেই। Java বা Python চালাতে পেছনে একটি বড় runtime লাগে। C প্রোগ্রামের পেছনে লাগে খুবই ছোট একটি অংশ — এমনকি কোনো OS ছাড়াও চলতে পারে। এজন্যই কয়েক KB মেমরির চিপেও C চলে।
দ্বিতীয় কথাটি নিজের চোখে দেখুন। নিচের প্রোগ্রাম একটি ভ্যারিয়েবলের মান, তার আকার, আর মেমরিতে তার memory address — তিনটিই ছাপায়:
#include <stdio.h>
int main(void) {
int marks = 85;
printf("value : %d\n", marks);
printf("size : %zu bytes\n", sizeof marks);
printf("address : %p\n", (void *)&marks);
return 0;
}প্রথম লাইনে আসবে 85 — এটা স্বাভাবিক। দ্বিতীয় লাইনে সাধারণত আসবে 4 bytes — অর্থাৎ এই সংখ্যাটি মেমরিতে ৪টি ঘর দখল করে আছে। তৃতীয় লাইনে আসবে 0x7ffd... ধরনের একটি লম্বা সংখ্যা — এটাই মেমরিতে marks-এর ঠিকানা। প্রতিবার চালালে ঠিকানা বদলাতে পারে (নিরাপত্তার জন্য OS ইচ্ছে করে বদলায়)। Python সাধারণত এই ঠিকানা আপনার কাছ থেকে লুকিয়ে রাখে; C সরাসরি হাতে তুলে দেয়। এই ঠিকানা নিয়ে কাজ করাই পরে pointer — C-এর সবচেয়ে শক্তিশালী (আর সবচেয়ে বিপজ্জনক) হাতিয়ার।
শক্তি আর দায়িত্ব — দুই দিক
C যা দেয়
গতি: মাঝখানে interpreter নেই। নিয়ন্ত্রণ: মেমরি কোথায় কীভাবে থাকবে, আপনি ঠিক করেন। ছোট আকার: ক্ষুদ্র চিপেও চলে। Portability: প্রায় সব CPU-র জন্য compiler আছে।
kernel, firmware, ডেটাবেসC যা চায়
হাতে মেমরি সামলানো: জায়গা নিলে নিজেকেই ফেরত দিতে হয়। কোনো নিরাপত্তা জাল নেই: সীমার বাইরে লিখলেও কেউ থামাবে না। নিয়ম ভাঙলে ফল অনির্দিষ্ট: একে বলে undefined behavior.
মনোযোগ আর শৃঙ্খলা৭ · নিরাপত্তা জাল নেই — memory safety-র বড় প্রশ্ন
C-এর সবচেয়ে বড় দুর্বলতা বুঝতে একটি আলমারির তাক কল্পনা করুন। তাকটিতে ১০টি বই রাখার জায়গা আছে। আপনি ভুল করে ১২টি বই ঢোকালেন। Python বা Java হলে একজন পাহারাদার সাথে সাথে থামিয়ে বলত, “জায়গা নেই!” C-তে কোনো পাহারাদার নেই — বাড়তি ২টি বই চুপচাপ পাশের তাকে চলে যায়, আর সেখানে অন্য কারও রাখা জিনিস চাপা পড়ে নষ্ট হয়।
প্রোগ্রামে এই “পাশের তাক” হতে পারে অন্য কোনো ভ্যারিয়েবল, পাসওয়ার্ড, এমনকি প্রোগ্রামের পরের নির্দেশের ঠিকানা। একে বলে buffer overflow. একজন হ্যাকার ইচ্ছে করে লম্বা ইনপুট দিয়ে পাশের মেমরিতে নিজের পছন্দের জিনিস বসিয়ে দিতে পারেন — আর প্রোগ্রামটি তাঁর কথামতো চলতে শুরু করে। প্রোগ্রাম শুধু নিজের জায়গাতেই পড়বে-লিখবে — এই নিশ্চয়তাকে বলে memory safety, আর C নিজে থেকে এই নিশ্চয়তা দেয় না।
এটি শুধু তাত্ত্বিক ভয় নয়। Microsoft ২০১৯ সালে জানায়, তাদের সফটওয়্যারে প্রতি বছর যত নিরাপত্তা-ত্রুটি ধরা পড়ে, তার প্রায় ৭০ শতাংশ মেমরি-সংক্রান্ত। Google-এর Chromium (Chrome ব্রাউজারের মূল প্রজেক্ট) দলও প্রায় একই হিসাব দেয় — তাদের গুরুতর নিরাপত্তা বাগের প্রায় ৭০ শতাংশ memory safety-র সমস্যা। দুই ক্ষেত্রেই কোডের বড় অংশ C আর C++-এ লেখা।
তাহলে শিল্পজগৎ কী করছে? কয়েকটি দিক থেকে কাজ চলছে:
- নতুন ভাষা: Rust-এর মতো ভাষা C-এর মতোই দ্রুত, কিন্তু compile করার সময়েই বেশিরভাগ মেমরি-ভুল আটকে দেয়। ২০২২ সালে Linux kernel-এ প্রথমবারের মতো Rust-এ লেখা কোড রাখার অনুমতি দেওয়া হয়। Android-এর নতুন কোডের একটি অংশও এখন Rust-এ লেখা হচ্ছে।
- সরকারি চাপ: ২০২২ থেকে ২০২৪ সালের মধ্যে যুক্তরাষ্ট্রের NSA ও হোয়াইট হাউসের একটি দপ্তর প্রকাশ্যে memory-safe ভাষায় সরে যাওয়ার পরামর্শ দিয়েছে।
- C-কেই নিরাপদ করা: compiler-এর warning, sanitizer-এর মতো পরীক্ষার টুল, আর গাড়ি ও বিমানশিল্পে কঠোর লেখার নিয়ম (যেমন MISRA C) — এসব দিয়ে C কোডের ঝুঁকি কমানো হয়।
একদমই না — বরং উল্টো। পৃথিবীতে কয়েকশো কোটি লাইন C কোড চলছে, যা রাতারাতি নতুন করে লেখা সম্ভব নয়। এগুলো দেখাশোনা করবেন C জানা মানুষ। আর Rust-এর নিয়মগুলো কেন আছে, তা সবচেয়ে ভালো বোঝেন তিনিই, যিনি C-তে নিজে এই ভুলগুলো দেখেছেন। এই কোর্সে তাই আমরা শুধু C লিখতে শিখব না — নিরাপদভাবে লিখতে শিখব।
৮ · C, Python না Java — কোন কাজে কোনটি
“কোন ভাষা সেরা?” — এই প্রশ্নের কোনো উত্তর নেই। আসল প্রশ্ন হলো, “কোন কাজের জন্য কোনটি মানানসই?” নিচের তুলনাটি দেখুন:
| বিষয় | C | Python | Java |
|---|---|---|---|
| কীভাবে চলে | আগেই machine code-এ compile | Interpreter পড়ে পড়ে চালায় | Bytecode, চলে JVM-এ |
| গতি | খুব দ্রুত | তুলনামূলক ধীর | দ্রুত |
| মেমরি সামলায় কে | প্রোগ্রামার নিজে | স্বয়ংক্রিয় | স্বয়ংক্রিয় |
| ভুলের ঝুঁকি | বেশি — মেমরির ভুল নীরবে ঘটে | কম | কম |
| শেখার শুরু | একটু কঠিন | সবচেয়ে সহজ | মাঝামাঝি |
| সাধারণ ব্যবহার | OS, firmware, ডেটাবেস ইঞ্জিন | ডেটা বিশ্লেষণ, AI, স্ক্রিপ্ট | ব্যাংকিং সফটওয়্যার, বড় এন্টারপ্রাইজ সিস্টেম, Android |
Java আর Python-এ মেমরির হিসাব রাখে একটি স্বয়ংক্রিয় ব্যবস্থা — garbage collection. এতে প্রোগ্রামারের ঝামেলা কমে, কিন্তু কখন কতটুকু মেমরি খরচ হবে তা পুরোপুরি আপনার হাতে থাকে না। ওয়াশিং মেশিন বা গাড়ির ব্রেকের চিপে এই অনিশ্চয়তা চলে না — সেখানে C.
রান্নার সাথে মিলিয়ে দেখুন। C মানে নিজে বাজার করে, মসলা বেটে রান্না — সময় ও দক্ষতা লাগে, কিন্তু প্রতিটি উপাদান আপনার নিয়ন্ত্রণে, স্বাদও ঠিক যেমন চান। Java মানে প্যাকেটের রেডিমেড মসলা — কাজ দ্রুত, ফল নির্ভরযোগ্য, তবে কিছু জিনিস আগে থেকেই ঠিক করা। Python মানে রেস্তোরাঁয় অর্ডার দেওয়া — সবচেয়ে সহজ, কিন্তু রান্নাঘরে কী হচ্ছে আপনি দেখেন না। আর মজার ব্যাপার — সেই রেস্তোরাঁর রান্নাঘরে বাবুর্চি আসলে C-ই!
তাহলে প্রথমে C কেন? কারণ C আপনাকে রান্নাঘরে ঢুকতে বাধ্য করে। মেমরি, ঠিকানা, byte, compile — এগুলো C-তে লুকানো যায় না। একবার এসব বুঝলে Python বা Java শেখা অনেক সহজ হয়ে যায়, কারণ তখন আপনি জানেন তারা আপনার হয়ে নিচে কী কাজ করে দিচ্ছে।
৯ · AI-এর যুগে C জানার মূল্য
স্বাভাবিক প্রশ্ন: “AI তো এখন কোড লিখে দেয় — তাহলে ৫০ বছরের পুরোনো একটি ভাষা কেন শিখব?” উত্তরটা কয়েক ভাগে:
- AI নিজেও C-এর ওপর চলে। AI মডেল প্রশিক্ষণ আর চালানোর বেশিরভাগ ভারী হিসাব হয় GPU-তে। সেই GPU-র driver আর হিসাবের মূল লাইব্রেরিগুলো লেখা C ও C++-এ। Python দিয়ে আপনি শুধু নির্দেশ দেন — ভারী কাজটা নিচে করে C/C++.
- AI এখন ফোন আর ল্যাপটপে নামছে। প্রশিক্ষিত মডেল দিয়ে উত্তর বের করানোকে বলে inference. এখন সেই কাজ বড় সার্ভার ছেড়ে ফোন, ল্যাপটপ, এমনকি ছোট যন্ত্রেও হচ্ছে। যেমন llama.cpp নামের একটি open-source প্রজেক্ট, যা C/C++-এ লেখা — এটি দিয়ে সাধারণ ল্যাপটপেই বড় ভাষা-মডেল চালানো যায়। সীমিত মেমরি আর ব্যাটারিতে AI চালানোর কাজটা মূলত C-এর ধাঁচের কাজ।
- যাচাই করবেন আপনি। AI দ্রুত কোড লেখে, কিন্তু আত্মবিশ্বাসের সাথে ভুলও লেখে। C-তে একটি ভুল মানে শুধু ভুল উত্তর নয় — নিরাপত্তার ফাঁকও হতে পারে। মেমরি কীভাবে কাজ করে না জানলে আপনি সেই ফাঁক দেখতেই পাবেন না।
যিনি মেশিন বোঝেন, তিনিই AI-এর ভুল ধরতে পারেন।
C কোডে AI সাধারণত যেসব ভুল করে
| AI-এর ভুল | ফলাফল | কোন পর্বে শিখবেন |
|---|---|---|
| Array-র সীমা যাচাই না করা | Buffer overflow — নিরাপত্তার ফাঁক | অ্যারে ও স্ট্রিং (পর্ব ১৬, ১৯) |
| মেমরি নিয়ে ফেরত না দেওয়া | প্রোগ্রাম যত চলে, তত মেমরি খায় (memory leak) | ডায়নামিক মেমরি (পর্ব ২০) |
পুরোনো, বাতিল ফাংশন gets() ব্যবহার | ইনপুট লম্বা হলেই overflow; C11 থেকে বাতিল | স্ট্রিং (পর্ব ১৯) |
| C-এর কোডে C++-এর জিনিস মিশিয়ে ফেলা | Compile-ই হয় না | আধুনিক C (পর্ব ৪৭) |
AI-কে শুধু “কোড লিখে দাও” বলবেন না — তাকে শিক্ষক হিসেবে ব্যবহার করুন। নিচের প্রশ্নটি কপি করে যেকোনো AI-কে জিজ্ঞেস করুন, তারপর উত্তরটি এই পর্বের সাথে মিলিয়ে দেখুন:
AI-এর উত্তর যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। এগুলোই আপনাকে কোড-লেখক থেকে সিস্টেম-চিন্তক বানাবে।
প্র ০১প্রযুক্তি দুনিয়ায় পাঁচ বছরেই সব পুরোনো হয়ে যায়। তাহলে ১৯৭২ সালের একটি ভাষা ৫০ বছরের বেশি টিকে আছে কীভাবে?
C-এর টিকে থাকা কোনো দুর্ঘটনা নয় — কয়েকটি শক্তি একসাথে কাজ করেছে।
- ছোট ভাষা, সহজ compiler: C-এর নিয়ম খুব কম। তাই নতুন কোনো CPU এলে তার জন্য C compiler বানানো তুলনামূলক সহজ। ফলে প্রায় প্রতিটি নতুন চিপ জন্ম থেকেই C বোঝে — আর C-ও প্রতিটি নতুন চিপে জায়গা পেয়ে যায়। এই চক্র ৫০ বছর ধরে চলছে।
- Unix-এর সাথে ছড়িয়ে পড়া: ১৯৭০-এর দশকে Unix খুব কম খরচে বিশ্ববিদ্যালয়গুলোতে ছড়িয়ে পড়ে। হাজার হাজার ছাত্র Unix-এর সাথে C শিখল, তারপর কোম্পানিতে গিয়ে C-তেই সফটওয়্যার লিখল। পরে Linux, BSD, macOS — সবই সেই ধারার উত্তরসূরি।
- সবার সাধারণ ভাষা: Python, Java, Rust, Go — প্রায় সব ভাষাই অন্য ভাষার কোড ডাকতে চাইলে C-এর নিয়ম মেনে ডাকে। অপারেটিং সিস্টেমও তার সেবাগুলো C-এর ভঙ্গিতে খুলে রাখে। ফলে C হয়ে গেছে সফটওয়্যার জগতের “ইংরেজি” — সবাই নিজের ভাষায় কথা বলে, কিন্তু একে অপরের সাথে কথা বলতে C-কেই মাঝখানে রাখে।
- স্থিরতা: C কমিটি খুব সাবধানে বদলায়। দশকের পর দশক পুরোনো কোড ভাঙে না। একটি ব্যাংক বা বিমান সংস্থার কাছে “৩০ বছর আগের কোড আজও চলে” — এর চেয়ে মূল্যবান কিছু নেই।
- বিপুল জমা কোড: Linux kernel একাই কয়েক কোটি লাইন। এত কোড নতুন ভাষায় লিখতে বছরের পর বছর লাগবে, আর নতুন বাগও ঢুকবে। তাই ব্যবহারিক বুদ্ধি বলে — যা ঠিকঠাক চলছে, তা চালু থাকুক।
মূল উপলব্ধি: প্রযুক্তি টিকে থাকে শুধু “ভালো” হলে নয় — যখন তার চারপাশে একটি পুরো বাস্তুতন্ত্র (compiler, OS, library, মানুষ) গড়ে ওঠে। ওপরের স্তরের প্রযুক্তি দ্রুত বদলায়; নিচের ভিতের প্রযুক্তি খুব ধীরে বদলায়।
প্র ০২C কি “বিপজ্জনক” ভাষা? Rust কি একদিন C-কে পুরোপুরি সরিয়ে দেবে?
“বিপজ্জনক” শব্দটা আংশিক সত্য। C ধরে নেয় প্রোগ্রামার জানেন তিনি কী করছেন — তাই সীমার বাইরে লেখা, ছেড়ে দেওয়া মেমরি আবার ব্যবহার করা, শুরু না করা ভ্যারিয়েবল পড়া — কোনোটিতেই C নিজে থেকে বাধা দেয় না। ধারালো ছুরির মতো: দক্ষ বাবুর্চির হাতে দারুণ কাজের, অসাবধান হাতে বিপদ।
সমস্যা হলো, বড় দলে হাজার হাজার মানুষ যখন বছরের পর বছর কোড লেখেন, তখন কেউ না কেউ ভুল করবেনই। Microsoft আর Chromium-এর “প্রায় ৭০ শতাংশ” হিসাব এটাই দেখায় — সমস্যা ব্যক্তির দক্ষতায় নয়, ভাষার নকশায়। মানুষের ওপর নির্ভর না করে যন্ত্রকে দিয়ে নিয়ম যাচাই করানোই বেশি নির্ভরযোগ্য।
Rust কি C-কে সরাবে? নতুন প্রজেক্টে Rust দ্রুত জায়গা নিচ্ছে, বিশেষ করে যেখানে নিরাপত্তা জরুরি — ব্রাউজার, অপারেটিং সিস্টেমের নতুন অংশ, ক্লাউড সার্ভিস। Google জানিয়েছে, Android-এ নতুন কোড memory-safe ভাষায় লেখা শুরু করার পর থেকে মেমরি-সংক্রান্ত নিরাপত্তা-ত্রুটির অনুপাত উল্লেখযোগ্যভাবে কমেছে। কিন্তু পুরোপুরি সরানো? কয়েকটি বাধা আছে:
- কয়েকশো কোটি লাইন চালু C কোড নতুন করে লেখা বিশাল খরচ ও ঝুঁকির কাজ।
- অনেক ছোট চিপের জন্য এখনো ভালো C compiler আছে, কিন্তু অন্য ভাষার সমর্থন সীমিত।
- Rust-ও নিচের স্তরে অনেক কাজের জন্য C-এর নিয়মেই অন্য কোডের সাথে কথা বলে।
বাস্তব ভবিষ্যৎ সম্ভবত সহাবস্থান — পুরোনো ভিত C-তে, তার ওপর নতুন অংশ নিরাপদ ভাষায়, আর দুইয়ের মধ্যে সাবধানে বানানো সেতু।
মূল উপলব্ধি: ভাষার নকশা মানুষের ভুলকে হয় আটকায়, নয় প্রশ্রয় দেয়। C শিখলে আপনি বুঝবেন কোন ভুল কেন হয় — আর সেই বোঝাপড়াই যেকোনো নিরাপদ ভাষা ব্যবহারেও আপনাকে দক্ষ করবে।
প্র ০৩Python ধীর ভাষা — তবুও AI আর ডেটা সায়েন্সে Python-এর রাজত্ব কীভাবে সম্ভব?
এর উত্তর একটি চমৎকার প্রকৌশল কৌশল — “দুই ভাষার দল”।
Python ধীর হওয়ার কারণ: প্রতিটি লাইন চালানোর সময় interpreter-কে অনেক বাড়তি কাজ করতে হয় — এই জিনিসটা কী ধরনের, যোগ করা যাবে কি না, ফলাফল রাখতে কতটুকু জায়গা লাগবে। একটি সাধারণ যোগের পেছনে কয়েক ডজন বাড়তি ধাপ। কোটি কোটি সংখ্যার ওপর Python-এর সাধারণ লুপ চালালে তাই বেশ সময় লাগে।
সমাধান: ভারী কাজ Python দিয়ে করানোই হয় না! NumPy-তে দুটি বিশাল array যোগ করলে Python শুধু একবার একটি C ফাংশনকে ডাকে। তারপর C-তে লেখা একটি টানা লুপ সব সংখ্যা যোগ করে — কোনো interpreter-এর বাড়তি খরচ ছাড়াই। PyTorch-এর মতো AI লাইব্রেরিতে আরও এক ধাপ নিচে গিয়ে কাজ যায় GPU-তে, C++ ও CUDA-তে লেখা কোডে।
- Python-এর কাজ: কী করতে হবে তা সহজ ভাষায় বলা — ডেটা লোড, মডেল সাজানো, ফলাফল দেখা। মানুষের সময় বাঁচে।
- C/C++-এর কাজ: আসল হিসাব — কোটি কোটি গুণ-যোগ। মেশিনের সময় বাঁচে।
বাংলাদেশের একটি গার্মেন্টস কারখানার মতো — মার্চেন্ডাইজার (Python) ক্রেতার সাথে কথা বলেন, অর্ডার সাজান; কিন্তু হাজার হাজার শার্ট সেলাই করে দ্রুতগতির মেশিন লাইন, অর্থাৎ C. দুজনেই জরুরি, আর দুজনের দক্ষতা আলাদা।
এর একটি সতর্কতাও আছে: আপনি যদি NumPy ব্যবহার না করে Python-এর নিজের লুপে বড় হিসাব করেন, তাহলে এই সুবিধা পাবেন না। কোথায় কাজটা আসলে হচ্ছে — Python-এ, না নিচের C-তে — এটা জানা থাকলেই বুঝবেন কোন কোড ধীর হবে।
মূল উপলব্ধি: দ্রুত সিস্টেম মানে সবকিছু দ্রুত ভাষায় লেখা নয় — বরং যে অংশে সময় সবচেয়ে বেশি যায়, শুধু সেটুকু দ্রুত ভাষায় রাখা। এই চিন্তা আপনি তখনই করতে পারবেন, যখন স্তরগুলো চেনেন।
প্র ০৪Portability আর সর্বোচ্চ গতি — দুটো কি একসাথে পাওয়া যায়? নাকি একটির জন্য আরেকটি ছাড়তে হয়?
প্রায়ই একটির জন্য আরেকটির কিছুটা ছাড়তে হয় — আর এই টানাপোড়েন বোঝা একজন সিস্টেম প্রকৌশলীর মৌলিক দক্ষতা।
C-এর portability আসলে “সোর্স কোডের” portability. একই .c ফাইল বিভিন্ন যন্ত্রে compile করা যায়, কিন্তু তৈরি প্রোগ্রাম ফাইলটি নয় — Windows-এর .exe ফোনে চলবে না। Java অন্য পথ নিয়েছে: সে কোডকে একবার bytecode-এ বদলায়, আর প্রতিটি যন্ত্রে একটি JVM সেটি চালায়। ফলে তৈরি ফাইলটাই সব জায়গায় চলে — কিন্তু প্রতিটি যন্ত্রে বড় একটি runtime লাগে, যা ছোট চিপে সম্ভব নয়।
গতির জন্য portability ছাড়া: আধুনিক CPU-তে এমন বিশেষ নির্দেশ আছে যা একসাথে অনেকগুলো সংখ্যা নিয়ে হিসাব করতে পারে। ভিডিও এনকোডিং, এনক্রিপশন বা AI-এর মতো ভারী কাজে প্রোগ্রামাররা প্রায়ই নির্দিষ্ট CPU-র জন্য আলাদা কোড লেখেন — কখনো সরাসরি assembly-তে। তখন সেই অংশ আর সব যন্ত্রে চলে না, তাই প্রতিটি CPU-র জন্য আলাদা সংস্করণ রাখতে হয়।
সাধারণ সমাধান — বেশিরভাগ portable, অল্প অংশ বিশেষ:
- ৯৫ শতাংশ কোড সাধারণ, portable C-তে।
- সবচেয়ে বেশি সময় নেওয়া ছোট অংশটুকুর জন্য প্রতিটি CPU-র বিশেষ সংস্করণ।
- প্রোগ্রাম চালু হওয়ার সময় দেখে নেয় এই CPU কোন বিশেষ নির্দেশ বোঝে, তারপর সেরা সংস্করণটি বেছে নেয়।
আরেকটি সূক্ষ্ম কথা: portable C লিখতেও সতর্কতা লাগে। int কত byte, তা যন্ত্রভেদে আলাদা হতে পারে; সংখ্যার byte-গুলো মেমরিতে কোন ক্রমে থাকবে, তাও CPU-ভেদে আলাদা। অসতর্ক কোড এক যন্ত্রে ঠিক চলে, আরেকটিতে ভুল ফল দেয়।
মূল উপলব্ধি: প্রকৌশলে প্রায় সব সিদ্ধান্ত একটি দাম দিয়ে আরেকটি সুবিধা কেনা। ভালো প্রকৌশলী সবখানে সর্বোচ্চ গতি চান না — মেপে দেখেন কোথায় গতি সত্যিই দরকার, আর শুধু সেখানে portability-র দাম দেন।
প্র ০৫“C হার্ডওয়্যারের কাছাকাছি” — আজকের আধুনিক CPU-র ক্ষেত্রে কথাটি কতটা সত্য?
কথাটি আংশিক সত্য — আর কোথায় সত্য নয়, সেটা জানলেই আপনি অন্যদের চেয়ে গভীরে ভাবতে পারবেন।
যেখানে সত্য: C-এর ভ্যারিয়েবল সরাসরি মেমরির কিছু byte; pointer সরাসরি একটি ঠিকানা; C-এর একটি যোগ CPU-র একটি যোগ-নির্দেশের খুব কাছাকাছি। কোনো লুকানো garbage collector নেই, লুকানো সীমা-যাচাই নেই। Python-এর তুলনায় C সত্যিই মেশিনের অনেক কাছে।
যেখানে সত্য নয়: C-এর নকশা হয়েছিল ১৯৭০-এর দশকের সরল কম্পিউটার মাথায় রেখে — যেখানে CPU একটির পর একটি নির্দেশ চালাত, আর মেমরি ছিল একটি লম্বা সরল সারি। আজকের CPU অনেক জটিল:
- একসাথে অনেক নির্দেশ চালায়, প্রয়োজনে ক্রম বদলে নেয় — কিন্তু C-এর চোখে সব একটির পর একটি।
- মেমরি আর CPU-র মাঝে কয়েক স্তরের দ্রুত “cache” আছে। একই কাজ দুইভাবে লিখলে cache-এর কারণে গতিতে বিশাল পার্থক্য হতে পারে — C-এর কোডে যা চোখে পড়ে না।
- Compiler আপনার কোড অনেকখানি বদলে দেয় (পর্ব ০৩-এর optimization) — তাই আপনি যা লেখেন আর CPU যা চালায়, দুটো হুবহু এক নয়।
২০১৮ সালে কম্পিউটার বিজ্ঞানী David Chisnall একটি প্রবন্ধে উসকানিমূলক শিরোনাম দিয়েছিলেন — “C Is Not a Low-level Language”. তাঁর যুক্তি ছিল, আধুনিক CPU আসলে C-এর পুরোনো মডেলের “অভিনয়” করে, যাতে পুরোনো C কোড দ্রুত চলে।
তাহলে C শিখে লাভ? বিশাল লাভ। মেশিনের পুরো সত্য কোনো ভাষাই দেখায় না, কিন্তু C দেখায় সবচেয়ে বেশি — মেমরি, ঠিকানা, byte, আকার। এখান থেকে শুরু করলে পরে cache বা CPU-র ভেতরের কাজ বোঝা অনেক সহজ হয় (Computer Architecture কোর্সে যা দেখবেন)।
মূল উপলব্ধি: প্রতিটি ভাষা মেশিনের একটি সরল করা “মডেল”। C-এর মডেল সবচেয়ে কাছের — তবুও এটি মডেল, পুরো সত্য নয়। ভালো প্রকৌশলী মডেল ব্যবহার করেন, কিন্তু সীমাটাও মনে রাখেন।
অনুশীলন
এগুলোর বেশিরভাগে কোড লিখতে হবে না — চারপাশে C খুঁজে বের করা আর ভাবাই আসল কাজ।
-
নিজের ফোনে C খুঁজুন: Android ফোনে Settings → About phone-এ যান (কিছু ফোনে এর ভেতরে Software information বা All specs). সেখানে “Kernel version” লেখাটি খুঁজুন। কী দেখলেন, আর এর মানে কী?
সেখানে
5.10বা6.1-এর মতো একটি সংখ্যা দিয়ে শুরু হওয়া লেখা পাবেন। এটি আপনার ফোনের Linux kernel-এর সংস্করণ। অর্থাৎ আপনার Android-এর একদম নিচে C-তে লেখা Linux kernel চলছে — যেটি ডায়াগ্রামের স্তর ৪. (iPhone-এ এই তথ্য সরাসরি দেখা যায় না, তবে সেখানেও kernel-এর বড় অংশ C.) -
Python-কে জিজ্ঞেস করুন সে কী দিয়ে তৈরি: কম্পিউটারে Python থাকলে terminal-এ লিখুন:
python -c "import sys; print(sys.version)". লেখার শেষে বন্ধনীর ভেতরে কী আছে?বন্ধনীর ভেতরে একটি compiler-এর নাম পাবেন — Linux-এ সাধারণত
GCC ..., Windows-এMSC v....(Microsoft-এর C/C++ compiler), Mac-এClang .... এটি সেই C compiler, যা দিয়ে আপনার Python interpreter-টি compile করা হয়েছে। অর্থাৎ Python নিজেই স্বীকার করছে — “আমি একটি C প্রোগ্রাম!” -
স্তরে ভাগ করুন: আপনি bKash অ্যাপে “Send Money” চাপলেন। এই মুহূর্তে ফোনের ভেতরে কোন কোন স্তর কী কাজ করে — অ্যাপ থেকে হার্ডওয়্যার পর্যন্ত নিজের ভাষায় লিখুন।
একটি সম্ভাব্য উত্তর:
- অ্যাপ: বোতাম চাপা বুঝল, নম্বর আর টাকার পরিমাণ গুছিয়ে একটি অনুরোধ তৈরি করল।
- Runtime: অ্যাপের কোড চালাচ্ছে Android-এর runtime.
- System library: অনুরোধটি এনক্রিপ্ট করল, যাতে পথে কেউ পড়তে না পারে — এই ধরনের এনক্রিপশন লাইব্রেরি সাধারণত C বা C++-এ লেখা।
- Kernel: system call পেয়ে ডেটা নেটওয়ার্কে পাঠানোর ব্যবস্থা করল।
- Driver ও firmware: মোবাইল ডেটা বা Wi-Fi চিপকে দিয়ে আসলে সংকেত পাঠাল।
- Hardware: রেডিও তরঙ্গে ডেটা টাওয়ারের দিকে গেল।
খেয়াল করুন, মাঝের অন্তত তিনটি স্তরে C বা C++ কাজ করেছে।
-
প্রথম প্রোগ্রাম, একটু বদলে: ওপরের
hello.cকোডটি বদলে এমন করুন যাতে প্রথম লাইনে আপনার নাম আর দ্বিতীয় লাইনে আপনার জেলার নাম ছাপা হয় (ইংরেজি অক্ষরে)।শুধু
printf-এর ভেতরের লেখা বদলালেই হবে। প্রতিটি লাইনের শেষে\nরাখুন, যাতে পরের লেখা নতুন লাইনে যায়:#include <stdio.h> int main(void) { printf("Name: Rafi Ahmed\n"); printf("District: Rajshahi\n"); return 0; }\nবাদ দিয়ে চালিয়ে দেখুন কী হয় — দুটি লেখা একই লাইনে জোড়া লেগে যাবে। ছোট একটি চিহ্নের কত বড় প্রভাব!
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমC-এর ইতিহাসের ঘটনাগুলো সময় অনুযায়ী সাজান (▲▼ চেপে সরান)
- 🅱️ Ken Thompson তৈরি করলেন B ভাষা
- 💡 Dennis Ritchie তৈরি করলেন C
- 🐚 Unix kernel নতুন করে লেখা হলো C-তে
- 📘 প্রকাশিত হলো K&R বই “The C Programming Language”
- 📜 ANSI প্রকাশ করল প্রথম আনুষ্ঠানিক স্ট্যান্ডার্ড (C89)
- 🚀 প্রকাশিত হলো C23
একটি Android ফোনের একদম নিচের সফটওয়্যার স্তরে কোন kernel চলে, আর সেটি মূলত কোন ভাষায় লেখা?
- Android kernel — Java-তে লেখা
- Linux kernel — C-তে লেখা
- Windows NT kernel — C++-এ লেখা
- Python kernel — Python-এ লেখা
১৯৭৩ সালে Unix-কে C-তে নতুন করে লেখার সবচেয়ে বড় লাভ কী ছিল?
- Unix আগের চেয়ে অনেক দ্রুত চলতে শুরু করল
- সাধারণ ব্যবহারকারীরা প্রোগ্রামিং ছাড়াই Unix চালাতে পারলেন
- নতুন কম্পিউটারে Unix নেওয়া অনেক সহজ হলো (portability)
- Unix থেকে সব বাগ দূর হয়ে গেল
Python-এ print("Hi") চালালে লেখাটি স্ক্রিনে পাঠানোর জন্য শেষ পর্যন্ত kernel-এর কাছে কোন পথে অনুরোধ যায়?
- C-তে লেখা CPython → C library → system call
- Python কোড নিজেই সরাসরি স্ক্রিনে লেখে
- CPU সরাসরি Python কোড পড়ে স্ক্রিনে পাঠায়
- Python ইন্টারনেটে একটি সার্ভারকে অনুরোধ পাঠায়
Microsoft ও Chromium দল জানিয়েছে, তাদের গুরুতর নিরাপত্তা-ত্রুটির প্রায় ৭০ শতাংশ এক ধরনের সমস্যা থেকে আসে। কোনটি?
- ব্যবহারকারীর দুর্বল পাসওয়ার্ড
- কোডের syntax-এর ভুল
- প্রোগ্রাম ধীরে চলা
- Memory safety-র সমস্যা — যেমন সীমার বাইরে মেমরিতে লেখা
নিচের কোন কাজের জন্য C সবচেয়ে মানানসই?
- একটি Excel ফাইলের বিক্রির হিসাব থেকে চার্ট বানানো
- ওয়াশিং মেশিনের microcontroller-এর firmware লেখা
- একটি ওয়েবসাইটের ডিজাইন সাজানো
- ফোল্ডারের ছবিগুলোর নাম একবারে বদলানোর ছোট স্ক্রিপ্ট
C-কে “হার্ডওয়্যারের কাছাকাছি” ভাষা বলা হয় মূলত কেন?
- C-তে সরাসরি 0 আর 1 দিয়ে কোড লিখতে হয়
- C শুধু একটি নির্দিষ্ট CPU-তে চলে
- মেমরি, ঠিকানা আর byte সরাসরি নিয়ন্ত্রণ করা যায়, আর পেছনে বড় কোনো runtime নেই
- C প্রোগ্রাম চালাতে বিশেষ হার্ডওয়্যার কিনতে হয়
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- কম্পিউটার স্তরে সাজানো: অ্যাপ → runtime → library → kernel → firmware/driver → হার্ডওয়্যার; মাঝের স্তরগুলোতে C-এর রাজত্ব।
- Python-এর একটি
print-এর নিচেও C কাজ করে — CPython, libc আর kernel তিনটিই C-তে লেখা। - ১৯৭২-এ Dennis Ritchie C তৈরি করেন; ১৯৭৩-এ Unix C-তে লেখা হয় — জন্ম নেয় portability.
- C দেয় গতি, নিয়ন্ত্রণ, ছোট আকার; বিনিময়ে চায় মনোযোগ — কারণ memory safety-র কোনো জাল নেই।
- AI-এর যুগে C জানা মানে মেশিন বোঝা — আর মেশিন বুঝলেই AI-এর কোড যাচাই করা যায়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০২ · কম্পিউটেশনাল থিংকিং — সমস্যা ভাঙার কৌশলপরবর্তী পর্বকোড লেখার আগে সমস্যাকে কম্পিউটারের মতো করে ভাবতে শেখা।
- C প্রোগ্রামিং · কোর্স হোম৫৬টি পর্বপুরো কোর্সের রোডম্যাপ — কোন পর্ব কখন।
- Operating Systemsগভীরে যানKernel, system call, প্রসেস আর মেমরি — এই পর্বের স্তর ৪-এর ভেতরের গল্প।
- Computer Architecture & Digital Logicপাশের ট্র্যাকCPU আসলে machine code কীভাবে চালায় — লজিক গেট থেকে cache পর্যন্ত।
- Python Programmingপাশের ট্র্যাকযে ভাষার নিচে C লুকিয়ে আছে — দুটো একসাথে জানলে দুটোই ভালো বুঝবেন।