সরাসরি পর্বে যান
পর্ব ২৩ · ৫৫-এর মধ্যে · মডিউল ৪

ট্রানজিস্টর থেকে অ্যাপ — বিমূর্ততার স্তর

From Transistors to Apps — Layers of Abstraction in a Computer

Taught in Bangla, this lesson shows how a computer is built in layers of abstraction: the ladder from electrons and transistors to gates, adders and microarchitecture, the ISA with machine code and assembly as the hardware-software contract, operating systems, languages, libraries and virtual machines, why layers help and where they leak, how chips are made from sand, and natural language as the newest layer.

এই পর্বে যা শিখবেন

  • বিমূর্ততা (abstraction) আর ইন্টারফেস (interface) আসলে কী, আর কেন এগুলো ছাড়া কম্পিউটার বানানো অসম্ভব
  • ইলেকট্রন থেকে অ্যাপ পর্যন্ত পুরো স্তর — একটি “ক” টাইপ করার যাত্রা ধরে ধরে
  • একটি C লাইন কীভাবে assembly, machine code হয়ে শেষে গেটের ভেতর দিয়ে যোগফল হয়
  • ISA, firmware, microcode, virtual machine আর emulator — হার্ডওয়্যার-সফটওয়্যারের সীমানা কোথায়
  • স্তর কোথায় ফাঁস হয়, চিপ কীভাবে তৈরি হয়, আর AI কোডিং টুল কেন নতুন একটি স্তর

১ · শতকোটি সুইচ একসাথে ভাবা অসম্ভব — বিমূর্ততা আর ইন্টারফেস

আপনার ফোনে WhatsApp খুলে “কেমন আছো?” লিখে “Send” চাপলেন। এক সেকেন্ডও লাগল না। অথচ এই এক চাপের পেছনে ফোনের চিপের ভেতরে কয়েকশো কোটি ট্রানজিস্টর লাখ লাখ বার চালু-বন্ধ হয়েছে। যে প্রোগ্রামার “Send” বোতামটি বানিয়েছেন, তিনি কি এই ট্রানজিস্টরগুলোর কথা ভেবে কোড লিখেছেন? একেবারেই না। আর যে প্রকৌশলী ফোনের চিপের ট্রানজিস্টর সাজিয়েছেন, তিনিও WhatsApp-এর কথা কখনো ভাবেননি।

দুজনেই কাজ করতে পেরেছেন, কারণ কম্পিউটার তৈরি হয় তলায় তলায়, একটি বহুতল ভবনের মতো। প্রতিটি তলা নিচের তলার এলোমেলো, জটিল খুঁটিনাটি লুকিয়ে রাখে, আর ওপরের তলাকে দেয় একটি সহজ, পরিষ্কার “ভাষা”। এই লুকিয়ে রাখার কৌশলের নাম বিমূর্ততা (abstraction). আর দুই তলার মাঝে যে নির্দিষ্ট নিয়ম বা “দরজা” দিয়ে কথা হয়, তাকে বলে ইন্টারফেস (interface).

মূল ধারণা

বিমূর্ততা = “কী করে” সেটুকু জানানো, “কীভাবে করে” লুকিয়ে রাখা। ইন্টারফেস = দুই পক্ষের চুক্তি: ওপরের তলা কী চাইতে পারবে, নিচের তলা কী দেবে। চুক্তি ঠিক থাকলে দুই পক্ষ একে অপরের ভেতরের কথা না জেনেই একসাথে কাজ করতে পারে।

দুটি দৈনন্দিন উপমা

গাড়ির স্টিয়ারিং: গাড়ি চালাতে আপনাকে জানতে হয় তিনটি জিনিস — স্টিয়ারিং ঘোরালে গাড়ি ঘোরে, এক্সেলারেটরে চাপ দিলে চলে, ব্রেকে চাপলে থামে। ইঞ্জিনে কয়টি সিলিন্ডার, জ্বালানি কোন মুহূর্তে জ্বলে, গিয়ারবক্সের দাঁত কয়টি — কিছুই জানতে হয় না। স্টিয়ারিং-প্যাডেল হলো ইন্টারফেস; ইঞ্জিনের ভেতরটা লুকানো. আর মজার ব্যাপার: পেট্রোল গাড়ি থেকে ইলেকট্রিক গাড়িতে গেলে ইঞ্জিন পুরো বদলে যায়, কিন্তু স্টিয়ারিং-প্যাডেল প্রায় একই থাকে — চালককে নতুন করে শিখতে হয় না।

দেয়ালের বিদ্যুতের সকেট: বাংলাদেশে ঘরের সকেট দেয় প্রায় ২২০ ভোল্টের বিদ্যুৎ। আপনার ফ্যান, ফ্রিজ বা ল্যাপটপের চার্জার জানে না সেই বিদ্যুৎ কোথা থেকে এল — রূপপুরের পারমাণবিক কেন্দ্র, গ্যাসের কেন্দ্র, না ছাদের সোলার প্যানেল। সকেট একটি চুক্তি: “এই আকারের প্লাগ লাগালে এই ভোল্টেজ পাবেন।” চুক্তির দুই পাশে দুই জগৎ — বিদ্যুৎকেন্দ্রের প্রকৌশলী আর ফ্যানের নির্মাতা — একে অপরকে না চিনেই কাজ করে।

কম্পিউটারেও ঠিক তাই। “ক” অক্ষরটি পর্দায় দেখানোর সময় অ্যাপ শুধু বলে “এই লেখাটি দেখাও”; কোন পিক্সেল কোন রঙে জ্বলবে, সেটি নিচের তলার দায়িত্ব। পর্ব ২০-এ আপনি লজিক গেটকে একটি “কালো বাক্স” ধরে কাজ করেছেন — ভেতরে কোন ট্রানজিস্টর কোথায়, তা না ভেবেই। পর্ব ২১–২২-এ অ্যাডার বানানোর সময়ও একেকটি গেট নয়, ভেবেছেন “অ্যাডার” নামের বড় বাক্সের কথা। আপনি না জেনেই বিমূর্ততা ব্যবহার করছিলেন। এই পর্বে পুরো ভবনটি নিচ থেকে ওপর পর্যন্ত একবার ঘুরে দেখবেন।

কেন স্তর ছাড়া উপায় নেই

একটু হিসাব করুন। ধরুন সেকেন্ডে একটি করে, দিনরাত না থেমে গুনছেন। একটি ল্যাপটপ চিপের ১,০০০ কোটি ট্রানজিস্টর গুনতেই লাগবে তিনশো বছরের বেশি — নকশা তো দূরের কথা। মানুষের মাথা একসাথে মোটামুটি কয়েকটি জিনিস ধরে রাখতে পারে। তাই একমাত্র উপায়: অল্প কয়েকটি জিনিস দিয়ে একটি বড় জিনিস বানানো, সেটির একটি নাম দেওয়া, তারপর সেই নামকে আবার একটি “ছোট” জিনিস ধরে পরের তলা বানানো। ৪টি ট্রানজিস্টর = একটি NAND গেট; কয়েকটি গেট = একটি full adder; ৩২টি full adder = একটি 32-bit অ্যাডার; অ্যাডার আর আরও কিছু = ALU — এভাবে।

২ · স্তরের মই — ইলেকট্রন থেকে ব্যবহারকারী পর্যন্ত

নিচের টেবিলটি পুরো পর্বের মানচিত্র। একেবারে নিচে পদার্থবিজ্ঞান, একেবারে ওপরে আপনি। প্রতিটি সারিতে দেখুন — সেই তলার মানুষ কী নিয়ে ভাবেন, আর ওপরের তলাকে কী “ভাষা” দেন। এই কোর্সের কোন পর্বে কোন তলা বিস্তারিত পাবেন, তাও দেওয়া আছে।

তলা (নিচ থেকে)এখানে যা নিয়ে ভাবা হয়ওপরের তলাকে যা দেয়কোর্সে
১. পদার্থবিজ্ঞানসিলিকনে ইলেকট্রনের চলাচল, ভোল্টেজনিয়ন্ত্রণযোগ্য বিদ্যুৎ-প্রবাহএই পর্ব
২. ট্রানজিস্টরgate-এ ভোল্টেজ দিলে পথ খোলে-বন্ধ হয়বিদ্যুতে চলা সুইচএই পর্ব
৩. লজিক গেটকয়েকটি ট্রানজিস্টরের সাজানোAND, OR, NOT, NAND — 0/1-এর নিয়মপর্ব ২০
৪. সার্কিটগেট জুড়ে অ্যাডার, মাল্টিপ্লেক্সার, ফ্লিপ-ফ্লপ“যোগ করো”, “মনে রাখো”পর্ব ২১–২২
৫. মাইক্রোআর্কিটেকচারALU, রেজিস্টার, control unit, cache কীভাবে সাজানোনির্দেশ চালানোর যন্ত্রপর্ব ২৪–২৫
৬. ISA (machine code)CPU কোন কোন নির্দেশ বোঝে, কীভাবে bit-এ লেখাহার্ডওয়্যার-সফটওয়্যারের চুক্তিএই পর্ব, পর্ব ২৪
৭. Assemblymachine code-এর মানুষ-পড়া রূপADD, MOV-এর মতো নামএই পর্ব
৮. অপারেটিং সিস্টেমprocess, মেমরি, ফাইল, driver“ফাইল খোলো”, “পর্দায় আঁকো”পর্ব ২৬–২৭
৯. প্রোগ্রামিং ভাষাcompiler, interpretera = b + c লেখার সুবিধাপর্ব ৩৮–৪০
১০. লাইব্রেরি ও frameworkরেডিমেড কোডের ভান্ডার“বার্তা পাঠাও”, “ছবি দেখাও”পর্ব ৫
১১. অ্যাপ্লিকেশনWhatsApp, bKash, Wordবোতাম, মেনু, পর্দামডিউল ১–২
১২. ব্যবহারকারীআপনি——

খেয়াল করুন, প্রতিটি তলার “ভাষা” আগেরটির চেয়ে মানুষের কাছাকাছি। নিচে আছে ভোল্টেজ, মাঝে 0/1, তারপর ADD, তারপর a = b + c, তারপর “Send” বোতাম। ওপরে কাজ বলা সহজ; নিচে যন্ত্রের ওপর নিয়ন্ত্রণ বেশি।

ওপরের তলা জিজ্ঞেস করে “কী?”, নিচের তলা জানে “কীভাবে?”
মাঝখানে দাঁড়িয়ে থাকে একটি চুক্তি — ইন্টারফেস।

একটি “ক”-এর যাত্রা — ওপর থেকে নিচে, তারপর আবার ওপরে

