পাঠ ২৩ · ৫৭-এর মধ্যে · মডিউল ৫
Home / Courses / Computer Architecture & Digital Logic / ISA — RISC বনাম CISC

ISA কী — RISC বনাম CISC

ISA basics — RISC vs CISC
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ISA কী, এবং কেন এটি হার্ডওয়্যার ইমপ্লিমেন্টেশন থেকে আলাদা একটি "ইন্টারফেস/চুক্তি" স্তর
  • CISC ও RISC — দুই ডিজাইন-দর্শনের ঐতিহাসিক প্রেক্ষাপট ও মূল পার্থক্য
  • RISC-এর "লোড/স্টোর আর্কিটেকচার" নীতি ঠিক কী বোঝায়
  • আধুনিক CPU-তে RISC/CISC সীমারেখা কীভাবে ঝাপসা হয়ে গেছে তার সৎ, সংক্ষিপ্ত চিত্র

১ · ISA কী — সফটওয়্যার-হার্ডওয়্যারের মধ্যকার চুক্তি

এতদিন আমরা M1-M4-এ দেখেছি হার্ডওয়্যার ঠিক কীভাবে গেট, সার্কিট ও আর্দমেটিক ইউনিট দিয়ে তৈরি হয়। কিন্তু একটি প্রোগ্রামার যখন কোড লেখেন, তিনি ট্রানজিস্টর বা গেট নিয়ে ভাবেন না — তিনি ভাবেন CPU কোন কোন ইনস্ট্রাকশন বোঝে এবং সেগুলো কী করে। এই সম্পূর্ণ তালিকা — CPU যে ইনস্ট্রাকশনগুলো এক্সিকিউট করতে পারে, তাদের ফরম্যাট এবং প্রতিটির সুনির্দিষ্ট আচরণ — একে বলা হয় ইনস্ট্রাকশন সেট আর্কিটেকচার (ISA)।

সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হলো — ISA হলো একটি চুক্তি/ইন্টারফেস, বাস্তবায়ন (implementation) নয়। সফটওয়্যার (কম্পাইলার, অপারেটিং সিস্টেম) এই ISA-কে লক্ষ্য করে কোড লেখে/কম্পাইল করে, কিন্তু ভেতরের প্রকৃত হার্ডওয়্যার ডিজাইন — datapath, control unit, cache (M6-M8-এ যা আসছে) — সম্পূর্ণ ভিন্ন হতে পারে বিভিন্ন প্রস্তুতকারক বা প্রজন্মের চিপে, যতক্ষণ তারা একই ISA বাস্তবায়ন করে। উদাহরণ: বিভিন্ন কোম্পানির, বিভিন্ন প্রজন্মের অসংখ্য ফিজিক্যাল x86 চিপ — সবাই একই x86 ISA বাস্তবায়ন করে, তাই একই কম্পাইল করা প্রোগ্রাম সবগুলোতে চলে, যদিও ভেতরের ডিজাইন সম্পূর্ণ আলাদা হতে পারে। এই পাঠ ইন্টারফেস/চুক্তি দিকটা কভার করে — M6 থেকে বাস্তবায়ন দিকটা শুরু হবে।

২ · CISC — Complex Instruction Set Computer

CISC দর্শন (x86-এর মতো ISA-তে দেখা যায়): তুলনামূলক কম সংখ্যক কিন্তু শক্তিশালী/জটিল ইনস্ট্রাকশন রাখা হয়, যেখানে একটি একক ইনস্ট্রাকশনই একাধিক কাজ একসাথে করতে পারে (যেমন মেমরি থেকে একটি মান লোড করা এবং সেটাকে যোগ করা — একটিমাত্র ইনস্ট্রাকশনে)। ঐতিহাসিক প্রেক্ষাপট: যখন মেমরি ছিল ব্যয়বহুল ও ধীর, তখন প্রতিটি ইনস্ট্রাকশন ফেচ করাও ব্যয়বহুল ছিল — তাই প্রতিটি ফেচ করা ইনস্ট্রাকশনে যতটা সম্ভব বেশি কাজ গুঁজে দেওয়াই ছিল স্বাভাবিক অপ্টিমাইজেশন।

৩ · RISC — Reduced Instruction Set Computer

