পাঠ ০৬ · ৫৮-এর মধ্যে · মডিউল ২
Home / Courses / Concepts of Programming Languages & Compiler Design / ইম্পারেটিভ প্যারাডাইম

ইম্পারেটিভ প্রোগ্রামিং প্যারাডাইম

Imperative programming paradigm
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ইম্পারেটিভ প্যারাডাইমের সুনির্দিষ্ট সংজ্ঞা ও এর মূল বিল্ডিং ব্লক
  • ভেরিয়েবল, অ্যাসাইনমেন্ট ও কন্ট্রোল স্ট্রাকচারের ভূমিকা
  • প্রোসিডারাল প্রোগ্রামিং — একটি সাধারণ ইম্পারেটিভ স্টাইল
  • von Neumann আর্কিটেকচারের সাথে ইম্পারেটিভ প্রোগ্রামিংয়ের গভীর সম্পর্ক
  • Python দিয়ে এক্সপ্লিসিট স্টেট-মিউটেশন প্রদর্শন করা

১ · ইম্পারেটিভ প্যারাডাইম কী — "কীভাবে" করতে হবে

M1-এ আমরা কম্পাইলার পাইপলাইন দেখেছি — এখন M2 থেকে আমরা ভাষা-ডিজাইনের অন্য দিকে যাচ্ছি: একটি ভাষা কী ধরনের চিন্তাভাবনা প্রকাশ করতে দেয়, তাকে বলা হয় তার প্যারাডাইমParadigmএকটি নির্দিষ্ট প্রোগ্রামিং স্টাইল/দর্শন — প্রোগ্রাম কীভাবে সংগঠিত ও প্রকাশ করা হয় তার মৌলিক পদ্ধতি।। ইম্পারেটিভ প্যারাডাইমImperative Paradigmপ্রোগ্রাম হলো এক্সপ্লিসিট স্টেটমেন্টের একটি সিকোয়েন্স যা ধাপে ধাপে প্রোগ্রাম স্টেট (ভেরিয়েবলের মান) পরিবর্তন করে। -এ একটি প্রোগ্রাম হলো এক্সপ্লিসিট স্টেটমেন্টের একটি সিকোয়েন্স যা ধাপে ধাপে প্রোগ্রামের স্টেট (ভেরিয়েবলের মান) পরিবর্তন করে — এটি বর্ণনা করে "কীভাবে" করতে হবে (একটি এক্সপ্লিসিট, ধাপে-ধাপে ইনস্ট্রাকশন সিকোয়েন্স)। এটি সবচেয়ে পুরনো ও এখনও সবচেয়ে বহুল ব্যবহৃত প্যারাডাইম।

২ · মূল বিল্ডিং ব্লক

ভেরিয়েবল
নামযুক্ত, মিউটেবল স্টোরেজ — একটি নাম যার মান সময়ের সাথে পরিবর্তিত হতে পারে।
অ্যাসাইনমেন্ট স্টেটমেন্ট
এক্সপ্লিসিটভাবে প্রোগ্রাম স্টেট পরিবর্তন করার প্রধান মেকানিজম — একটি ভেরিয়েবলের মান নতুন করে সেট করা।
কন্ট্রোল স্ট্রাকচার
সিকোয়েন্সিং, সিলেকশন (if/else) ও ইটারেশন (loop) — কোন স্টেটমেন্ট কোন ক্রমে চলবে তা নিয়ন্ত্রণ করে (M9-এর সরাসরি পূর্বাভাস)।

৩ · প্রোসিডারাল প্রোগ্রামিং — একটি সাধারণ ইম্পারেটিভ স্টাইল

প্রোসিডারাল প্রোগ্রামিংইম্পারেটিভ কোডকে নামযুক্ত, পুনর্ব্যবহারযোগ্য সাবপ্রোগ্রাম/প্রোসিডারে সংগঠিত করার একটি নির্দিষ্ট ইম্পারেটিভ স্টাইল। হলো একটি নির্দিষ্ট, সাধারণ ইম্পারেটিভ স্টাইল — ইম্পারেটিভ কোডকে নামযুক্ত, পুনর্ব্যবহারযোগ্য সাবপ্রোগ্রাম/প্রোসিডারে সংগঠিত করা (M11-এর সরাসরি পূর্বাভাস)। C এই স্টাইলের ক্লাসিক উদাহরণ — একটি বড় প্রোগ্রামকে ছোট ছোট ফাংশনে ভাগ করা হয়, প্রতিটি ফাংশন নিজে ইম্পারেটিভ স্টাইলেই লেখা।

Computer Architecture কোর্সের সাথে সম্পর্ক

ইম্পারেটিভ প্রোগ্রামিং সরাসরি von Neumann আর্কিটেকচার-এর নিজস্ব এক্সিকিউশন মডেলকে প্রতিফলিত করে — CPU নিজেই একটি fetch-execute-modify-state চক্রে কাজ করে (একটি ইনস্ট্রাকশন আনো, চালাও, মেমরি/রেজিস্টারের স্টেট পরিবর্তন করো, পরের ইনস্ট্রাকশনে যাও)। ইম্পারেটিভ প্রোগ্রামিং একরকম সরাসরি এই হার্ডওয়্যার মডেলেরই একটি প্রতিফলন — এই কারণেই এটি সবচেয়ে "স্বাভাবিক" এবং দ্রুততম-বোঝা-যায় এমন প্যারাডাইম হিসেবে বিবেচিত হয় অনেক প্রোগ্রামারের কাছে।

