Friday, January 13, 2017

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

সফটওয়্যার মূলত প্রোগ্রাম। একটি প্রোগ্রামে কতগুলো ইনস্ট্রাকশন লেখা থাকে। কম্পিউটার প্রোগ্রামের ইনস্ট্রাকশন অনুযায়ী কাজ করে। এই ইনস্ট্রাকশনগুলো ইচ্ছে মতো দেওয়া যায় না। এগুলো দেওয়ার কতগুলো পদ্ধতি ও স্টাইল রয়েছে। 

এই আলোচনার বিষয়বস্তু হচ্ছে প্রোগ্রামিং স্টাইল। 

উদাহরণসরূপ বলা যেতে পারে যে, আমরা সাবাই পোশাক পড়ি। কিন্তু প্রত্যেকে আলাদা আলাদা পোশাক পড়ে থাকে, বাঙালীদের পোশাকের নিজস্ব স্টাইল রয়েছে। তবে কেউ কেউ ওয়েস্ট্রার্ন ড্রেস পড়তে স্বাচ্ছন্দবোধ করে। আবার কোনো কোনো বিশেষ অনুষ্ঠানে ড্রেস কোড থাকে। তবে আপনি সে রকম পোশাকই পরিধান করুন না কেনো, পোশাক পড়ার মূল কারণ একই।

একইভাবে প্রোগ্রামিং করার ক্ষেত্রেও এরকম অনেকগুলো স্টাইল রয়েছে। তবে যে স্টাইলেই প্রোগ্রাম লিখুন না কেনো, মূল উদ্দ্যেশ্য কম্পিউটারকে ইনস্ট্রাকশন দেওয়া, তাকে দিয়ে কাজ করিয়ে নেওয়া। 

প্রোগ্রামিংয়ের স্টাইলগুলোকে প্রোগ্রামিং প্যারাডাইমও বলা হয়। প্রোগ্রামিংয়ের বেশ কতগুলো প্যারাডাইম রয়েছে -

১. ইম্পারেটিভ (imperative) 
২. ডিক্লেয়ারেটিভ (declarative) 
৩. স্ট্রাকচারড (structured) 
৪. প্রসিডিউরাল (procedural) 
৫. ফাংশনাল (functional) 
৬. অবজেক্ট ওরিয়েন্টেড (object oriented) 
ইত্যাদি। 

দেখা যাচ্ছে প্রোগ্রামিং করার অনেকগুলো প্যারাডাইম রয়েছে, তবে যেকোনো স্টাইল দিয়েই প্রোগ্রাম লেখা যায় এবং কম্পিউটার তা অ্যাকসেপ্ট করবে। তবে কোনো কোনো প্যারাডাইম বিশেষ বিশেষ জায়গায় ভাল কাজ করে। অর্থাৎ সব স্টাইল অ্যাক্সেপ্ট হলেও ক্ষেত্রবিশেষে এদের আলদা গুরুত্ব থাকে। 

একটি প্রোগ্রামে দুটি জিনিস থাকে- ডেটা ও ফাংশন। একটি প্রোগ্রামে কতগুলো ভ্যারিয়েবল ডিক্লেয়ার করা হয়, যেখানে নানা রকম ডেটা রাখা হয়। ফাংশনগুলো সেই ডেটার উপর কাজ করে। ফাংশন যখন কাজ করে সেই ভ্যারিয়েবলগুলো মানের পরিবর্তন হয় বা ফাংশন সেগুলো পরিবর্তন করে। কোন বিশেষ মুহূর্তে ভ্যারিয়েবলগুলোতে যে মান থাকে সেগুলোকে প্রোগ্রামের অবস্থা বা স্টেট (state) বলা যায়। অন্য অর্থে ভ্যারিয়েবলগুলোই প্রোগ্রামের স্টেট বা অবস্থা। প্রোগ্রামের স্ট্যাটের অবস্থান অনুযায়ী নাম ও স্কোপ আলাদা হয়। প্রোগ্রাম সাধারণত একটা ফাইলে লেখা হয়। এই ফাইলের একদম উপরে যদি কোন ভ্যারিয়েবল ডিক্লেয়ার করা হয় এবং সেগুলোকে প্রোগ্রামের যে কোনো জায়গা থেকে অ্যাকসেস করা যায়, তাহলে সেগুলোকে গ্লোবাল (global) ভ্যারিয়েবল বা স্টেট বলা হয়। আবার যদি কোনো ফাংশনের মধ্যে ডিক্লেয়ার করা হয়, তার স্কোপ হয় লোকাল(local) এবং একে লোকাল ভ্যারিয়েবল বলা হয়। এদেরকে যে ফাংশনে ডিক্লেয়ার করা হয়েছে তার বাইরে অন্য কোথাও থেকে অ্যাকসেস করা যায় না। 

একটি প্রোগ্রামে নানা রকম এক্সপ্রেশন ও স্টেটমেন্ট থাকে। এক্সপ্রেশন হলো যেখান থেকে কোনো একটি ভ্যালু বা মান বের করা যায়। যেমন- 