RISC দর্শন (ARM, RISC-V-এর মতো ISA-তে দেখা যায়): তুলনামূলক বেশি সংখ্যক কিন্তু প্রতিটি সরল ইনস্ট্রাকশন রাখা হয় — প্রতিটি ইনস্ট্রাকশন একটিই সাধারণ কাজ করে, এবং সবগুলো ইনস্ট্রাকশনের আকার/ফরম্যাট সাধারণত ইউনিফর্ম। এই নিয়মিততা (regularity) সরাসরি M7-এ আসা পাইপলাইনিংএকাধিক ইনস্ট্রাকশন একসাথে, ওভারল্যাপ করে প্রসেস করার কৌশল — ইউনিফর্ম-সাইজের সরল ইনস্ট্রাকশন এই কৌশলকে অনেক সহজ করে তোলে।-কে সহজ করে তোলে — কারণ যখন প্রতিটি ইনস্ট্রাকশন predictable আকার ও predictable সংখ্যক ধাপে চলে, তখন CPU একাধিক ইনস্ট্রাকশনকে ওভারল্যাপ করে প্রসেস করার পাইপলাইন ডিজাইন করা অনেক সহজ হয়।

RISC-এর একটি কেন্দ্রীয় নীতি হলো লোড/স্টোর আর্কিটেকচার (load/store architecture): শুধুমাত্র উৎসর্গীকৃত (dedicated) লোড ও স্টোর ইনস্ট্রাকশনই মেমরিতে হাত দেয় — বাকি সমস্ত আর্দমেটিক (add, sub, ইত্যাদি) অপারেশন শুধুমাত্র রেজিস্টারের উপর কাজ করে (M5/L26-এ আসা রেজিস্টার ফাইলের সরাসরি ব্যবহার)। এর মানে, মেমরি থেকে একটি মান নিয়ে তাতে যোগ করে আবার মেমরিতে ফেরত রাখতে হলে, RISC-এ এটি ৩টি আলাদা ইনস্ট্রাকশনে ভাঙা থাকবে (LOAD, ADD, STORE) — অথচ CISC-এ হয়তো একটি ইনস্ট্রাকশনেই সম্ভব হতো।

৪ · আধুনিক বাস্তবতা — সীমারেখা ঝাপসা

সৎভাবে বলা দরকার — গত কয়েক দশকে RISC/CISC-এর সীমারেখা অনেকটাই ঝাপসা হয়ে গেছে। আধুনিক x86 (মূলত CISC) চিপগুলো আসলে ভেতরে ভেতরে প্রতিটি জটিল CISC ইনস্ট্রাকশনকে ছোট ছোট, RISC-স্টাইল "মাইক্রো-অপারেশন"-এ ভেঙে ফেলে, তারপর সেই মাইক্রো-অপারেশনগুলো একটি RISC-এর মতো পাইপলাইনেই এক্সিকিউট করে — অর্থাৎ বাহ্যিক ইন্টারফেস (ISA) CISC থাকলেও ভেতরের বাস্তবায়ন RISC-এর মূলনীতি অনুসরণ করে। এই কোর্সের M12/L55-এ x86, ARM ও RISC-V-এর একটি বিস্তারিত কেস স্টাডি থাকবে।

CISC (x86)
কম, জটিল, ভেরিয়েবল-দৈর্ঘ্য ইনস্ট্রাকশন — মেমরি সরাসরি স্পর্শ করতে পারে এমন আর্দমেটিক ইনস্ট্রাকশন।
RISC (ARM, RISC-V)
বেশি, সরল, সাধারণত ফিক্সড-দৈর্ঘ্য ইনস্ট্রাকশন — লোড/স্টোর আর্কিটেকচার, পাইপলাইনিং-বান্ধব।

নিচের কোড সেলে এই দুই দর্শনের একটি সরাসরি তুলনা-টেবিল দেখা যাক — instruction count style, instruction complexity, সাধারণ উদাহরণ ও পাইপলাইনিং-বান্ধবতা অনুযায়ী।