৪ · কোডে ইম্পারেটিভ স্টাইলে সংখ্যা যোগ করা

নিচের কোড সেলে ১ থেকে N পর্যন্ত সংখ্যার যোগফল বের করা হয়েছে সম্পূর্ণ ইম্পারেটিভ স্টাইলে — একটি মিউটেবল অ্যাকিউমুলেটর ভেরিয়েবল, একটি এক্সপ্লিসিট লুপ, এবং প্রতিটি ধাপে এক্সপ্লিসিট স্টেট-মিউটেশন। প্রতিটি ইটারেশনের পর অ্যাকিউমুলেটরের মান প্রিন্ট করা হয়েছে, যাতে "ধাপে-ধাপে স্টেট পরিবর্তন" ধারণাটি শুধু চূড়ান্ত উত্তরে নয়, পুরো প্রক্রিয়াতেই দৃশ্যমান হয়।

Python
# ১ থেকে N পর্যন্ত যোগফল -- সম্পূর্ণ ইম্পারেটিভ স্টাইলে
def sum_imperative(n):
    total = 0  # মিউটেবল অ্যাকিউমুলেটর ভেরিয়েবল -- প্রোগ্রামের "স্টেট"
    for i in range(1, n + 1):
        total = total + i  # প্রতিটি ধাপে এক্সপ্লিসিট স্টেট-মিউটেশন
        print(f"  ধাপ {i}: total = {total}")
    return total

n = 6
print(f"n = {n} পর্যন্ত যোগফল, ইম্পারেটিভ স্টাইলে:\n")
result = sum_imperative(n)

closed_form = n * (n + 1) // 2
print(f"\nলুপের চূড়ান্ত ফলাফল: {result}")
print(f"ক্লোজড-ফর্ম সূত্র N*(N+1)/2 = {closed_form}")
print(f"মিলে যাচ্ছে: {result == closed_form}")

    
লক্ষ্য করুন total ভেরিয়েবলটি লুপের প্রতিটি ইটারেশনে পুনরায় নির্ধারিত হচ্ছে — এটি একই মেমরি অবস্থান, শুধু তার মান বদলে যাচ্ছে সময়ের সাথে। এটিই ইম্পারেটিভ প্রোগ্রামিংয়ের মূল বৈশিষ্ট্য: প্রোগ্রামের "অর্থ" নির্ভর করে সময়ের সাথে স্টেট কীভাবে বদলায় তার উপর, শুধু চূড়ান্ত মান নয় (L08-এর ফাংশনাল স্টাইলের সাথে সরাসরি বিপরীত — সেখানে কোনো মিউটেবল অ্যাকিউমুলেটরই থাকবে না)।
মূল কথা · Key takeaway

ইম্পারেটিভ প্রোগ্রামিং মানে "কীভাবে" প্রশ্নের একটি সুনির্দিষ্ট, ধাপে-ধাপে উত্তর — এক্সপ্লিসিট স্টেটমেন্ট দিয়ে এক্সপ্লিসিটভাবে স্টেট পরিবর্তন করে। এটি হার্ডওয়্যারের কাছাকাছি চিন্তাভাবনার একটি মডেল, তাই দ্রুত ও সহজবোধ্য — কিন্তু M8-এ আমরা দেখব, মিউটেবল স্টেট নিয়ন্ত্রণ করাই বৃহৎ প্রোগ্রামের সবচেয়ে বড় চ্যালেঞ্জগুলোর একটি।

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

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

প্র ০১ ইম্পারেটিভ প্রোগ্রামিংকে কেন "কীভাবে" (how) প্যারাডাইম বলা হয়, "কী" (what) নয়?

কারণ একটি ইম্পারেটিভ প্রোগ্রাম প্রতিটি ধাপ এক্সপ্লিসিটভাবে বর্ণনা করে — "প্রথমে এই ভেরিয়েবলে এই মান বসাও, তারপর লুপ চালাও, প্রতিটি ইটারেশনে এই স্টেট পরিবর্তন করো।" প্রোগ্রামার নিজেই পুরো অ্যালগরিদমের প্রতিটি পদক্ষেপ নির্দিষ্ট করে দেয়। বিপরীতে, L09-এ আসা ডিক্লেয়ারেটিভ প্যারাডাইম শুধু চূড়ান্ত ফলাফল কেমন হওয়া উচিত তা বর্ণনা করে ("কী চাই"), আর ধাপে-ধাপে কীভাবে সেটা অর্জন করতে হবে তা সিস্টেম নিজে ঠিক করে।

প্র ০২ von Neumann আর্কিটেকচারের সাথে ইম্পারেটিভ প্রোগ্রামিংয়ের সম্পর্ক ঠিক কী — কেন এই সংযোগ ইম্পারেটিভ প্যারাডাইমকে "স্বাভাবিক" মনে করায়?