এবার একটি সত্যিকারের ঘটনা ধরে মইটি বেয়ে নামুন। আপনি অভ্র (phonetic) চালু রেখে কিবোর্ডে k চাপলেন, আর নোটপ্যাডে “ক” দেখা গেল। নিচের ডায়াগ্রামে “পরে” চাপুন, প্রতিটি তলায় কী ঘটে দেখুন। (বিভিন্ন OS-এ ধাপগুলো একটু আলাদা, স্তরগুলো একই।)

  1. কিবোর্ডscan codeহার্ডওয়্যার
  2. Driver + OSinterruptঅপারেটিং সিস্টেম
  3. অভ্রU+0995লেআউট
  4. অ্যাপinsert("ক")অ্যাপ্লিকেশন
  5. CPUMOV, ADD…নির্দেশ → গেট
  6. ফন্টglyphআকার আঁকা
  7. পর্দাpixelআলো
এই মুহূর্তে “ক”-কে কে কীভাবে দেখছে
তলা
তার কাছে “ক” মানে
যা সে জানে না
  1. কিবোর্ড — শুধু একটি নম্বর। চাবির নিচে তারের জাল (matrix); চাপ দিলে একটি সংযোগ হয়। কিবোর্ডের ভেতরের ছোট্ট microcontroller সেটি ধরে একটি scan code পাঠায় USB দিয়ে। কিবোর্ড জানে না এটি “k” না “ক” — সে শুধু জানে “এই নম্বরের চাবি চাপা হয়েছে”।
  2. Driver আর অপারেটিং সিস্টেম। USB নিয়ন্ত্রক CPU-কে একটি interrupt দেয় — “হাতের কাজ একটু থামাও, নতুন খবর এসেছে।” অপারেটিং সিস্টেম-এর kernel আর কিবোর্ডের driver নম্বরটি পড়ে একটি “কি চাপার ঘটনা” বানায়, তারপর যে জানালা সামনে আছে, সেই অ্যাপের দিকে পাঠায়। process আর interrupt-এর বিস্তারিত পর্ব ২৬–২৭-এ।
  3. অভ্র — চাবি থেকে অক্ষর। অভ্র একটি ইনপুট-পদ্ধতি; সে “k” দেখে বুঝে নেয় আপনি “ক” চান, আর বসিয়ে দেয় Unicode code point U+0995 (পর্ব ৭ আর ১৮)। এই তলায় প্রথমবার চাবিটি একটি অক্ষর হলো। বিজয় লেআউটে একই চাবি অন্য অক্ষর দিত — নিচের তলাগুলো কিছুই টের পেত না।
  4. অ্যাপ — লেখায় অক্ষর যোগ। নোটপ্যাড শুধু জানে “আমার লেখায় একটি নতুন অক্ষর এসেছে, cursor-এর জায়গায় বসাও, তারপর পর্দা নতুন করে আঁকতে বলো।” কিবোর্ড, USB বা অভ্র নিয়ে তার মাথাব্যথা নেই; প্রোগ্রামার কাজটি লিখেছেন কয়েক লাইনে, একটি library-র সাহায্যে।
  5. CPU — সব তলার নিচে একই ইঞ্জিন। ওপরের প্রতিটি ধাপ — driver, অভ্র, অ্যাপ — আসলে প্রোগ্রাম। শেষ পর্যন্ত সবগুলো CPU-র কাছে পৌঁছায় হাজার হাজার ছোট নির্দেশ হিসেবে: “এই মেমরি থেকে পড়ো”, “এই দুটি যোগ করো”, “তুলনা করো”। প্রতিটি নির্দেশ মানে কোটি কোটি গেট আর ট্রানজিস্টরের চালু-বন্ধ। ট্রানজিস্টর জানে না সে একটি বাংলা অক্ষর লিখতে সাহায্য করছে।
  6. ফন্ট ইঞ্জিন — অক্ষর থেকে আকার। আবার ওপরে ওঠার পালা। U+0995 নম্বরটিকে আঁকতে হবে। ফন্ট ফাইলে “ক”-এর একটি আকৃতি (glyph) রাখা আছে, রেখা আর বাঁকের হিসাব হিসেবে। যুক্তাক্ষর হলে shaping engine ঠিক করে কোন আকার বসবে। তারপর সেই আকারকে পর্দার ছোট ছোট বর্গে — পিক্সেলে — ভাগ করা হয়, প্রায়ই GPU-র সাহায্যে।
  7. পর্দা — আলো। GPU পুরো পর্দার ছবি তৈরি করে ডিসপ্লেতে পাঠায়, সাধারণত সেকেন্ডে ৬০ বা তার বেশিবার। ডিসপ্লের প্রতিটি পিক্সেলের পেছনেও ক্ষুদ্র ট্রানজিস্টর আছে, যারা ঠিক করে কতটা আলো জ্বলবে। আপনার চোখ সেই আলো দেখে পড়ে “ক”। পুরো যাত্রা চোখের পলকের চেয়ে কম সময়ে। (ছবি কীভাবে পিক্সেল হয়, তা পর্ব ২৮-এ।)

এই যাত্রার সবচেয়ে গুরুত্বপূর্ণ শিক্ষা হলো “যা সে জানে না” সারিটি। প্রতিটি তলা ইচ্ছা করেই অনেক কিছু জানে না — আর ঠিক সেই না-জানার কারণেই প্রতিটি তলা আলাদাভাবে বানানো, পরীক্ষা করা আর বদলানো যায়।

৩ · নিচের তলা — ট্রানজিস্টর থেকে গেট, গেট থেকে অ্যাডার

মইয়ের একেবারে নিচে সেমিকন্ডাক্টর সিলিকন। বিশুদ্ধ সিলিকন বিদ্যুৎ খুব একটা চালায় না, আবার পুরোপুরি আটকায়ও না। সামান্য অন্য পরমাণু মিশিয়ে (doping) আর বাইরে থেকে ভোল্টেজ দিয়ে এর বিদ্যুৎ চালানোর ক্ষমতা নিয়ন্ত্রণ করা যায়।

MOSFET — একটি সরল ছবি

আজকের প্রায় সব চিপে যে ট্রানজিস্টর থাকে, তার নাম MOSFET. সহজ করে ভাবুন: সিলিকনের ওপর দুটি প্রান্ত — source (যেখান থেকে ইলেকট্রন আসে) আর drain (যেখানে যায়)। মাঝখানে একটি সরু পথ, যার নাম channel. পথের ঠিক ওপরে, খুব পাতলা একটি অন্তরক (insulator) স্তরের ওপারে বসে থাকে তৃতীয় প্রান্ত — gate. gate-এ উপযুক্ত ভোল্টেজ দিলে তার বৈদ্যুতিক টানে নিচে ইলেকট্রনের একটি সরু পথ তৈরি হয় — channel খুলে যায়, বিদ্যুৎ চলে। ভোল্টেজ সরালে পথ মিলিয়ে যায় — সুইচ বন্ধ।

উপমা: নদীর ওপর একটি স্লুইস গেট ভাবুন। পানি (ইলেকট্রন) এক পাশ থেকে আরেক পাশে যেতে চায়, কিন্তু মাঝে দরজা। দরজার হাতলে কেউ চাপ দিলে (gate-এ ভোল্টেজ) পানি বয়ে যায়; ছেড়ে দিলে থামে। বিশেষ ব্যাপার হলো, এখানে হাতল চাপার “হাত”-টিও আরেকটি নদীর পানি — অর্থাৎ একটি ট্রানজিস্টরের আউটপুট আরেকটির gate নিয়ন্ত্রণ করতে পারে। সুইচ দিয়ে সুইচ চালানো — এখান থেকেই যুক্তির জন্ম।

MOSFET দুই রকম: nMOS (gate-এ 1 দিলে চালু) আর pMOS (gate-এ 0 দিলে চালু)। এই দুটিকে জোড়ায় জোড়ায় বসানোর পদ্ধতির নাম CMOS — পর্ব ২০-এ নামটি শুনেছেন। নিচের stepper-এ দেখুন, একটি সুইচ থেকে কীভাবে ধাপে ধাপে যোগ করার যন্ত্র তৈরি হয়। প্রতিটি ধাপে আগের ধাপের জিনিসটিকে একটি “বাক্স” ধরে নতুন বাক্স বানানো হচ্ছে — এটাই বিমূর্ততার আসল চেহারা।

ট্রানজিস্টর (nMOS)বিদ্যুতে চলা সুইচ
  gate = 0 V   →  channel নেই   →  source ✕ drain   (OFF = 0)
  gate = 1 V   →  channel তৈরি  →  source ━ drain   (ON = 1)
NOT গেট (CMOS inverter)২টি ট্রানজিস্টর
        VDD (1)
         │
   A ──[pMOS]   A = 0 হলে চালু → Y কে 1-এ টানে
         ├──── Y = A′
   A ──[nMOS]   A = 1 হলে চালু → Y কে 0-তে টানে
         │
        GND (0)
NAND গেট৪টি ট্রানজিস্টর
  ওপরে: ২টি pMOS পাশাপাশি  (A বা B যেকোনো একটি 0 → Y = 1)
  নিচে: ২টি nMOS পরপর      (A আর B দুটোই 1 → Y = 0)

  A B │ Y = (A·B)′
  0 0 │ 1
  0 1 │ 1
  1 0 │ 1
  1 1 │ 0
Full adder৯টি NAND = ৩৬টি ট্রানজিস্টর
  ইনপুট: A, B, Cin   →   আউটপুট: Sum, Cout
  Sum  = A ⊕ B ⊕ Cin
  Cout = A·B + Cin·(A ⊕ B)

  এখন আর ট্রানজিস্টর নয়, ভাবছি “এক bit যোগ”।
32-bit অ্যাডার → ALUকয়েক হাজার ট্রানজিস্টর
  [FA]←[FA]←[FA]← … ←[FA]   ৩২টি full adder, carry ডান থেকে বাঁয়ে
   │    │    │         │
  S31  S30  S29  …    S0

  ALU-কে বলা হয়: “ADD”  — কোন গেট কোথায়, কেউ আর ভাবে না
