সাবরুটিন

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

মরিস উইলকস,ডেভিড হুইলার এবং স্ট্যানলি গিল প্রথম সাবরুটিনের ধারণা সৃষ্টি করেন। তারা এটার নাম দিয়েছিলেন "বদ্ধ সাবরুটিন" (closed subroutine)।

সাবরুটিন একটি শক্তিশালি হাতিয়ার। সাবরুটিনের ব্যবহার বড় প্রোগ্রামে তৈরি এবং রক্ষণাবেক্ষন সহজ করে দেয় এবং নির্ভরযোগ্যতা ও মান বৃদ্ধি করে। বেশ কিছু সাবরুটিন নিয়ে লাইব্রেরি তৈরি করা হয় যেটা সফটওয়্যার তৈরিতে খুবই গুরুত্বপূর্ণ।

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এ ক্লাসের সাথে সম্পর্কযুক্ত সাবরুটিনকে মেথড বলা হয়।

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

# নামঃ প্রতিটি সাবরুটিনের একটি নাম থাকে। কোডের অন্যান্য অংশে সাবরুটিনের নাম ব্যবহার করে ওই নির্দিষ্ট কাজটি করা যায় ফলে প্রতিবার কাজটি করার সময় সবগুলো নির্দেশনা লেখা দরকার হয়না। নাম ব্যবহার করে সাবরুটিনের কাজ করাকে সাবরুটিন ইনভোক করা বা কল করা বলা হয়।

# রিটার্ণ টাইপঃ সাবরুটিন কাজ করার পর যেখান থেকে সাবরুটিন ইনভোক করা হয়েছে সেখানে একটি মান ফেরত পাঠাতে পারে। এই মান বিভিন্ন ডাটাটাইপের হতে পারে,যেমন ইন্টিজার,ডাবল ইত্যাদি। কোনো কোনো সাবরুটিন কিছুই ফেরত পাঠায় না,এদের ভয়েড সাবরুটিন বলা হয়।

# প্যারামিটারঃ সাবরুটিনের কাজ করার জন্য কিছু ইনপুটের প্রয়োজন হতে পারে। যেমন দুটি সংখ্যার যোগফল বের করার সাবরুটিনে প্রথমে দুটি সংখ্যা গ্রহণ করে তারপর কাজটি করে। একটি সাবরুটিন কি কি ইনপুট নিয়ে কাজ করবে সেটা নির্দিষ্ট করে দিতে হয়,এদের সাবরুটিনের প্যারামিটার বলা হয়।

```c
ফাংশনঃ long integer factorial(integer n)
         রিটার্ণটাইপ=লং ইন্টিজার
         নাম=factorial
         প্যারামিটার=ইন্টিজার
```

## উদাহরণ
### সি/সি++
সি/সি++ এর পরিভাষায় সাবরুটিনকে ফাংশন বলা হয়। নিচের সি/সি++ কোডে কোনো সংখ্যার ফ্যাক্টরিয়াল নির্ণয়ের জন্য একটি সাবরুটিন/ফাংশন লেখা হয়েছে। সাবরুটিন ব্যবহার করে কোডের যেকোনো জায়গায় কোনো সংখ্যার ফ্যাক্টরিয়াল নির্ণয় করা সম্ভব,বারবার একই কোড লেখার প্রয়োজন নেই।

```c
int factorial(int n)
{
	int fact=1;
	for(int i=1;i<=n;i++)
	fact=fact*i;
	return fact;
}
int main() 
{ 
	printf("%d\n",factorial(5));
	return 0;
}
```


## লোকাল এবং গ্লোবাল ভ্যারিয়েবল
একটি সাবরুটিনের মধ্যে যেসব ভ্যারিয়েবল ডিক্লেয়ার করা হয় সেগুলো ওই সাবরুটিনের লোকাল ভ্যারিয়েবল,এদের কোডের অন্যান্য অংশে ব্যবহার করা যায়না। সাবরুটিনের কাজ শেষ হয়ে গেলে ভ্যারিয়েবলগুলোর কাজও শেষ হয়ে যায়। সাবরুটিন যখন ইনভোক করা হয় তখন এদের তৈরি করা হয়। নিচের কোডে পাই একটি লোকাল ভ্যারিয়েবলঃ