এখানে উপরের লাইন থেকে একটা ভ্যালু বের করে আনা যায়। অন্যদিকে স্টেটমেন্ট হলো একটা কোডের লাইন যা কোন একটি কাজ করে। যেমন-



উপরের লাইনটি একটি এক্সপ্রেশন যা প্রোগ্রামকে ১০০ নম্বর লাইনে যেতে বলছে। এটি একটি স্টেটমেন্ট। পাইথনের ক্ষেত্রে নিচের উদাহরণটি দেওয়া যায়




এবার প্রোগ্রামিংয়ের বিভিন্ন প্যারডাইমগুলো নিয়ে হালকা আলোচনা করা যাক -


ইম্পারেটিভ - 
এই স্টাইলের প্রোগ্রামগুলো স্টেপ বাই স্টেপ লেখা হয়। প্রোগ্রামে কতগুলো গ্লোবাল স্টেট থাকে। ফাংশনগুলো এই গ্লোবাল স্টেটকে পরিবর্তন করে। প্রোগ্রামে কোথায় কী করতে হবে তা লিখে দিতে হয়। অনেকটা কতগুলো কমান্ড একের পর এক সাজিয়ে প্রোগ্রাম লেখার মতো। তবে কীভাবে প্রোগ্রামটি এক্সিকিউট হবে, প্রােগ্রাম এক্সিকিউট হলে কী আউটপুট হবে, ভ্যারিয়েবলগুলোর পরিবর্তনগুলো কীভাবে করতে হবে ইত্যাদি প্রোগ্রামারকে বিস্তারিত পুঙ্খানুপুঙ্খভাবে (in detail) বলে দিতে হয়। পুনরাবৃত্তিমূলক কাজগুলো করার জন্যে GoTo ব্যবহার করা হয়। এর এক্সিকিউশন হয় স্টেটমেন্ট বেইজড। কোন একটা ফাইলে উপর থেকে প্রোগ্রাম প্রত্যেকটি স্টেটমেন্ট এক্সিকিউট করে করে কোনো কাজ সম্পাদন করে। 



ডিক্লেয়ারেটিভ -
এই স্টাইলের প্রোগ্রামে প্রোগ্রামার কী চায় তা বলে, কিন্তু কীভাবে তা আসবে বা কিভাবে আউটপুটটি তৈরি হবে তা বলা থাকে না। অর্থাৎ প্রোগ্রামার প্রোগ্রামে কী করতে হবে তা লিখে, কীভাবে করতে হবে তা লিখে না। এটি ইম্পারেটিভ প্রোগ্রামের অনেকটা উল্টো। এতো কোনো অ্যাসাইনমেন্ট থাকে না, লুপ থাকে না। এটি শুধুমাত্র এক্সপ্রেশন বেইজড। এতে শুধু এক্সপ্রেশন লেখা যায় যা থেকে কোনো ভ্যালু deduce বা বের করা আনা যায়। ডাটাবেজের সিকুয়েল প্রোগ্রাম ডিক্লেয়ারেটিভ প্রোগ্রামিংয়ের উদাহরণ বলা যায়। 



স্ট্রাকচারড প্রোগ্রামিং -
এটিও ইম্পারেটিভ প্রোগ্রামিংয়ের একটা আলাদারূপ এবং এতে বাড়তি কিছু বিষয় থাকে। এতে লুপিং, ব্রাঞ্চি করা যায়। প্রোগ্রামের ফ্লো উপর থেকে নিচে না এসে বিভিন্ন দিকে চলে যেতে পারে- এগুলোর জন্য if, switch ইত্যাদি ব্যবহার করা হয়। পুনরাবৃত্তিমূলক কাজ করার জন্য এতে GoTo এর বদলে লুপ ব্যবহার করা হয়। এই প্রোগ্রামিংয়ে কোডগুলো বিভিন্ন স্ট্রাকচারে গুছিয়ে সুন্দর করে উপস্থাপন করা হয়। এতে নানা রকম সাব-রুটিন বা ফাংশন থাকে। কোডগুলোকে বিভিন্ন ব্লকে সাজানো যায়। এতে করে পরিস্কারভাবে কোড লেখা যায় যাতে করে পরবর্তীতে প্রোগ্রামারদের পড়রে সুবিধা হয়।



প্রসিডিউরাল - 
এটিও ইম্পারেটিভ ও স্ট্রাকচারড প্রোগ্রামিং তবে এতে প্রচুর প্রসিডিউর বা সাব-রুটিন ফাংশন কল করা হয়। এতে অনেক রকম প্রসিডিউর বা ফাংশন থাকে। একটি প্রসিডিউরকে একটা ছোট প্রোগ্রাম বলা যেতে পারে। এগুলোকে যেকোনো জায়গা থেকে কল করা যায়। প্রসিডিউরাল প্রোগ্রামে একটার পর একটা প্রসিডিউর কল করা প্রোগ্রাম করা হয়।