বাক্সের হিসাব
এখন যে “বাক্স” নিয়ে ভাবছি
ভেতরে ট্রানজিস্টর
এই বাক্সের “ভাষা”
  1. একটি ট্রানজিস্টর। gate-এ 0 থাকলে source আর drain-এর মাঝে পথ নেই — সুইচ খোলা। 1 দিলে channel তৈরি হয়, বিদ্যুৎ চলে। এই তলার প্রকৌশলী ভাবেন ভোল্টেজ, তাপ আর ইলেকট্রনের গতি নিয়ে।
  2. দুটি ট্রানজিস্টর = NOT. ওপরে একটি pMOS (আউটপুটকে 1-এর দিকে টানে), নিচে একটি nMOS (0-র দিকে টানে), দুটির gate-এ একই ইনপুট A. A = 1 হলে নিচেরটি চালু, ওপরেরটি বন্ধ — Y = 0. A = 0 হলে উল্টো — Y = 1. স্থির অবস্থায় প্রায় বিদ্যুৎ খরচ হয় না — CMOS-এর বড় গুণ।
  3. চারটি ট্রানজিস্টর = NAND. নিচের দুটি nMOS পরপর (সিরিজে) — দুটোই চালু হলে তবেই আউটপুট 0. ওপরের দুটি pMOS পাশাপাশি — যেকোনো একটি চালু হলেই আউটপুট 1. পর্ব ২০-এর সিরিজ = AND, প্যারালাল = OR এখানে হুবহু কাজ করছে। এখন থেকে আর ট্রানজিস্টর আঁকতে হবে না, শুধু NAND-এর চিহ্ন।
  4. নয়টি NAND = full adder. পর্ব ২১-এ দেখেছেন, full adder তিনটি bit (A, B আর আগের carry) যোগ করে Sum আর Cout দেয়। শুধু NAND দিয়ে বানালে ৯টি গেট, মানে ৩৬টি ট্রানজিস্টর লাগে; চিপ-নকশাকারীরা সরাসরি CMOS-এ চতুর নকশায় প্রায় ২৮টিতে সারেন। কিন্তু এই তলায় যিনি কাজ করছেন, তিনি আর ট্রানজিস্টর গোনেন না — ভাবেন “এক bit যোগ”।
  5. ৩২টি full adder = 32-bit অ্যাডার। একটির carry পরেরটিতে ঢোকে — ripple carry adder. আসল CPU-তে দ্রুততর নকশা (carry lookahead) ব্যবহার হয়, ফলে ট্রানজিস্টর আরও বেশি লাগে। অ্যাডার আর আরও কিছু সার্কিট মিলে তৈরি হয় ALU. CPU-র নকশাকারী এখন শুধু বলেন “ALU, ADD করো” — পাঁচ তলা নিচের ইলেকট্রনের কথা ভাবার দরকারই নেই।

প্রতিটি ধাপে সংখ্যা বেড়েছে কয়েক গুণ, কিন্তু মাথায় রাখার জিনিস একই — একটি বাক্স, তার ইনপুট আর আউটপুট। এভাবে মাত্র কয়েক ধাপে ১ থেকে হাজারে পৌঁছানো গেল; আরও কয়েক ধাপে পৌঁছানো যায় শতকোটিতে। রেজিস্টার আর মেমরিও একইভাবে তৈরি — পর্ব ২২-এর ফ্লিপ-ফ্লপ জুড়ে জুড়ে।

৪ · হার্ডওয়্যার-সফটওয়্যারের চুক্তি — ISA, machine code আর assembly

ALU, রেজিস্টার, control unit, cache — এগুলো কীভাবে সাজানো, কয়টি কাজ একসাথে চলে, কোন পথে ডেটা যায় — এই নকশাকে বলে মাইক্রোআর্কিটেকচার. Intel-এর একটি নতুন প্রজন্মের চিপ আর আগের প্রজন্মের চিপের মাইক্রোআর্কিটেকচার অনেকটাই আলাদা। তবুও দুটিতেই আপনার পুরোনো Windows প্রোগ্রাম চলে। কেন? কারণ মাইক্রোআর্কিটেকচারের ঠিক ওপরে আছে একটি চুক্তি, যা বদলায়নি।

সেই চুক্তির নাম ISA — Instruction Set Architecture. ISA বলে দেয়: CPU কোন কোন নির্দেশ বোঝে (যোগ, বিয়োগ, মেমরি থেকে পড়া, লাফ দেওয়া…), কয়টি রেজিস্টার আছে আর তাদের নাম কী, আর প্রতিটি নির্দেশ কীভাবে 0/1-এ লেখা হবে। 0/1-এ লেখা এই নির্দেশগুলোই machine language বা machine code. প্রতিটি নির্দেশের প্রথম অংশে থাকে কোন কাজ — opcode; বাকিটা বলে কোন রেজিস্টার বা কোন সংখ্যার ওপর কাজ।

মূল ধারণা

ISA হলো হার্ডওয়্যার আর সফটওয়্যারের মাঝের সবচেয়ে গুরুত্বপূর্ণ ইন্টারফেস। সফটওয়্যার জানে শুধু ISA; হার্ডওয়্যার যেকোনো উপায়ে ISA মানলেই চলে। একই ISA-র দুটি চিপ ভেতরে সম্পূর্ণ আলাদা হতে পারে — একটি ধীর, কম বিদ্যুতের; আরেকটি দ্রুত, বেশি বিদ্যুতের — কিন্তু একই প্রোগ্রাম দুটিতেই চলে।

আজকের তিন বড় ISA

x86 (ও x86-64)

Intel ১৯৭৮ সালে 8086 চিপ দিয়ে শুরু করে। পরে AMD একে 64-bit-এ বাড়ায় (x86-64). বেশিরভাগ Windows ল্যাপটপ, ডেস্কটপ আর সার্ভারে চলে। নির্দেশগুলো অনেক রকম আর দৈর্ঘ্যে অসমান — CISC ঘরানা।

ARM

ব্রিটেনের Acorn কোম্পানিতে ১৯৮০-র দশকে জন্ম। প্রায় সব স্মার্টফোন, ট্যাবলেট আর Apple-এর M-সিরিজ Mac এখন ARM-এ চলে। সরল, সমান দৈর্ঘ্যের নির্দেশ — RISC ঘরানা।

RISC-V

২০১০ সালে University of California, Berkeley-তে শুরু। এর বিশেষত্ব — ISA-টি উন্মুক্ত (open standard), লাইসেন্স-ফি ছাড়াই যে কেউ এই ISA-র চিপ বানাতে পারে।

এক ISA-র machine code অন্য ISA-র CPU বোঝে না — ঠিক যেমন বাংলায় লেখা চিঠি শুধু চীনা ভাষা জানা কেউ পড়তে পারেন না। এজন্যই Windows-এর একটি সাধারণ .exe ফাইল সরাসরি ফোনে চলে না।

Assembly — machine code-এর মানুষ-পড়া রূপ

00000001 11011000 দেখে কিছু বোঝা কঠিন। তাই প্রতিটি নির্দেশের একটি ছোট নাম দেওয়া হয় — ADD, MOV, JMP — আর রেজিস্টারের নাম লেখা হয় অক্ষরে। এই রূপের নাম assembly language. machine code আর assembly-র মধ্যে প্রায় এক-এক সম্পর্ক: একটি assembly লাইন = একটি machine নির্দেশ। assembly থেকে machine code বানায় assembler নামের প্রোগ্রাম। আর C, Python-এর মতো high-level language-এর একটি লাইন থেকে অনেকগুলো machine নির্দেশ তৈরি হতে পারে — সেই অনুবাদ করে compiler বা interpreter (পর্ব ৩৮)।

নিচের stepper-এ একটি C লাইন a = b + c; মই বেয়ে নিচে নামবে। ধরা যাক b = 5 আর c = 3. assembly আর machine code x86-64-এর ধাঁচে দেখানো হয়েছে; বোঝানোর জন্য সরল করা (illustrative) — আসল compiler-এর আউটপুট সেটিং অনুযায়ী একটু আলাদা হতে পারে।

  1. Ca = b + c;high-level
  2. Assemblyadd eax, ebxcompiler
  3. Machine code01 D8assembler
  4. Control unitdecodemicroarchitecture
  5. ALU অ্যাডার0101 + 0011গেট
main.cমানুষের জন্য লেখা
int a, b = 5, c = 3;
a = b + c;       // কোন রেজিস্টার, কোন bit — কিছুই বলতে হয় না
main.sAssembly (x86-64 ধাঁচ, সরল করা)
mov  eax, [b]     ; মেমরি থেকে b → রেজিস্টার eax
mov  ebx, [c]     ; মেমরি থেকে c → রেজিস্টার ebx
add  eax, ebx     ; eax = eax + ebx
mov  [a], eax     ; ফল মেমরিতে a-এর জায়গায়
Machine codeadd eax, ebx-এর আসল দুই byte
hex :  01        D8
bit :  00000001  11 011 000
       opcode    │  │   └ eax (000) — গন্তব্য
                 │  └ ebx (011) — উৎস
                 └ 11 = দুটিই রেজিস্টার
CPU-র ভেতরেনির্দেশ ভেঙে সংকেত
opcode 01  →  “ALU: যোগ করো”
011        →  রেজিস্টার ebx-এর তার খোলো
000        →  রেজিস্টার eax-এর তার খোলো, ফলও eax-এ
এই সংকেতগুলো আসলে কয়েকটি তারে 0/1 — মাল্টিপ্লেক্সার আর ডিকোডার (পর্ব ২১) দিয়ে।
ALU-র অ্যাডারfull adder ধরে ধরে (শেষ ৪ bit)
  carry:  1 1 1 0
     b :  0 1 0 1    (5)
   + c :  0 0 1 1    (3)
  ─────────────────
     a :  1 0 0 0    (8)
একই কাজ, পাঁচ তলায়
এই তলার ভাষা
a-এর মান
  1. C — মানুষের ভাষার কাছাকাছি। আপনি লিখলেন a = b + c;. কোন রেজিস্টার, কোন মেমরি-ঠিকানা, কত bit — কিছুই বলতে হয়নি। এই লাইনটি x86 ল্যাপটপ আর ARM ফোন — দুটির জন্যই compile করা যায়। এটাই high-level ভাষার সুবিধা।
  2. Compiler — assembly-তে অনুবাদ। x86-এর ADD নির্দেশ মেমরির দুটি জায়গা সরাসরি যোগ করতে পারে না, তাই compiler আগে মানগুলো রেজিস্টারে আনে, যোগ করে, ফল ফেরত রাখে — চারটি নির্দেশ। একটি C লাইন থেকে চারটি নির্দেশ: high-level আর assembly-র পার্থক্য এখানেই।
  3. Assembler — বাইনারিতে। add eax, ebx হয়ে যায় দুটি byte: 01 D8. প্রথম byte 01 হলো opcode — “৩২-bit রেজিস্টার যোগ”। দ্বিতীয় byte-এর bit-গুলো বলে কোন দুটি রেজিস্টার: ebx-এর নম্বর 011, eax-এর 000. ARM-এ একই ধরনের যোগের নির্দেশ (add w0, w1, w2) হতো সম্পূর্ণ আলাদা চারটি byte — অন্য ISA, অন্য চুক্তি।
  4. Control unit — সংকেতে ভাঙা। CPU নির্দেশটি মেমরি থেকে আনে আর control unit তা ভেঙে ঠিক করে: ALU-কে “যোগ” মোডে নাও, ebx আর eax রেজিস্টারের আউটপুট ALU-তে পাঠাও, ফল eax-এ লেখো। fetch-decode-execute চক্রের পুরো গল্প পর্ব ২৪-এ।
  5. ALU — গেটের কাজ। 5 (0101) আর 3 (0011) ঢুকল full adder-গুলোতে। ডান দিক থেকে: 1 + 1 = 0, carry 1; 0 + 1 + 1 = 0, carry 1; 1 + 0 + 1 = 0, carry 1; 0 + 0 + 1 = 1. ফল 1000 = 8. প্রতিটি যোগ আসলে কয়েকটি XOR, AND, OR গেট, আর প্রতিটি গেট কয়েকটি ট্রানজিস্টর। একটি C লাইন থেকে ট্রানজিস্টর পর্যন্ত নামা শেষ।