Python
# RISC বনাম CISC -- মূল বৈশিষ্ট্যগুলোর একটি তুলনা-টেবিল
isa_comparison = {
    "risc": {
        "instruction_count_style": "বেশি সংখ্যক ইনস্ট্রাকশন",
        "instruction_complexity": "সরল, একটিই কাজ প্রতি ইনস্ট্রাকশনে",
        "memory_access": "শুধু dedicated LOAD/STORE ইনস্ট্রাকশন (load/store architecture)",
        "instruction_size": "সাধারণত ফিক্সড-দৈর্ঘ্য (uniform)",
        "typical_examples": "ARM, RISC-V, MIPS",
        "pipelining_friendliness": "উচ্চ -- predictable আকার/ধাপ",
    },
    "cisc": {
        "instruction_count_style": "কম সংখ্যক ইনস্ট্রাকশন",
        "instruction_complexity": "জটিল, একটি ইনস্ট্রাকশনে একাধিক কাজ",
        "memory_access": "প্রায় যেকোনো আর্দমেটিক ইনস্ট্রাকশন সরাসরি মেমরি স্পর্শ করতে পারে",
        "instruction_size": "ভেরিয়েবল-দৈর্ঘ্য",
        "typical_examples": "x86, x86-64",
        "pipelining_friendliness": "কম -- অসম আকার/জটিলতার কারণে ডিজাইন কঠিন",
    },
}

fields = ["instruction_count_style", "instruction_complexity", "memory_access",
          "instruction_size", "typical_examples", "pipelining_friendliness"]

print(f"{'বৈশিষ্ট্য':30} | {'RISC':45} | {'CISC'}")
print("-" * 120)
for field in fields:
    print(f"{field:30} | {isa_comparison['risc'][field]:45} | {isa_comparison['cisc'][field]}")

    
মূল কথা · Key takeaway

ISA হলো সফটওয়্যার-হার্ডওয়্যারের মধ্যকার চুক্তি — RISC ও CISC এই চুক্তি ডিজাইন করার দুটি ভিন্ন দর্শন, একটি "বেশি সরল ইনস্ট্রাকশন" আর অন্যটি "কম জটিল ইনস্ট্রাকশন" পছন্দ করে। RISC-এর নিয়মিততা সরাসরি M6-M7-এর দক্ষ ডেটাপাথ ও পাইপলাইন ডিজাইনকে সহজ করে তোলে — এই কারণেই পরবর্তী কয়েকটি মডিউল একটি সরল, RISC-স্টাইল ইনস্ট্রাকশন সেট ধরে নিয়ে এগোবে।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ ISA যদি "চুক্তি" হয়, তাহলে একই প্রোগ্রাম একই x86 ISA বাস্তবায়নকারী দুটি সম্পূর্ণ ভিন্ন প্রজন্মের চিপে কীভাবে চলতে পারে?

কারণ কম্পাইল করা প্রোগ্রাম ISA-কে লক্ষ্য করে লেখা — অর্থাৎ শুধু "এই ইনস্ট্রাকশনগুলো ব্যবহার করব, এবং এদের এই আচরণ আশা করি" এই চুক্তিটুকু জানা থাকলেই চলে। ভেতরের বাস্তবায়ন — কত দ্রুত, কীভাবে পাইপলাইন করা, কত ক্যাশ ব্যবহার করা — এসব সম্পূর্ণ চিপ-নির্দিষ্ট বিষয়, প্রোগ্রামের কাছে অদৃশ্য। যতক্ষণ দুটো চিপই একই ISA-এর চুক্তি (একই ইনস্ট্রাকশন, একই আচরণ) মেনে চলে, প্রোগ্রামের কাছে দুটোই কার্যকরভাবে একই রকম দেখায় — শুধু একটি হয়তো অন্যটির চেয়ে দ্রুত।

প্র ০২ RISC-এর "লোড/স্টোর আর্কিটেকচার" নীতি কি একটি সীমাবদ্ধতা মনে হচ্ছে না — মেমরি থেকে সরাসরি যোগ করতে না পারা কি অসুবিধাজনক নয়?

স্বল্পমেয়াদে মনে হতে পারে বেশি ইনস্ট্রাকশন লাগছে (LOAD তারপর ADD তারপর STORE — তিনটি ধাপ), কিন্তু এই নিয়মিততাই RISC-এর আসল শক্তি — প্রতিটি ইনস্ট্রাকশন predictable এবং সরল থাকায় হার্ডওয়্যার সহজে পাইপলাইন করতে পারে (M7), ফলে প্রতিটি ইনস্ট্রাকশন অনেক দ্রুত সম্পন্ন হয়। বাস্তবে দেখা গেছে — বেশি সংখ্যক সরল, দ্রুত ইনস্ট্রাকশন প্রায়ই কম সংখ্যক ধীর, জটিল ইনস্ট্রাকশনের চেয়ে সামগ্রিকভাবে দ্রুত সম্পন্ন হয়।