```c
double area(int r)
{	
	const double pi=3.14;
	return pi*r*r;
}
int main() 
{ 
	printf("%lf\n",area(6));
	printf("%lf\n",pi); //this line will give compile error
	return 0;	
}
```

কোডটি ইরোর প্রদর্শন করবে কারণ pi হলো এরিয়া সাবরুটিনের লোকাল ভ্যারিয়েবল একে মেইন সাবরুটিনে ব্যবহার করা যাবেনা।

গ্লোবাল ভ্যারিয়েবলকে কোডের যেকোনো অংশে ব্যবহার করা যায়। এদের প্রোগ্রাম প্রথমবার চালু করার সময় তৈরি করা হয়। নিচের সি/সি++ কোডে pi একটি গ্লোবাল ভ্যারিয়েবল।


```c
const double pi=3.14;
double area(int r)
{		
	return pi*r*r;
}
int main() 
{ 
	printf("%lf\n",area(6));
	printf("%lf\n",pi); 
	return 0;
}
```

## ওভারলোডিং
একই নামে একাধিক সাবরুটিন তৈরি করা যায়। তবে একই নামের যেকোনো দুটি মেথডের সবগুলো প্যারামিটার ও রিটার্ণটাইপ একই হতে পারবেনা। সাবরুটিন কল করার সময় প্যারামিটার আর রিটার্ণ টাইপ দেখে বুঝে নেয়া হয় কোন মেথডটিকে কল করা হয়ছে। একে ওভারলোডেড সাবরুটিন বা সাবরুটিন ওভারলোডিং বা ফাংশন ওভারলোডিং বলা হয়।
নিচের সি++ কোডে দুটি এরিয়া সাবরুটিন তৈরি করা হয়েছে কিন্তু দুটির প্যারামিটার ভিন্নঃ

```c
#include<iostream>
using namespace std;
double area(double h,double w){
		return h*w;
}
double area(double r){
		return r*r*3.14;
}
int main(){
	double rectangle_area=area(3,4);
	double circle_area=area(5);
	cout<<rectangle_area<<endl;
	cout<<circle_area<<endl;
	return 0;
}
```


## রিকার্শন
একটি সাবরুটিন নিজেই নিজেকে ইনভোক করলে সেটাকে রিকার্সিভ সাবরুটিন বলা হয়। প্রথমবার অন্য কোনো রুটিন থেকে ইনভোক করার পর এটা নিজে নিজেকে বারবার ব্যবহার করতে পারে।
ফিবোনাচ্চি সংখ্যা বের করার জন্য রিকার্সিভ সাবরুটিন এরকমঃ

```c
int fib(int n)
{
	if(n<=1) return n;
	return fib(n-1)+fib(n-2);
}
```

যখন সাবরুটিন নিজে নিজেকে ইনভোক করে তখন স্ট্যাক এ আগেরটা তথ্য রেখে দিয়ে নতুন করে সাবরুটিনের ভ্যারিয়েবল তৈরি করে কাজ করা হয়।

## আরও দেখুন
* মেথড (কম্পিউটার বিজ্ঞান)
* মডুলার প্রোগ্রামিং
* ফাংশনাল প্রোগ্রামিং

## তথ্যসূত্র


বিষয়শ্রেণী:কম্পিউটার প্রোগ্রামিং
বিষয়শ্রেণী:উৎস কোড
বিষয়শ্রেণী:উদাহরণ সি কোডসহ নিবন্ধ
বিষয়শ্রেণী:কেমব্রিজ বিশ্ববিদ্যালয় কম্পিউটার ল্যাবরেটরি
বিষয়শ্রেণী:প্রোগ্রামিং নির্মাণ

বিষয়শ্রেণী:সমগ্রতাবাদ
বিষয়শ্রেণী:প্রোগ্রামিং গঠন