নিজে চালিয়ে দেখুন — মই বেয়ে নামার ছোট সিমুলেশন

নিচের কোডটি একটি খেলনা কম্পিউটারের মতো একই যাত্রা দেখায়: sum = 5 + 3 → কাল্পনিক ছোট ISA-র assembly → ৮-bit machine code → full adder দিয়ে bit ধরে ধরে যোগ। কাল্পনিক ISA-তে opcode মাত্র ২ bit: MOV = 01, ADD = 10. “Run” চাপুন।

const bits = (n) => n.toString(2).padStart(4, '0');      // সংখ্যা → 4-bit
console.log('1) High-level : sum = 5 + 3');
console.log('2) Assembly   : MOV R1,5 | MOV R2,3 | ADD R0,R1,R2');
const OP = { MOV: '01', ADD: '10' };                       // খেলনা ISA-র opcode
const code = [OP.MOV + '01' + bits(5), OP.MOV + '10' + bits(3), OP.ADD + '00' + '01' + '10'];
console.log('3) Machine    : ' + code.join(' '));
const XOR = (a, b) => a ^ b, AND = (a, b) => a & b, OR = (a, b) => a | b;  // গেট
function fullAdder(a, b, cin) {                            // গেট দিয়ে ১ bit যোগ
  const s1 = XOR(a, b);
  return { sum: XOR(s1, cin), cout: OR(AND(a, b), AND(s1, cin)) };
}
const A = bits(5).split('').map(Number).reverse();         // ডান দিকের bit আগে
const B = bits(3).split('').map(Number).reverse();
let carry = 0;
const out = [];
for (let i = 0; i < 4; i++) {                              // ripple carry
  const r = fullAdder(A[i], B[i], carry);
  console.log(`4) bit ${i}: ${A[i]} + ${B[i]} + carry ${carry} -> sum ${r.sum}, carry ${r.cout}`);
  out.unshift(r.sum);
  carry = r.cout;
}
console.log('5) Result     : ' + out.join('') + ' = ' + parseInt(out.join(''), 2));

Run চাপলে আউটপুট আসে ঠিক ৮ লাইনে: প্রথম দুই লাইনে high-level আর assembly; তৃতীয় লাইনে তিনটি ৮-bit নির্দেশ 01010101 01100011 10000110 — যেমন প্রথমটি = opcode 01 (MOV) + রেজিস্টার 01 (R1) + সংখ্যা 0101 (5). তারপর চার লাইনে bit ধরে যোগ: bit 0: 1 + 1 + carry 0 -> sum 0, carry 1, bit 1: 0 + 1 + carry 1 -> sum 0, carry 1, bit 2: 1 + 0 + carry 1 -> sum 0, carry 1, bit 3: 0 + 0 + carry 1 -> sum 1, carry 0. শেষ লাইন 5) Result : 1000 = 8. লক্ষ করুন, fullAdder-এর ভেতরে কোনো + নেই — শুধু XOR, AND, OR (^, &, |). যোগ “জানে” না এমন গেট দিয়েই যোগ হলো।

সীমানা ঝাপসা যেখানে — firmware আর microcode

হার্ডওয়্যার আর সফটওয়্যারের সীমানা যতটা পরিষ্কার মনে হয়, ততটা নয়। দুটি উদাহরণ:

  • Firmware — যন্ত্রের ভেতরে স্থায়ীভাবে বসানো সফটওয়্যার: মাদারবোর্ডের UEFI, প্রিন্টার বা রাউটারের ভেতরের প্রোগ্রাম, SSD-র নিয়ন্ত্রক। এটি সফটওয়্যার (আপডেট করা যায়), কিন্তু ব্যবহারকারীর চোখে হার্ডওয়্যারের অংশ। কম্পিউটার চালু হওয়ার সময় firmware কী করে, তা পর্ব ২৭-এ।
  • Microcode — CPU-র ভেতরের একটি গোপন তলা। x86-এর কিছু জটিল নির্দেশ CPU সরাসরি গেটে চালায় না; ভেতরে সেগুলোকে আরও ছোট ছোট ধাপে ভেঙে নেয়, আর সেই ভাঙার নিয়মের একটি অংশ লেখা থাকে microcode-এ। এর সুবিধা: চিপ বাজারে যাওয়ার পরও কোনো ত্রুটি ধরা পড়লে অনেক সময় microcode আপডেট দিয়ে ঠিক করা যায় — Windows বা BIOS আপডেটের সাথে চুপচাপ এমন আপডেট আসে। অর্থাৎ ISA-র নিচেও আরেকটি “সফটওয়্যার” আছে!

৫ · সফটওয়্যারের তলাগুলো — OS, ভাষা, লাইব্রেরি আর virtual machine

ISA-র ওপরে শুরু সফটওয়্যারের জগৎ, আর সেখানেও তলার পর তলা।

অপারেটিং সিস্টেম সবচেয়ে বড় বিমূর্ততার কারখানা। স্টোরেজে (HDD বা SSD) আসলে আছে লাখ লাখ “block” (চুম্বকীয় বা flash ঘর); OS আপনাকে দেখায় “ফাইল” আর “ফোল্ডার”। CPU আসলে একটি সময়ে একটি (বা প্রতিটি core-এ একটি) কাজ করে; OS দেখায় যেন একসাথে বিশটি অ্যাপ চলছে। RAM সীমিত; OS প্রতিটি প্রোগ্রামকে দেখায় যেন তার নিজের বিশাল মেমরি আছে (virtual memory, পর্ব ২৫)। ভেতরের গল্প পর্ব ২৬-এ।

প্রোগ্রামিং ভাষা আরেক তলা ওপরে। C-তে রেজিস্টারের কথা ভাবতে হয় না; Python-এ মেমরি ফেরত দেওয়ার কথাও না। compiler পুরো প্রোগ্রাম আগেই machine code-এ অনুবাদ করে; interpreter চালানোর সময় লাইন ধরে ধরে পড়ে চালায় (পর্ব ৩৮)।

লাইব্রেরি আর framework তার ওপরে। একটি বাজার-সদাইয়ের অ্যাপ ছবি, মানচিত্র, পেমেন্ট, নোটিফিকেশন — প্রায় কিছুই শূন্য থেকে লেখে না। রেডিমেড library আর framework ব্যবহার করে, আর অন্য সেবার সাথে কথা বলে সেই সেবার API দিয়ে — API হলো সফটওয়্যারের জগতের ইন্টারফেস: “এই নামে, এই তথ্য দিয়ে ডাকলে, এই উত্তর পাবেন।”

Virtual machine — কম্পিউটারের ভেতরে কম্পিউটার

Virtual machine (VM) একটি সফটওয়্যার-তলা, যা নিজের ওপরের OS-কে দেখায় যেন সে একটি পুরো আলাদা কম্পিউটারে চলছে। আপনার Windows ল্যাপটপে VirtualBox দিয়ে Linux চালানো, বা ক্লাউডে (পর্ব ৩৫) একটি বড় সার্ভারকে বহু গ্রাহকের মাঝে ভাগ করা — দুটোই VM. ওপরের OS জানেই না তার নিচে আরেকটি তলা আছে।

Emulator — অন্য ISA-র ভান করা

Emulator এক ISA-র machine code অন্য ISA-র CPU-তে চালায়, প্রতিটি নির্দেশ সফটওয়্যারে অনুকরণ করে। কম্পিউটারে পুরোনো গেম-কনসোলের গেম চালানো, বা Android Studio-তে ফোন ছাড়াই অ্যাপ পরীক্ষা — এগুলো emulator. ২০২০ সালে Apple যখন Mac-কে x86 থেকে ARM-এ নেয়, তখন Rosetta 2 নামের অনুবাদ-তলা পুরোনো x86 অ্যাপকে ARM নির্দেশে বদলে চালাত — ব্যবহারকারী প্রায় টেরই পেতেন না।

শিক্ষা: ইন্টারফেস ঠিক থাকলে ওপরের তলা বুঝতেই পারে না নিচে আসল যন্ত্র, না সফটওয়্যারের নকল।

৬ · স্তর কেন এত কাজের — আর কোথায় ফাঁস হয়

তিনটি বড় সুবিধা

  1. বিশেষজ্ঞতা (specialization): চিপের পদার্থবিদ, CPU-নকশাকারী, OS প্রোগ্রামার, অ্যাপ ডেভেলপার, UI ডিজাইনার — প্রত্যেকে নিজের তলায় গভীর দক্ষ হতে পারেন। কাউকে সব জানতে হয় না।
  2. বহনযোগ্যতা (portability): একই WhatsApp কোড থেকে Android ফোন, iPhone আর Windows-এর অ্যাপ তৈরি হয়, যদিও নিচের চিপ আর OS আলাদা। ওপরের তলা লেখা হয় নিচের ইন্টারফেস ধরে, নির্দিষ্ট যন্ত্র ধরে নয়।
  3. একটি তলা বদলানো, বাকিগুলো অক্ষত: HDD থেকে SSD-তে গেলে আপনার Word ফাইল একই থাকে — OS-এর ফাইল-তলা নিচের পরিবর্তন সামলে নেয়। নতুন প্রজন্মের CPU এলে পুরোনো প্রোগ্রাম চলে — ISA একই আছে বলে। একে বলে modularity.

কিন্তু স্তর “ফাঁস” হয়