প্র ০৩ যদি আধুনিক x86 চিপ ভেতরে RISC-স্টাইল মাইক্রো-অপারেশন ব্যবহার করে, তাহলে x86-কে এখনো "CISC" বলার মানে কী?

কারণ "RISC" বনাম "CISC" মূলত ISA (বাহ্যিক ইন্টারফেস/চুক্তি)-এর শ্রেণীবিভাগ, বাস্তবায়নের নয়। x86 এখনো বাইরের দিক থেকে (কম্পাইলার/প্রোগ্রামার যা দেখেন) একটি CISC-স্টাইল ইনস্ট্রাকশন সেট প্রকাশ করে — ভেরিয়েবল-দৈর্ঘ্য, জটিল ইনস্ট্রাকশন যা মেমরি সরাসরি স্পর্শ করতে পারে। চিপের ভেতরে এই ইনস্ট্রাকশনগুলোকে কীভাবে দ্রুত এক্সিকিউট করা হয় (RISC-স্টাইল মাইক্রো-অপারেশনে ভেঙে) তা সম্পূর্ণ ভেতরের বাস্তবায়ন-বিষয় — বাইরের চুক্তি অপরিবর্তিত থাকে, তাই ISA-শ্রেণীবিভাগ হিসেবে x86 এখনো CISC।

অনুশীলন

  1. চিন্তা করুন: একটি হাই-লেভেল লাইন c = a + 1; কে যদি একটি খাঁটি RISC ISA-তে অনুবাদ করতে হয় (ধরে নিন a মেমরিতে আছে, রেজিস্টারে নয়), তাহলে কতগুলো ও কী কী ধরনের ইনস্ট্রাকশন লাগবে বলে মনে হয়?

    লোড/স্টোর আর্কিটেকচার অনুযায়ী কমপক্ষে তিনটি ইনস্ট্রাকশন লাগবে: (১) একটি LOAD ইনস্ট্রাকশন যা মেমরি থেকে a-এর মান একটি রেজিস্টারে আনবে, (২) একটি ADDI (immediate-সহ add) ইনস্ট্রাকশন যা সেই রেজিস্টারে ১ যোগ করে ফলাফল অন্য একটি রেজিস্টারে রাখবে, এবং (৩) একটি STORE ইনস্ট্রাকশন যা সেই ফলাফল রেজিস্টার থেকে মেমরিতে c-এর অবস্থানে লিখবে। একটি CISC ISA-তে হয়তো একটি একক ইনস্ট্রাকশনেই (মেমরি-থেকে-মেমরি add-with-immediate) এটি সম্ভব হতো।

  2. পরীক্ষা করুন: উপরের কোড সেলের isa_comparison ডিকশনারিতে "power_efficiency" নামে একটি নতুন ফিল্ড যোগ করার কথা ভাবুন (এখনো কোড পরিবর্তন করবেন না) — RISC ও CISC-এর জন্য এই ফিল্ডে কী মান বসবে বলে মনে হয়, এবং কেন?

    সাধারণভাবে RISC ডিজাইন তুলনামূলক বেশি পাওয়ার-দক্ষ ধরা হয় — সরল, ইউনিফর্ম-দৈর্ঘ্য ইনস্ট্রাকশনের কারণে ডিকোড লজিক সহজ ও ছোট হতে পারে (কম ট্রানজিস্টর, কম পাওয়ার খরচ), অন্যদিকে CISC-এর জটিল, ভেরিয়েবল-দৈর্ঘ্য ইনস্ট্রাকশন ডিকোড করতে বেশি জটিল সার্কিট লাগে। এই কারণেই মোবাইল/এমবেডেড ডিভাইসে RISC-স্টাইল ISA (যেমন ARM) প্রাধান্য পায়, যেখানে ব্যাটারি লাইফ গুরুত্বপূর্ণ।

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

আগের পাঠ
L22 · ফ্লোটিং পয়েন্ট রিপ্রেজেন্টেশন — IEEE 754