ফাংশনাল -
ফাংশনাল প্রোগ্রামিংকে প্রোগাম লেখা হয় কতগুলো ফাংশন সুবিন্যস্ত (compose) করে। তবে ফাংশনাল প্রোগ্রামের বড় বৈশিষ্ট হলো এটি কোনো গ্লোবাল স্টেটকে পরিবর্তন করে না। মনে করুন, একটি ফাংশনের কাজ হলো ১ ইনক্রিমেন্ট করা। এটি যদি ফাংশনাল প্রোগ্রামিংয়ে লেখা হয় তাহলে এই ফাংশন কোনো গ্লোবাল ভ্যারিয়েবলকে পরিবর্তন করবে না। বরং এটি একটি সংখ্যা আর্গুমেন্ট হিসেবে নিয়ে এক ইনক্রিমেন্ট করে রিটার্ন করবে। আরেকটি উদাহরণ দেওয়া যাক -

ধরুন, একটি ক্লাসের সবগুলো ছাত্রছাত্রীর বয়সের গড় নির্ণয় করতে হবে। এর জন্য প্রথমে এদের বয়স যোগ করতে হবে। 

বয়স নির্ণয় করার প্রক্রিয়াটি নিচের মতো হতে পারে- 

বয়স যোগ করার জন্য হুয়াইট বোর্ডে প্রথমে শূণ্য লিখুন। তারপর একজনকে জিজ্ঞাসা করুন, তার বয়স কত? সে উত্তর দিলে, আগের শূণ্য মুছে সেখানে সেই সংখ্যাটা লিখুন। পরের জনকে একই প্রশ্ন করুন, সে উত্তর দিলে বোর্ডের সংখ্যার সঙ্গে তা যোগ করে আগেরটা মুছে দিয়ে সেখানে লিখুন। এই প্রক্রিয়া এভাবে চালিয়ে যান যতক্ষণ পর্যন্ত সবগুলো ছাত্রছাত্রীর বয়স যোগ করা শেষ না হয়। 

তবে এই যোগ করার প্রক্রিয়া এমন হতে পারতো যে, আপনি প্রথম জনকে বললেন, আপনার বয়স পরের জনকে বলেন, পরের জন তার বয়সের সাথে সেই সংখ্যা যোগ করে তা পরের জনকে দিয়ে দেবে। এভাবে একদম শেষ পর্যন্ত হয়ে গেলে আপনাকে সংখ্যা দিয়ে দেবে। এতে করে আপনার বোর্ডে সংখ্যা বার বার লেখা বা মুছার দরকার হলো না। 

ফাংশনাল প্রোগ্রামিং মূলত এভাবেই চিন্তা করা হয়। এর আরও অনেকগুলো বৈশিষ্ট্য রয়েছে। সেগুলো হলো - 

১. একটি ফাংশন আরেকটি ফাংশনে আর্গুমেন্ট হিসেবে পাস করা যায়।
২. একটি ফাংশন অন্য একটি ফাংশন রিটার্ন করতে পারে। 
৩. ফাংশন পিউর (pure) হয়- অর্থাৎ একই ইনপুটের জন্যে সবসময় ফাংশন একই রেজাল্ট রিটার্ন করবে এবং এটি কখনোই গ্লোবাল স্টেটকে পরিবর্তন করবে না। 
৪. সব ফাংশন কল করার সঙ্গে সঙ্গেই এক্সিকিউট হয়ে যায় না। যখন প্রয়োজন পরে শুধুমাত্র তখনই এক্সিকিউট হয়। একে লেজি ইভ্যালিউশন (lazy evaluation) বলে। 
৫. এতে ডিক্লেয়ারেটিভভাবে কোড লেখা যায়। 

ইত্যাদি। এটি নিয়ে পরবর্তী আর্টিক্যালে আরও বিস্তারিত লেখার চেষ্টা করবো। বিশেষ করে এই প্যারাডাইমের কী কী সুবিধা আছে।



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

কোড রিইউজ করার জন্য এতে ইনহেরিট্যান্সের সুবিধা সহ, পলিফরফিজম ও এনক্যাপসুলেশন ইত্যাদি বৈশিষ্ট্য থাকে। 

উপরে উল্লেখিত এই কয়েকটি ছাড়াও আরও অনেক রকম প্রোগ্রামিং প্যারাডাইম রয়েছে যেগুলো নিয়ে এখানে আলোচনা করা হলো না।

এখানে মূলত প্রোগ্রামিংয়ের স্টাইল বা প্যারাডাইম নিয়ে আলোচনা করা হলো, প্রোগ্রামিং ল্যাংগুয়েজ নিয়ে নয়। একটি প্রোগ্রামিং ল্যাংগুয়েজ অনেকগুলো প্যারডাইম ইমপ্লিমেন্ট করতে পারে। একজন প্রোগ্রামার তার নিজের পছ্ন্দ ও প্রয়োজন অনুযায়ী স্টাইল বা প্যারাডাইম ঠিক করে নেয় কোনটা সে ব্যবহার করবে।

প্রোগ্রামিং ল্যাংগুয়েজের কত রকম হতে পারে তা নিয়ে পরবর্তী আর্টিক্যাল লেখার ইচ্ছে পোষণ করছি ।