২০০২ সালে সফটওয়্যার-লেখক Joel Spolsky একটি বিখ্যাত পর্যবেক্ষণ লেখেন: যেকোনো অ-তুচ্ছ বিমূর্ততা কোনো না কোনো মাত্রায় ফাঁস হয় — তিনি এর নাম দেন “Law of Leaky Abstractions”. অর্থাৎ নিচের তলার কিছু বৈশিষ্ট্য মাঝে মাঝে ওপরে উঁকি দেয়, আর তখন নিচের তলা না বুঝলে সমস্যা ধরা যায় না। কয়েকটি উদাহরণ:

  • গতি: প্রোগ্রামিং ভাষায় একটি বড় টেবিল সারি ধরে পড়া আর কলাম ধরে পড়া — দুটোই “একই কাজ”। কিন্তু cache কীভাবে কাজ করে (পর্ব ২৫), তার কারণে একটি অন্যটির চেয়ে কয়েক গুণ ধীর হতে পারে। ভাষার তলা cache লুকাতে চেয়েছিল, পারেনি।
  • সংখ্যার সীমা: গণিতে 7 + 9 = 16. কিন্তু 4-bit অ্যাডারে উত্তর আসে 0000, বাড়তি একটি carry বাইরে পড়ে যায় — overflow (পর্ব ১৭)। অনেক বড় বাগ ঠিক এই ফাঁস থেকে।
  • নিরাপত্তা: সবচেয়ে নাটকীয় ফাঁস, নিচের বক্সে।

Spectre আর Meltdown (২০১৮): দ্রুত চলার জন্য আধুনিক CPU একটি কৌশল ব্যবহার করে — speculative execution: পরের কোন নির্দেশ লাগবে, আগেই অনুমান করে চালিয়ে রাখে; অনুমান ভুল হলে ফলটি ফেলে দেয়। ISA-র চুক্তি অনুযায়ী ভুল অনুমানের কোনো চিহ্ন থাকার কথা নয়। কিন্তু ২০১৮ সালের জানুয়ারিতে Google-এর Project Zero দল আর কয়েকটি বিশ্ববিদ্যালয়ের গবেষকেরা দেখান, ফেলে দেওয়া কাজটি cache-এ সামান্য “পায়ের ছাপ” রেখে যায় — সময় মেপে সেই ছাপ পড়া যায়, আর তা দিয়ে অন্য প্রোগ্রামের গোপন তথ্য আন্দাজ করা সম্ভব। এই দুর্বলতাগুলোর নাম Spectre আর Meltdown. সমস্যাটি কোনো একটি প্রোগ্রামের বাগ ছিল না — ছিল মাইক্রোআর্কিটেকচারের তলা থেকে ISA-র চুক্তি “ফুটো” হওয়া। সমাধান এসেছে সব তলা থেকে: microcode আপডেট, OS-এর পরিবর্তন, ব্রাউজার আর compiler-এর সতর্কতা, আর নতুন চিপের নকশায় বদল। আপনার করণীয় সহজ: OS, ব্রাউজার আর BIOS/firmware-এর নিরাপত্তা আপডেট নিয়মিত বসান — এই ধরনের সুরক্ষা সেভাবেই আপনার কাছে পৌঁছায়।

সমস্যা কোন তলায়? — একটি চিন্তার অভ্যাস

স্তরগুলো চেনার সবচেয়ে বড় ব্যবহারিক লাভ — কোনো সমস্যা দেখলে আপনি জিজ্ঞেস করতে পারেন, “এটি কোন তলার সমস্যা?” তাহলে ঠিক জায়গায় খোঁজা যায় (পর্ব ৪৯-এ এই পদ্ধতি বিস্তারিত)।

লক্ষণসম্ভাব্য তলাকোথায় খুঁজবেন
বাংলা লেখা ভেঙে বা ভুল যুক্তাক্ষরে দেখাচ্ছেফন্ট/shaping (অ্যাপ বা OS)Unicode ফন্ট, অ্যাপ আপডেট (পর্ব ৭)
শুধু একটি অ্যাপ বারবার বন্ধ হয়ে যায়অ্যাপ বা তার লাইব্রেরিঅ্যাপ আপডেট/পুনরায় ইনস্টল
নতুন প্রিন্টার কোনো অ্যাপ থেকেই চলে নাdriver (OS)সঠিক driver ইনস্টল
সব অ্যাপ এলোমেলোভাবে বন্ধ হয়, নীল পর্দা আসেOS, driver বা হার্ডওয়্যার (RAM)মেমরি পরীক্ষা, driver আপডেট
ভারী কাজে কম্পিউটার গরম হয়ে ধীর হয়পদার্থবিজ্ঞান! (তাপ)ফ্যান পরিষ্কার, বাতাস চলাচল (পর্ব ৮)

৭ · চিপ যেভাবে তৈরি হয় — বালি থেকে শতকোটি ট্রানজিস্টর

এতক্ষণ যে ট্রানজিস্টরের কথা বললাম, সেগুলো এত ছোট যে একটি চুলের প্রস্থে কয়েক হাজার পাশাপাশি আঁটে। এত ছোট জিনিস হাতে বসানো অসম্ভব — চিপ তৈরি হয় অনেকটা ছবি ছাপার মতো করে, আলো দিয়ে নকশা “প্রিন্ট” করে। কারখানাগুলোকে বলে fab বা foundry. আজ সবচেয়ে উন্নত চিপ বানাতে পারে হাতে গোনা কয়েকটি কোম্পানি — তাইওয়ানের TSMC, দক্ষিণ কোরিয়ার Samsung আর যুক্তরাষ্ট্রের Intel প্রধান। Apple, Qualcomm, NVIDIA-র মতো অনেক কোম্পানি নকশা করে, বানায় TSMC-র মতো foundry-তে।

  1. বিশুদ্ধ সিলিকনwafer৩০০ মিমি থালা
  2. আলোয় ছাপাlithographyনকশার ছায়া
  3. খোদাই ও মেশানোetch, dopeট্রানজিস্টর গড়া
  4. তারের তলাmetal layersশত শত বার
  5. পরীক্ষা ও প্যাকেটtest, packageতৈরি চিপ
থালার ওপর কী ঘটছে
অবস্থা
বিমূর্ততার কোন তলার সাথে মিল
  1. বালি থেকে wafer. সাধারণ বালির মূল উপাদান সিলিকন ডাই-অক্সাইড। তা থেকে প্রায় নিখুঁত বিশুদ্ধ সিলিকন বানিয়ে গলিয়ে একটি বড় একক-স্ফটিক দণ্ড (ingot) তৈরি হয়, তারপর পাতলা থালার মতো কাটা হয়। আধুনিক কারখানায় থালার ব্যাস ৩০০ মিলিমিটার। ধুলার একটি কণাও চিপ নষ্ট করতে পারে, তাই কারখানার বাতাস অত্যন্ত পরিষ্কার রাখা হয়।
  2. আলোয় ছাপা — photolithography. থালায় আলো-সংবেদী একটি প্রলেপ (photoresist) মাখানো হয়। তারপর চিপের নকশা আঁকা একটি “mask”-এর মধ্য দিয়ে আলো ফেলা হয়, লেন্স দিয়ে বহু গুণ ছোট করে। সবচেয়ে সূক্ষ্ম স্তরের জন্য আজ ব্যবহার হয় EUV (extreme ultraviolet) আলো, যার তরঙ্গদৈর্ঘ্য মাত্র ১৩.৫ ন্যানোমিটার; এই যন্ত্র বানায় মূলত নেদারল্যান্ডসের ASML কোম্পানি।
  3. খোদাই আর মেশানো। আলো-পড়া (বা না-পড়া) অংশ রাসায়নিক বা প্লাজমা দিয়ে খোদাই (etch) করা হয়; কিছু জায়গায় অন্য পরমাণু ঢুকিয়ে (doping) সিলিকনের বৈশিষ্ট্য বদলানো হয়। এভাবে source, drain, gate তৈরি হয় — প্রথম তলায় শতকোটি ট্রানজিস্টর একসাথে।
  4. তারের তলা। ট্রানজিস্টরগুলোকে গেট আর সার্কিটে জুড়তে ওপরে এক ডজনেরও বেশি তলা ধরে তামার অতি সূক্ষ্ম তার বসানো হয়, প্রতি তলায় আবার ছাপা-খোদাই। সব মিলিয়ে একটি উন্নত চিপে কয়েকশো থেকে হাজারের বেশি ধাপ, সময় কয়েক মাস।
  5. পরীক্ষা, কাটা আর প্যাকেট। থালার প্রতিটি চিপ বৈদ্যুতিকভাবে পরীক্ষা হয়। তারপর থালা কেটে আলাদা চিপ (die) বের করে প্লাস্টিক-ধাতুর খোলসে ভরে পিন বা বল লাগানো হয়।

“3 ন্যানোমিটার” মানে কী — নামের বিভ্রান্তি

খবরে শোনেন “৩ ন্যানোমিটারের চিপ”। একে বলে process node — চিপ তৈরির একটি প্রজন্মের নাম। কয়েক দশক আগে এই সংখ্যা সত্যিই ট্রানজিস্টরের একটি মাপের (gate-এর দৈর্ঘ্য) কাছাকাছি ছিল। কিন্তু প্রায় ২০১০-এর দশক থেকে এটি মূলত একটি বাজারজাত নাম (marketing name): “3 nm” চিপের কোনো গুরুত্বপূর্ণ অংশই আক্ষরিক অর্থে ৩ ন্যানোমিটার নয়; ট্রানজিস্টরগুলোর মাঝের দূরত্ব এখনো কয়েক দশক ন্যানোমিটার। এক কোম্পানির “৩” অন্য কোম্পানির “৩”-এর সমান ঘন নাও হতে পারে। তবে প্রবণতা সত্য: প্রতিটি নতুন node-এ একই জায়গায় আরও বেশি ট্রানজিস্টর আঁটে। TSMC আর Samsung ২০২২ সাল থেকে “3 nm” শ্রেণির চিপ ব্যাপকভাবে বানাতে শুরু করে।

কত ট্রানজিস্টর?

চিপসালট্রানজিস্টর (প্রায়)
Intel 4004 — প্রথম বাণিজ্যিক মাইক্রোপ্রসেসর১৯৭১২,৩০০টি
Intel 8086 — x86-এর শুরু১৯৭৮প্রায় ২৯,০০০টি
Apple M1 (Mac-এর ARM SoC)২০২০প্রায় ১,৬০০ কোটি (16 billion)
আজকের দামি স্মার্টফোনের SoC২০২০-এর দশকসাধারণত ১,০০০ থেকে ২,০০০ কোটির ঘরে

পঞ্চাশ বছরে প্রায় এক কোটি গুণ বৃদ্ধি — Moore’s law (পর্ব ২)-এর ফল। আর এই বিপুল সংখ্যা সামলানো সম্ভব হয়েছে একটিমাত্র কারণে: কোনো প্রকৌশলী একা ট্রানজিস্টর আঁকেন না। তাঁরা লেখেন উচ্চস্তরের হার্ডওয়্যার-বর্ণনা ভাষায় (Verilog, VHDL), আর সফটওয়্যার-টুল সেটিকে গেট আর তারপর ট্রানজিস্টরের নকশায় নামিয়ে আনে — হার্ডওয়্যার বানাতেও সেই একই বিমূর্ততার মই।