von Neumann আর্কিটেকচারে CPU একটি ধারাবাহিক fetch-execute-modify-state চক্রে কাজ করে — মেমরি থেকে একটি ইনস্ট্রাকশন আনে, সেটা এক্সিকিউট করে (যা প্রায়ই রেজিস্টার/মেমরির মান পরিবর্তন করে), তারপর পরের ইনস্ট্রাকশনে যায়। ইম্পারেটিভ প্রোগ্রামিংয়ের "ভেরিয়েবল বদলাও, পরের স্টেটমেন্টে যাও" মডেল ঠিক এই হার্ডওয়্যার আচরণেরই একটি উচ্চ-স্তরের প্রতিফলন — তাই প্রোগ্রামাররা এটাকে "স্বাভাবিক" মনে করে, কারণ এটি আসলে মেশিনের নিজস্ব কার্যপ্রণালীর কাছাকাছি একটি চিন্তার মডেল।

প্র ০৩ উপরের কোড সেলে প্রতিটি ইটারেশনের পর total-এর মান প্রিন্ট করার বিশেষ গুরুত্ব কী — শুধু চূড়ান্ত result প্রিন্ট করলে কী হারিয়ে যেত?

শুধু চূড়ান্ত ফলাফল দেখালে (যেমন শুধু 21) প্রোগ্রামটি কীভাবে সেই উত্তরে পৌঁছাল তা লুকিয়ে যেত — মনে হতে পারত ফলাফলটা এক ধাপেই গণনা হয়ে গেছে, ফাংশনাল স্টাইলের মতো। প্রতিটি ধাপের পর total-এর মান আলাদা করে দেখানো ইম্পারেটিভ প্রোগ্রামিংয়ের মূল বৈশিষ্ট্যটি দৃশ্যমান করে তোলে: একই ভেরিয়েবল একই মেমরি অবস্থানে থেকেই সময়ের সাথে বারবার নতুন মান ধারণ করছে — এটিই "মিউটেবল স্টেট," যা এই পাঠের কেন্দ্রীয় ধারণা।

অনুশীলন

  1. চিন্তা করুন: "প্রোসিডারাল প্রোগ্রামিং" (যেমন C) ও "বিশুদ্ধ ইম্পারেটিভ স্ক্রিপ্টিং" (যেমন কোনো ফাংশন ছাড়া একটানা কোড) — এই দুইয়ের মধ্যে পার্থক্য কী?

    দুটোই ইম্পারেটিভ (এক্সপ্লিসিট স্টেটমেন্ট দিয়ে স্টেট পরিবর্তন) — পার্থক্য শুধু সংগঠনে। বিশুদ্ধ ইম্পারেটিভ স্ক্রিপ্টিং-এ পুরো প্রোগ্রাম একটানা, কোনো নামযুক্ত সাবপ্রোগ্রাম ছাড়াই। প্রোসিডারাল প্রোগ্রামিং সেই একই ইম্পারেটিভ কোডকে নামযুক্ত, পুনর্ব্যবহারযোগ্য প্রোসিডার/ফাংশনে ভাগ করে — একই চিন্তাভাবনার মডেল, কিন্তু আরও সংগঠিত ও পুনর্ব্যবহারযোগ্য কাঠামোতে (M11-এ বিস্তারিত)।

  2. পরীক্ষা করুন: উপরের কোড সেলে n-এর মান 10 করে Run চেপে দেখুন প্রতিটি ধাপের total মান ও চূড়ান্ত ফলাফল ক্লোজড-ফর্মের সাথে মেলে কিনা।

    n=10-এর জন্য total ধাপে ধাপে হবে: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55। চূড়ান্ত ফলাফল 55, আর ক্লোজড-ফর্ম সূত্র 10×11/2 = 55 — দুটো মিলে যায় (মিলে যাচ্ছে: True), ঠিক যেমন n=6-এর জন্য মিলেছিল।

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

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৮টি পাঠ প্যারাডাইম, গ্রামার, লেক্সিং, পার্সিং, টাইপ সিস্টেম ও কোড জেনারেশন পর্যন্ত সম্পূর্ণ যাত্রা।
  • আগের পাঠ L05 কম্পাইলার ফেজ ওভারভিউ — M1-এর সমাপ্তি, সোর্স কোড থেকে মেশিন কোডের পূর্ণাঙ্গ মানচিত্র।
  • পরের পাঠ L07 অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং প্যারাডাইম — ইম্পারেটিভ স্টেট-মিউটেশনকে কীভাবে সংগঠিত করা হয় অবজেক্টের মাধ্যমে।
  • Computer Architecture & Digital Logic কোর্স সহোদর কোর্স ইম্পারেটিভ প্রোগ্রামিং সরাসরি von Neumann আর্কিটেকচারের fetch-execute-modify-state মডেলের প্রতিফলন — সেই হার্ডওয়্যার মডেল এই কোর্সে বিস্তারিত কভার হয়েছে।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture ও Programming Languages & Compiler Design — সব এক জায়গায়।
আগের পাঠ
কম্পাইলার ফেজ ওভারভিউ