পরীক্ষা ও ইন্টারভিউতে — এ ধরনের প্রশ্ন প্রায়ই আসে:

  • Machine language, assembly language আর high-level language-এর পার্থক্য? machine language = CPU-র সরাসরি বোঝা 0/1; assembly = তার নাম-দেওয়া রূপ (ADD, MOV), assembler দিয়ে অনুবাদ; high-level (C, Python) = মানুষের ভাষার কাছাকাছি, compiler/interpreter দিয়ে অনুবাদ, যন্ত্র-নিরপেক্ষ।
  • ISA কী? উদাহরণ দিন। CPU যে নির্দেশগুলো বোঝে তার তালিকা ও লেখার নিয়ম — হার্ডওয়্যার-সফটওয়্যারের চুক্তি; উদাহরণ x86-64, ARM, RISC-V.
  • Abstraction বলতে কী বোঝেন? জটিল ভেতরের কাজ লুকিয়ে শুধু প্রয়োজনীয় ইন্টারফেস দেখানো — যেমন গাড়ির স্টিয়ারিং, বা OS-এর “ফাইল”।
  • RISC আর CISC-এর মূল পার্থক্য? RISC = অল্প, সরল, সমান দৈর্ঘ্যের নির্দেশ (ARM, RISC-V); CISC = অনেক রকম, জটিল, অসমান দৈর্ঘ্যের নির্দেশ, যেমন x86.

আরও গভীরে: একটি নির্দেশ কীভাবে bit-এ সাজানো হয় (instruction format), CPU-র datapath কীভাবে আঁকা হয়, আর x86, ARM ও RISC-V-এর বাস্তব তুলনা — এগুলো আছে আমাদের Computer Architecture & Digital Logic কোর্সে। শুরু করতে পারেন সেখানকার ISA আর RISC বনাম CISC পর্ব দিয়ে, তারপর x86 বনাম ARM বনাম RISC-V.

৮ · AI-এর যুগে — সবচেয়ে নতুন স্তর: সাধারণ ভাষা থেকে কোড

মইয়ের ইতিহাস দেখুন: প্রথমে প্রোগ্রামাররা সরাসরি 0/1 লিখতেন; তারপর এল assembly; তারপর C-র মতো ভাষা, যাতে আর রেজিস্টারের কথা ভাবতে হয় না; তারপর Python আর বিশাল লাইব্রেরি। আজ AI কোডিং টুল নতুন একটি তলা যোগ করেছে: আপনি বাংলা বা ইংরেজিতে বলেন “একটি ফর্ম বানাও, যেটি মোবাইল নম্বর যাচাই করবে”, আর AI কোড লিখে দেয়। এটি সত্যিই শক্তিশালী — কিন্তু এটিও একটি বিমূর্ততা, আর সব বিমূর্ততার মতো এটিও ফাঁস হয়।

AI-তলা যেভাবে ফাঁস হয়যে নিচের তলা বুঝলে ধরবেন
সাধারণ ভাষা দ্ব্যর্থক — “বড় সংখ্যা” কত বড়? AI নিজের মতো অনুমান করে নেয়সংখ্যার সীমা আর overflow (পর্ব ১৭)
কোড দেখতে ঠিক, কিন্তু বাংলা লেখায় ভেঙে যায়Unicode আর encoding (পর্ব ১৮)
ছোট ডেটায় চলে, বড় ডেটায় অসহ্য ধীরমেমরি আর cache (পর্ব ২৫)
নেই এমন লাইব্রেরি-ফাংশন বা ভুল সংস্করণের API ব্যবহারলাইব্রেরি আর API-র তলা — আসল ডকুমেন্টেশন
“চিপের বিষয়ে” আত্মবিশ্বাসী কিন্তু ভুল তথ্য — যেমন 3 nm মানে ট্রানজিস্টর ৩ ন্যানোমিটারএই পর্বের হার্ডওয়্যার-তলা

অর্থাৎ AI-এর তলা ব্যবহার করতে হলে আপনার মাথায় নিচের তলাগুলোর একটি মোটামুটি ছবি থাকতে হবে। নিচের prompt-টি AI-কে শুধু উত্তর নয়, তলা ধরে ব্যাখ্যা দিতে বাধ্য করে:

নিচের prompt-টি কপি করে নিজের প্রশ্ন বসিয়ে ব্যবহার করুন:

আমি কম্পিউটারের বিমূর্ততার স্তর (abstraction layers) শিখছি। প্রশ্ন/কোড: [এখানে লেখো, যেমন "C-তে a = b + c; লিখলে CPU-তে কী ঘটে?"] ১. উত্তরটি স্তর ধরে দাও: high-level ভাষা → assembly → machine code → microarchitecture → গেট। প্রতিটি স্তরে কী বদলায়, এক-দুই লাইনে। ২. assembly বা machine code দেখালে কোন ISA (x86-64, ARM64 না RISC-V) তা স্পষ্ট বলো, আর আসল না উদাহরণ-মাত্র তা লেবেল করো। ৩. কোন স্তরে "ফাঁস" (leak) হতে পারে — গতি, overflow, নিরাপত্তা — একটি করে উদাহরণ দাও। ৪. সাল, ট্রানজিস্টরের সংখ্যা বা কোম্পানির তথ্য দিলে কোথা থেকে যাচাই করা যায় বলো; নিশ্চিত না হলে স্পষ্ট বলো। ৫. শেষে আমাকে নিজে যাচাই করার একটি ছোট পরীক্ষা দাও (যেমন Compiler Explorer-এ কী দেখব)।

AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। কম্পিউটার বিজ্ঞানের সবচেয়ে বড় কিছু চিন্তা এই প্রশ্নগুলোর পেছনে।

প্র ০১“স্তরে স্তরে বানাও, ভেতরের খুঁটিনাটি লুকাও” — এই চিন্তা কারা প্রথম স্পষ্ট করে বলেছিলেন, আর কেন তা আজও সফটওয়্যারের মূলনীতি?

১৯৬০-এর দশকের শেষে প্রোগ্রাম বিশাল হচ্ছিল, কিন্তু বড় প্রকল্পগুলো সময়মতো শেষ হতো না, হলেও বাগে ভরা থাকত। ১৯৬৮ সালে NATO-র একটি সম্মেলনে এর নাম দেওয়া হয় “software crisis”. উত্তরের কেন্দ্রে ছিল বিমূর্ততা।

নেদারল্যান্ডসের Edsger W. Dijkstra ১৯৬৮ সালে THE নামের একটি অপারেটিং সিস্টেমের নকশা প্রকাশ করেন, যা স্পষ্টভাবে কয়েকটি তলায় সাজানো — নিচে CPU ভাগাভাগি, তার ওপরে মেমরি, তারপর ইনপুট-আউটপুট, সবার ওপরে ব্যবহারকারীর প্রোগ্রাম। প্রতিটি তলা শুধু নিচের তলার সেবা ব্যবহার করত। সুবিধা: একটি তলা পুরো যাচাই করে তার ওপর পরের তলা — এভাবে পুরো ব্যবস্থার ওপর আস্থা গড়া যায়।

১৯৭২ সালে David Parnas একটি ছোট কিন্তু অত্যন্ত প্রভাবশালী প্রবন্ধ লেখেন — “On the Criteria To Be Used in Decomposing Systems into Modules”. তাঁর কথা: প্রোগ্রামকে কাজের ধাপ ধরে নয়, সিদ্ধান্ত ধরে ভাগ করতে হবে। যে নকশা-সিদ্ধান্ত ভবিষ্যতে বদলাতে পারে (যেমন ডেটা কীভাবে রাখা হবে), তা একটি module-এর ভেতরে লুকিয়ে রাখতে হবে, বাইরে শুধু স্থির ইন্টারফেস দিতে হবে। এর নাম information hiding. ১৯৭৪ সালে Barbara Liskov আর Stephen Zilles “abstract data type”-এর ধারণা দেন; Liskov পরে ২০০৮ সালের Turing Award পান।

Java বা Python-এর class, ওয়েবের API, OS-এর system call, এমনকি ISA — সবই এই চিন্তার উত্তরাধিকার। এই পর্বের পুরো মই আসলে Dijkstra-র তলা আর Parnas-এর information hiding-এর বিস্তৃত রূপ।

মূল উপলব্ধি: বিমূর্ততা শুধু “সহজ করে দেখানো” নয় — এটি পরিবর্তনের জন্য নকশা। ভালো ইন্টারফেস ঠিক করে দেয় কোন জিনিস বদলালে কতটা ভাঙবে। যে সিস্টেম বদলাতে পারে না, তা একদিন বাতিল হয়।

প্র ০২“কম্পিউটার বিজ্ঞানের সব সমস্যা আরেকটি তলা যোগ করে সমাধান করা যায়” — আর “সব বিমূর্ততাই ফাঁস হয়”। দুটি কথাই কি সত্যি হতে পারে?

প্রথম কথাটি — “All problems in computer science can be solved by another level of indirection” — সাধারণত Cambridge বিশ্ববিদ্যালয়ের David Wheeler-এর নামে উদ্ধৃত হয়। Wheeler ছিলেন EDSAC কম্পিউটারের যুগের অগ্রদূত, subroutine-এর ধারণা বাস্তবে আনায় তাঁর বড় ভূমিকা ছিল। “Indirection” মানে কোনো কিছুকে সরাসরি না ধরে একটি মধ্যস্থতাকারীর মাধ্যমে ধরা। যেমন ওয়েবসাইটের নাম সরাসরি IP ঠিকানা নয়, DNS নামের একটি তলা নাম থেকে ঠিকানা বের করে — তাই সার্ভার বদলালেও নাম একই থাকে (পর্ব ৩৩)। প্রায়ই এর সাথে একটি মজার লেজ জোড়া হয়: “…শুধু অতিরিক্ত তলার সমস্যা ছাড়া।”

দ্বিতীয় কথাটি Joel Spolsky-র, ২০০২ সালের প্রবন্ধ “The Law of Leaky Abstractions”: “All non-trivial abstractions, to some degree, are leaky.” তাঁর প্রিয় উদাহরণ TCP: ইন্টারনেটের IP তলা প্যাকেট হারাতে পারে; TCP তার ওপর “নির্ভরযোগ্য প্রবাহ”-এর বিমূর্ততা দেয়। কিন্তু কেউ তার কেটে দিলে TCP কোনো জাদুতে বার্তা পৌঁছাতে পারে না — তখন প্রোগ্রামারকে নিচের তলা বুঝতেই হয়।

দুটি কথা আসলে পরিপূরক। নতুন তলা যোগ করলে সমস্যা সত্যিই আড়ালে চলে যায় — বেশিরভাগ সময়, বেশিরভাগ মানুষের জন্য। কিন্তু প্রতিটি তলার মূল্য আছে: বাড়তি সময়, বাড়তি জটিলতা, নতুন ধরনের ব্যর্থতা। আর কঠিন মুহূর্তে নিচের তলা ঠিকই উঁকি দেয়। AI কোডিং টুলও তাই: “বাংলায় বলো, কোড পাও” একটি নতুন indirection — দারুণ কার্যকর, কিন্তু ফাঁস হলে যিনি নিচের তলা বোঝেন, শুধু তিনিই দ্রুত ধরতে পারেন।

মূল উপলব্ধি: তলা যোগ করা কম্পিউটার বিজ্ঞানের সবচেয়ে শক্তিশালী হাতিয়ার, কিন্তু বিনা মূল্যে নয়। কাজ সহজ করতে বিমূর্ততা ব্যবহার করুন, কিন্তু শেখা বন্ধ করার অজুহাত হিসেবে নয়।

প্র ০৩১৯৮০-র দশকের একটি x86 প্রোগ্রাম আজকের নতুন Intel বা AMD চিপেও চলতে পারে। ISA-কে “চুক্তি” বানানোর এই চিন্তা কোথা থেকে এল, আর তার দাম কী?

১৯৬০-এর দশকের শুরুতে IBM-এর একটি বড় সমস্যা ছিল: তাদের বিভিন্ন কম্পিউটার মডেলের নির্দেশ-ব্যবস্থা আলাদা। কোনো গ্রাহক ছোট মডেল থেকে বড় মডেলে গেলে সব প্রোগ্রাম নতুন করে লিখতে হতো। ১৯৬৪ সালের এপ্রিলে IBM ঘোষণা দেয় System/360 পরিবার — ছোট-বড় নানা দাম আর গতির কয়েকটি মডেল, কিন্তু সবার নির্দেশ-ব্যবস্থা এক. ছোট মডেলে চলা প্রোগ্রাম বড় মডেলে বিনা পরিবর্তনে চলবে। এই প্রকল্পে জড়িত Gene Amdahl, Gerrit Blaauw আর Frederick Brooks একই বছর একটি প্রবন্ধে “architecture” শব্দটি এই অর্থে ব্যবহার করেন — প্রোগ্রামার যা দেখেন (নির্দেশ, রেজিস্টার), তা যন্ত্রের ভেতরের বাস্তবায়ন থেকে আলাদা। অর্থাৎ ISA আর microarchitecture-এর বিভাজন এখান থেকেই স্পষ্ট হয়।

x86-এর গল্প আরও নাটকীয়। Intel 8086 আসে ১৯৭৮ সালে। তারপর 80286, 80386 (32-bit), Pentium, আর ২০০৩ সালে AMD-র হাত ধরে 64-bit x86-64 — প্রতিটি ধাপে পুরোনো নির্দেশগুলো রেখে দেওয়া হয়েছে। এই backward compatibility x86-কে কয়েক দশক ধরে পিসি-বাজারের রাজা রেখেছে: গ্রাহক নতুন চিপ কিনলে পুরোনো সফটওয়্যার হারান না।

দাম কী? প্রথমত, জটিলতা: আজকের x86 চিপকে ৪০ বছরের পুরোনো, অনেক সময় অদ্ভুত নির্দেশও মানতে হয়; চালু হওয়ার মুহূর্তে চিপ এখনো পুরোনো 16-bit মোডে জাগে। দ্বিতীয়ত, ভেতরে অনুবাদের খরচ: ১৯৯০-এর দশক থেকে আধুনিক x86 চিপ ভেতরে জটিল নির্দেশকে সরল ছোট “micro-op”-এ ভেঙে চালায় — বাইরে CISC, ভেতরে অনেকটা RISC. সেই অনুবাদের সার্কিট জায়গা আর বিদ্যুৎ খায়। কিন্তু ইন্টারফেস স্থির থাকায় Intel আর AMD ভেতরের মাইক্রোআর্কিটেকচার প্রতি প্রজন্মে নতুন করে বানাতে পেরেছে — চুক্তির নিচে পুরো স্বাধীনতা।

মূল উপলব্ধি: একটি ভালো ইন্টারফেস দশকের পর দশক টিকে থাকতে পারে, ভেতরের প্রযুক্তি যতবারই বদলাক। কিন্তু একবার চুক্তি করলে তা ভাঙা কঠিন — তাই ইন্টারফেস নকশা করতে হয় সবচেয়ে বেশি যত্নে, কারণ ভুলও দশকের পর দশক টিকে থাকে।

প্র ০৪ফোনে ARM, পিসিতে x86, আর নতুন করে RISC-V — RISC বনাম CISC বিতর্ক কী ছিল, আর একটি “উন্মুক্ত ISA” কেন গুরুত্বপূর্ণ?

১৯৭০-এর দশকে অনেক কোড সরাসরি assembly-তে লেখা হতো, আর মেমরি ছিল দামি। তাই চিপ-নির্মাতারা ভাবতেন, একটি নির্দেশে যত বেশি কাজ, ততই ভালো। এভাবে তৈরি হয় জটিল নির্দেশের ঘরানা — CISC; x86 আর DEC-এর VAX পরিচিত উদাহরণ।

১৯৭০-এর দশকের শেষ থেকে ১৯৮০-র দশকের শুরুতে IBM-এ John Cocke-এর দলের 801 প্রকল্প, Berkeley-তে David Patterson-এর RISC প্রকল্প আর Stanford-এ John Hennessy-র MIPS প্রকল্প দেখায়, compiler জটিল নির্দেশগুলো খুব কমই ব্যবহার করে। তাঁদের প্রস্তাব: অল্প কয়েকটি সরল, সমান দৈর্ঘ্যের নির্দেশ, যা দ্রুত চলে আর সহজে pipeline-এ সাজানো যায় — বাকি জটিলতা compiler সামলাক। Hennessy আর Patterson পরে ২০১৭ সালের Turing Award পান।

প্রায় একই সময়ে ব্রিটেনের Acorn কোম্পানিতে Sophie Wilson আর Steve Furber একটি ছোট RISC চিপ নকশা করেন — ARM, প্রথম চিপ ১৯৮৫ সালে। সরলতার কারণে বিদ্যুৎ খরচ ছিল খুব কম, যা মোবাইল যুগে সোনার মতো মূল্যবান হয়ে ওঠে। বিতর্কটি আজ অনেকটা মিটে গেছে: আধুনিক x86 ভেতরে RISC-এর মতো micro-op চালায়, আর ARM-ও অনেক নির্দেশ যোগ করেছে।

কিন্তু মালিকানার প্রশ্ন রয়ে গেল। x86 কার্যত দুটি কোম্পানির হাতে; ARM ব্যবহারে লাইসেন্স-ফি লাগে। ২০১০ সালে Berkeley-তে Krste Asanović, Yunsup Lee, Andrew Waterman আর David Patterson-রা শুরু করেন RISC-V — উন্মুক্ত ISA, অনেকটা ওপেন সোর্স সফটওয়্যারের মতো (পর্ব ৫)। এর মান দেখভাল করে অলাভজনক সংস্থা RISC-V International. ছোট নিয়ন্ত্রক চিপ, গবেষণা আর শিক্ষায় এটি দ্রুত ছড়িয়েছে।

মূল উপলব্ধি: ISA শুধু প্রযুক্তিগত চুক্তি নয়, অর্থনৈতিক আর রাজনৈতিক বিষয়ও — কে চিপ বানাতে পারবে, কাকে অনুমতি নিতে হবে। ইন্টারফেস উন্মুক্ত হলে তার নিচে উদ্ভাবনের দরজাও সবার জন্য খুলে যায়।

প্র ০৫CPU-র গতি আগের মতো লাফিয়ে বাড়ছে না, অথচ GPU আর NPU-র মতো বিশেষ চিপের কদর বাড়ছে। Dennard scaling-এর অবসান কীভাবে পুরো মইটিকে নতুন করে ভাবাচ্ছে?

১৯৭৪ সালে IBM-এর Robert Dennard (যিনি DRAM-এরও উদ্ভাবক) ও সহকর্মীরা একটি পর্যবেক্ষণ প্রকাশ করেন, যা পরে Dennard scaling নামে পরিচিত হয়: ট্রানজিস্টর ছোট করলে তার ভোল্টেজ আর বিদ্যুৎ-প্রবাহও আনুপাতিক হারে কমানো যায়, ফলে একই জায়গার বিদ্যুৎ-খরচ মোটামুটি একই থাকে। অর্থাৎ Moore’s law দিত বেশি ট্রানজিস্টর, আর Dennard scaling দিত সেগুলোকে আরও দ্রুত চালানোর সুযোগ বাড়তি তাপ ছাড়াই। তিন দশক ধরে প্রোগ্রাম কিছু না করেই প্রতি দেড়-দুই বছরে দ্রুত হয়ে যেত।

২০০০-এর দশকের মাঝামাঝি এই সুবিধা থেমে যায়। ভোল্টেজ আর কমানো যাচ্ছিল না — কমালে বন্ধ ট্রানজিস্টর দিয়েও বিদ্যুৎ চুইয়ে যায় (leakage); ক্লক বাড়ালে চিপ অসহনীয় গরম হতো। ফলে ক্লক কয়েক GHz-এ আটকে গেল, আর বাড়তি ট্রানজিস্টর দিয়ে বানানো হলো একাধিক core (পর্ব ২৪)। সফটওয়্যারকে এবার নিজে কাজ ভাগ করতে শিখতে হলো — নিচের তলার পরিবর্তন ওপরের তলাগুলোকে বদলাতে বাধ্য করল।

উত্তর এসেছে বিশেষায়নে: নির্দিষ্ট কাজের জন্য বানানো চিপ সেই কাজ বহু গুণ কম বিদ্যুতে করে। GPU শুরুতে ছিল গেমের ছবি আঁকার জন্য, কিন্তু হাজার হাজার ছোট core-এর কারণে AI-এর বিশাল গুণ-যোগেও দারুণ; ২০১২ সালে GPU-তে প্রশিক্ষিত AlexNet আধুনিক AI-জোয়ার শুরু করে। Google ২০১৬ সালে নিজের AI-চিপ TPU-র কথা প্রকাশ করে, আর এখন ফোন ও ল্যাপটপের SoC-তে থাকে NPU. Hennessy আর Patterson তাঁদের Turing বক্তৃতায় একে বলেছেন কম্পিউটার স্থাপত্যের “নতুন স্বর্ণযুগ”। এখন একটি অ্যাপের AI-অংশ চলে NPU-তে, ছবি GPU-তে, বাকিটা CPU-তে — প্রোগ্রামার দেখেন একটি সহজ লাইব্রেরি, ভেতরে কয়েক ধরনের চিপের মাঝে কাজ ভাগাভাগি।

মূল উপলব্ধি: স্তরগুলো চিরস্থায়ী নয় — নিচের পদার্থবিজ্ঞান বদলালে ওপরের তলাগুলোকেও নতুন করে সাজাতে হয়। বিনা পরিশ্রমে দ্রুত হওয়ার যুগ শেষ; এখন যিনি পুরো মইটি বোঝেন, তিনিই ঠিক কাজের জন্য ঠিক তলা বেছে নিতে পারেন।

অনুশীলন

প্রথম তিনটি চিন্তার অনুশীলন — খাতা-কলমেই চলবে। শেষটিতে ওপরের সিমুলেশন কোড একটু বদলাতে হবে।

  1. কোন তলা? নিচের প্রতিটি কাজ বা মানুষ কোন তলায় পড়েন, বলুন: (ক) একজন প্রকৌশলী ঠিক করছেন CPU-তে কয়টি ALU থাকবে; (খ) একজন ডেভেলপার bKash-এর মতো অ্যাপের “Send Money” পর্দা বানাচ্ছেন; (গ) একজন বিজ্ঞানী নতুন ধরনের ট্রানজিস্টরে বিদ্যুৎ চুইয়ে যাওয়া কমাচ্ছেন; (ঘ) Microsoft Windows-এ নতুন প্রিন্টার চেনার ব্যবস্থা লিখছে।

    (ক) মাইক্রোআর্কিটেকচার — ISA একই রেখে ভেতরের সাজানো ঠিক করা। (খ) অ্যাপ্লিকেশন তলা (সাথে লাইব্রেরি/framework). (গ) পদার্থবিজ্ঞান আর ট্রানজিস্টরের তলা। (ঘ) অপারেটিং সিস্টেম — driver ব্যবস্থা। লক্ষ করুন, (খ)-এর ডেভেলপার আর (গ)-এর বিজ্ঞানীর কাজ শেষ পর্যন্ত একই ফোনে মিলবে, কিন্তু দুজনের কখনো দেখা হওয়ার দরকার নেই — মাঝের তলাগুলো সেই যোগাযোগ সামলায়।

  2. ইন্টারফেস খুঁজুন: মোবাইল রিচার্জের কথা ভাবুন — আপনি দোকানে বা অ্যাপে একটি নম্বর আর টাকার পরিমাণ দেন, কয়েক সেকেন্ডে ব্যালান্স চলে আসে। এখানে “ইন্টারফেস” কী, আর কী কী খুঁটিনাটি আপনার কাছ থেকে লুকানো? একটি জায়গা বলুন যেখানে এই বিমূর্ততা “ফাঁস” হতে পারে।

    ইন্টারফেস: “নম্বর + টাকা + নিশ্চিতকরণ (PIN)” — এর বেশি কিছু আপনাকে দিতে হয় না। লুকানো: অ্যাপ থেকে সার্ভারে বার্তা যাওয়া, মোবাইল অপারেটরের সিস্টেমের সাথে কথা বলা, হিসাবের খাতা হালনাগাদ, নেটওয়ার্কের পথ, সার্ভারের CPU-তে চলা লাখো নির্দেশ।

    ফাঁস: নেটওয়ার্ক দুর্বল হলে “লেনদেন প্রক্রিয়াধীন” লেখা আসে — টাকা কাটা গেল কি না, আপনি নিশ্চিত নন। এখানে নিচের নেটওয়ার্ক-তলার অনিশ্চয়তা ওপরে উঁকি দিচ্ছে।

  3. Machine code পড়ুন: ওপরের খেলনা ISA-তে (opcode ২ bit: MOV = 01, ADD = 10; রেজিস্টার ২ bit; MOV-এর শেষ ৪ bit একটি সংখ্যা) নিচের তিনটি নির্দেশ assembly-তে লিখুন আর বলুন শেষে R0-তে কত থাকবে: 01010010, 01100110, 10000110.

    01 01 0010 → MOV R1, 2. 01 10 0110 → MOV R2, 6. 10 00 01 10 → ADD R0, R1, R2. তাই R0 = 2 + 6 = 8, বাইনারিতে 1000.

    তৃতীয় নির্দেশটি সিমুলেশনের ADD-এর হুবহু একই — ADD জানে শুধু কোন রেজিস্টার, ভেতরে কী সংখ্যা তা নয়। বাইনারি পড়ার সময় আগে ঠিক করতে হয় কোন bit কোন অংশ (opcode, রেজিস্টার, সংখ্যা) — এই নিয়মটিই ISA.

  4. ফাঁস নিজে দেখুন: ওপরের সিমুলেশনে 5 আর 3-এর বদলে 7 আর 9 বসান (দুই জায়গায় bits(5), bits(3) বদলাতে হবে; প্রথম লাইনের লেখাও বদলে নিন)। Run চাপলে Result কত আসে? গণিতের উত্তর 16-এর সাথে মেলে না কেন, আর শেষ carry কোথায় গেল?

    7 = 0111, 9 = 1001. bit ধরে: 1 + 1 = 0, carry 1; 1 + 0 + 1 = 0, carry 1; 1 + 0 + 1 = 0, carry 1; 0 + 1 + 1 = 0, carry 1. Result 0000 = 0!

    আসল উত্তর 16 = 10000 — পাঁচ bit লাগে, কিন্তু অ্যাডার মাত্র চার bit-এর। শেষ carry (1) লুপ শেষে carry চলকে পড়ে থাকে, কেউ ব্যবহার করে না। এটাই overflow — “যোগ করো” বিমূর্ততার নিচ থেকে bit-এর সীমা উঁকি দিল। আসল CPU এই অবস্থায় একটি carry/overflow flag সেট করে (পর্ব ১৭), কিন্তু প্রোগ্রাম সেটি না দেখলে ভুল ফল নিয়েই চলতে থাকে। (ইচ্ছা হলে শেষে console.log('carry out:', carry) যোগ করে দেখুন — 1 আসবে।)

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমকম্পিউটারের বিমূর্ততার স্তরগুলো নিচ থেকে ওপরে সাজান (▲▼ চেপে সরান)

  1. 🔌 ট্রানজিস্টর
  2. 🚪 লজিক গেট
  3. 🧮 মাইক্রোআর্কিটেকচার (ALU, রেজিস্টার, control unit)
  4. 📜 ISA — machine code
  5. 🖥️ অপারেটিং সিস্টেম
  6. 📱 অ্যাপ্লিকেশন

কম্পিউটারে “বিমূর্ততা” (abstraction) বলতে কী বোঝায়?

  • পর্দায় বিমূর্ত ছবি আঁকার কৌশল
  • ভেতরের জটিল খুঁটিনাটি লুকিয়ে একটি সহজ ইন্টারফেস দেখানো
  • তথ্য এনক্রিপ্ট করে গোপন রাখা
  • প্রোগ্রাম ছোট করে জায়গা বাঁচানো

হার্ডওয়্যার আর সফটওয়্যারের মাঝের “চুক্তি”, যা বলে দেয় CPU কোন নির্দেশগুলো বোঝে আর সেগুলো কীভাবে bit-এ লেখা হয় — তার নাম কী?

  • API
  • মাইক্রোআর্কিটেকচার
  • ISA
  • Driver

কোন জোড়ার দুটি ভাষাই যন্ত্রনির্ভর (machine dependent), অর্থাৎ নির্দিষ্ট ISA-র জন্য লেখা?

  • Machine language ও assembly language
  • C ও Python
  • Assembly language ও Python
  • HTML ও C

নিচের কোনটি উন্মুক্ত (open standard) ISA, যা লাইসেন্স-ফি ছাড়াই যে কেউ ব্যবহার করতে পারে?

  • x86-64
  • ARM
  • IBM System/360
  • RISC-V

চিপ তৈরির ক্ষেত্রে “3 nm process node” কথাটি সম্পর্কে কোনটি সঠিক?

  • চিপের প্রতিটি ট্রানজিস্টর ঠিক ৩ ন্যানোমিটার চওড়া
  • এটি মূলত উৎপাদন-প্রজন্মের বাজারজাত নাম, আক্ষরিক মাপ নয়
  • সিলিকন wafer-এর পুরুত্ব ৩ ন্যানোমিটার
  • এটি শুধু ARM চিপের জন্য একটি ISA সংস্করণ

২০১৮ সালে প্রকাশিত Spectre দুর্বলতা কোন বিমূর্ততার “ফাঁস” থেকে এসেছিল?

  • একটি জনপ্রিয় ব্রাউজারের ভুল কোড
  • দুর্বল পাসওয়ার্ড
  • CPU-র speculative execution-এর চিহ্ন cache-এ থেকে যাওয়া
  • ধীর ইন্টারনেট সংযোগ

কোন সফটওয়্যার-তলা একটি কম্পিউটারের ভেতরে আরেকটি পুরো “কম্পিউটার” তৈরি করে, যাতে সেখানে আলাদা অপারেটিং সিস্টেম চালানো যায়?

  • Virtual machine
  • Compiler
  • Microcode
  • ফন্ট ইঞ্জিন

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. বিমূর্ততা = “কী” দেখানো, “কীভাবে” লুকানো; ইন্টারফেস = দুই তলার চুক্তি। শতকোটি ট্রানজিস্টর সামলানোর একমাত্র উপায় এটাই।
  2. মই: ইলেকট্রন → ট্রানজিস্টর → গেট → সার্কিট → মাইক্রোআর্কিটেকচার → ISA → assembly → OS → ভাষা → লাইব্রেরি → অ্যাপ → ব্যবহারকারী।
  3. ISA (x86, ARM, RISC-V) হার্ডওয়্যার-সফটওয়্যারের চুক্তি; machine code = ISA-র 0/1, assembly = তার নাম-দেওয়া রূপ।
  4. সুবিধা: বিশেষজ্ঞতা, portability, এক তলা বদলালে বাকিগুলো অক্ষত। সীমা: বিমূর্ততা ফাঁস হয় — গতি, overflow, Spectre.
  5. চিপ তৈরি হয় wafer-এ আলো দিয়ে ছেপে; “3 nm” একটি প্রজন্মের নাম, মাপ নয়। AI নতুন তলা — যাচাই করতে নিচের তলা বুঝুন।

পরের পর্বে: মইয়ের মাঝের সবচেয়ে ব্যস্ত তলায় ঢুকবেন — CPU. একটি নির্দেশ মেমরি থেকে আনা, ভেঙে বোঝা আর চালানো (fetch-decode-execute), ক্লক কী, আর একাধিক core কীভাবে একসাথে কাজ করে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান