Function (computer programming)
کمپیوٹر پروگرامنگ میں، فنکشن یا سبروٹین پروگرام کی ہدایات کا ایک سلسلہ ہے جو ایک مخصوص کام انجام دیتا ہے، جسے ایک یونٹ کے طور پر پیک کیا جاتا ہے۔ اس یونٹ کو پھر پروگراموں میں استعمال کیا جا سکتا ہے جہاں بھی اس مخصوص کام کو انجام دیا جانا چاہیے۔ افعال کی وضاحت پروگراموں کے اندر، یا لائبریریوں میں الگ سے کی جا سکتی ہے جو بہت سے پروگراموں کے ذریعے استعمال کیے جا سکتے ہیں۔ مختلف پروگرامنگ زبانوں میں، کسی فنکشن کو معمول، ذیلی پروگرام، ذیلی روٹین، یا طریقہ کار کہا جا سکتا ہے۔ آبجیکٹ پر مبنی پروگرامنگ (او او پی) میں، اسے طریقہ کہا جا سکتا ہے۔ تکنیکی طور پر، ان تمام اصطلاحات کی مختلف تعریفیں ہیں، اور نامیات زبان سے زبان میں مختلف ہوتی ہیں۔ عام چھتری کی اصطلاح کال ایبل یونٹ بعض اوقات استعمال کی جاتی ہے۔ فنکشن کو اکثر کوڈ کیا جاتا ہے تاکہ اسے پروگرام کے ایک عمل کے دوران کئی بار اور کئی جگہوں سے شروع کیا جا سکے، بشمول دیگر فنکشنز سے، اور پھر فنکشن کا کام مکمل ہونے کے بعد کال کے بعد اگلی ہدایت پر واپس برانچ (واپسی) کیا جا سکے۔ سبروٹین کا خیال ابتدائی طور پر جان ماچلی اور کیتھلین انٹونیلی نے ای این آئی اے سی پر اپنے کام کے دوران تصور کیا تھا، اور جنوری 1947 میں ہارورڈ سمپوزیم میں "ای ڈی وی اے سی قسم کی مشینوں کے لیے مسائل کی تیاری" پر ریکارڈ کیا گیا تھا۔ مورس ولکس، ڈیوڈ وہیلر، اور اسٹینلے گل کو عام طور پر اس تصور کی باضابطہ ایجاد کا سہرا دیا جاتا ہے، جسے انہوں نے ایک بند ذیلی معمول قرار دیا، جو ایک کھلی ذیلی معمول یا میکرو سے متصادم ہے۔ تاہم، ایلن ٹورنگ نے 1945 کے ایک مقالے میں این پی ایل اے سی ای کے لیے ڈیزائن تجاویز پر سبروٹینز پر تبادلہ خیال کیا تھا، جہاں تک کہ ریٹرن ایڈریس اسٹیک کا تصور ایجاد کرنے کی بات ہے۔ فنکشنز ایک طاقتور پروگرامنگ ٹول ہیں، اور بہت سی پروگرامنگ زبانوں کے نحو میں سبروٹینز لکھنے اور استعمال کرنے کے لیے سپورٹ شامل ہے۔ افعال کا معقول استعمال (مثال کے طور پر، منظم پروگرامنگ کے نقطہ نظر کے ذریعے) اکثر ایک بڑے پروگرام کو تیار کرنے اور برقرار رکھنے کی لاگت کو کافی حد تک کم کر دے گا، جبکہ اس کے معیار اور وشوسنییتا میں اضافہ کرے گا۔ افعال، جو اکثر کتب خانوں میں جمع کیے جاتے ہیں، سافٹ ویئر کے اشتراک اور تجارت کے لیے ایک اہم طریقہ کار ہیں۔ او او پی کا نظم و ضبط اشیاء اور طریقوں پر مبنی ہے (جو ان اشیاء یا آبجیکٹ کلاسوں سے منسلک افعال ہیں)۔ کسی فنکشن کا مواد اس کا باڈی ہوتا ہے، جو پروگرام کوڈ کا وہ حصہ ہوتا ہے جو فنکشن کو کال کرنے یا اس کی درخواست کرنے پر انجام دیا جاتا ہے۔ فنکشن اس طرح لکھا جا سکتا ہے کہ وہ کالنگ پروگرام سے (اپنے پیرامیٹرز یا رسمی پیرامیٹرز کو تبدیل کرنے کے لیے) ایک یا زیادہ ڈیٹا ویلیوز حاصل کرنے کی توقع کرے۔ کالنگ پروگرام ان پیرامیٹرز کے لیے حقیقی اقدار فراہم کرتا ہے، جنہیں آرگیومنٹ کہتے ہیں۔ مختلف پروگرامنگ زبانیں دلائل منتقل کرنے کے لیے مختلف کنونشن استعمال کر سکتی ہیں: فنکشن کال کے مضر اثرات بھی ہو سکتے ہیں جیسے کمپیوٹر میموری میں ڈیٹا ڈھانچے میں ترمیم کرنا، پردیی ڈیوائس سے پڑھنا یا لکھنا، فائل بنانا، پروگرام یا مشین کو روکنا، یا یہاں تک کہ پروگرام کے نفاذ میں ایک مخصوص وقت کے لیے تاخیر کرنا۔ ضمنی اثرات والا ذیلی پروگرام ہر بار کال کرنے پر مختلف نتائج دے سکتا ہے، چاہے اسے ایک ہی دلائل کے ساتھ کال کیا جائے۔ ایک مثال بے ترتیب نمبر فنکشن ہے، جو بہت سی زبانوں میں دستیاب ہے، جو ہر بار کال کرنے پر ایک مختلف فرضی بے ترتیب نمبر واپس کرتا ہے۔ ضمنی اثرات کے ساتھ افعال کا وسیع پیمانے پر استعمال لازمی پروگرامنگ زبانوں کی ایک خصوصیت ہے۔ کسی فنکشن کو کوڈ کیا جا سکتا ہے تاکہ وہ اپنے کام کو انجام دینے کے لیے ایک یا زیادہ جگہوں پر خود کو بار بار کال کر سکے۔ یہ طریقہ ریاضیاتی انضمام اور تکراری تقسیم اور فتح الگورتھم کے ذریعہ بیان کردہ افعال کے براہ راست نفاذ کی اجازت دیتا ہے۔ ایک فنکشن جس کا مقصد ایک بولین ویلیوڈ فنکشن (یعنی ہاں/نہیں سوال کا جواب دینا) کا حساب لگانا ہے اسے بعض اوقات پریڈیکیٹ کہا جاتا ہے۔ منطق پروگرامنگ زبانوں میں، اکثر تمام افعال کو پیشن گوئی کہا جاتا ہے، کیونکہ وہ بنیادی طور پر کامیابی یا ناکامی کا تعین کرتے ہیں۔ ایک فنکشن جو کوئی ویلیو واپس نہیں کرتا ہے یا نیل ویلیو واپس کرتا ہے اسے بعض اوقات پروسیجر کہا جاتا ہے۔ طریقہ کار عام طور پر اپنے دلائل میں ترمیم کرتے ہیں اور طریقہ کار پروگرامنگ کا ایک بنیادی حصہ ہیں۔ اصطلاحات ذیلی روٹین ایک فنکشن ہے جو کوئی قدر واپس نہیں کرتا ہے۔ افعال کا بنیادی مقصد پیچیدہ حسابات کو بامعنی حصوں میں تقسیم کرنا اور ان کا نام دینا ہے۔ فنکشن اپنے کالر (اس کی ریٹرن ویلیو) کو ایک کمپیوٹڈ ویلیو واپس کر سکتا ہے، یا مختلف نتیجہ ویلیوز یا آؤٹ پٹ پیرامیٹرز فراہم کر سکتا ہے۔ درحقیقت، افعال کا ایک عام استعمال ریاضیاتی افعال کو نافذ کرنا ہے، جس میں فنکشن کا مقصد خالصتا ایک یا زیادہ نتائج کا حساب لگانا ہے جن کی اقدار کا تعین مکمل طور پر فنکشن کو منتقل کیے گئے دلائل سے ہوتا ہے۔ (مثالوں میں کسی عدد کا لوگارتھم یا میٹرکس کا تعین کرنے والا شمار کرنا شامل ہو سکتا ہے۔) کچھ زبانوں میں قدر واپس کرنے والے طریقہ کار کا نحو بنیادی طور پر ایک ایسے طریقہ کار کے نحو جیسا ہی ہوتا ہے جو قدر واپس نہیں کرتا، سوائے اس کی عدم موجودگی کے، مثال کے طور پر، واپسی کی شق۔ کچھ زبانوں میں ایک طریقہ کار متحرک طور پر اس کے دلائل کے لحاظ سے قدر کے ساتھ یا اس کے بغیر واپس آنے کا انتخاب کر سکتا ہے۔ زبان کی حمایت اعلی سطحی پروگرامنگ زبانوں میں عام طور پر مخصوص تعمیرات شامل ہوتی ہیں: فنکشن بنانے والے پروگرام (باڈی) کے حصے کی حد بندی کریں فنکشن کو ایک شناخت کنندہ (نام) تفویض کریں اس کے پیرامیٹرز اور ریٹرن ویلیوز کے ناموں اور ڈیٹا کی اقسام کی وضاحت کریں اس کے عارضی متغیرات کے لیے ایک نجی نام کا دائرہ فراہم کریں فنکشن کے باہر موجود متغیرات کی شناخت کریں جو اس کے اندر قابل رسائی ہیں فنکشن کو ویلیوز فراہم کریں اس کے پیرامیٹرز کو ویلیوز فراہم کریں مرکزی پروگرام میں ذیلی پروگرام کا پتہ ہوتا ہے مرکزی پروگرام میں فنکشن کال کی اگلی ہدایت کا پتہ ہوتا ہے اس کے باڈی کے اندر سے ریٹرن ویلیوز کی وضاحت کریں کال ہینڈل کے ذریعے کال پیکیج فنکشنز کے دوران درپیش کسی بھی غیر معمولی شرائط کو ماڈیول، لائبریری، آبجیکٹ میں واپس کریں۔ ان زبانوں میں، فنکشن کالز عام طور پر تاثرات میں سرایت ہوتی ہیں (مثال کے طور پر، ایک sqrt فنکشن کو y = z + sqrt (x) کہا جا سکتا ہے)۔ طریقہ کار کالز یا تو نحو طور پر بیانات کے طور پر برتاؤ کرتے ہیں (مثال کے طور پر، ایک پرنٹ طریقہ کار کو x> 0 کہا جا سکتا ہے پھر پرنٹ (x) یا واضح طور پر کال یا جی او ایس یو بی (مثال کے طور پر، کال پرنٹ (x)) جیسے بیان کے ذریعے طلب کیا جاتا ہے۔ دیگر زبانیں، جیسے C اور Lisp، افعال اور ذیلی روٹین کے درمیان فرق نہیں کرتی ہیں۔ سختی سے فعال پروگرامنگ زبانوں جیسے ہاسکل میں، ذیلی پروگراموں کے کوئی مضر اثرات نہیں ہو سکتے، جس کا مطلب ہے کہ پروگرام کی مختلف اندرونی حالتیں تبدیل نہیں ہوں گی۔ اگر ایک ہی دلائل کے ساتھ بار بار کال کیا جائے تو افعال ہمیشہ ایک ہی نتیجہ واپس کریں گے۔ اس طرح کی زبانیں عام طور پر صرف ان افعال کی حمایت کرتی ہیں جو قدر واپس کرتے ہیں، کیونکہ وہ افعال جو قدر واپس نہیں کرتے ہیں ان کا کوئی فائدہ نہیں ہے جب تک کہ وہ ضمنی اثر کا سبب نہ بن سکیں۔ سی، سی + +، اور سی #جیسی پروگرامنگ زبانوں میں، وہ فنکشن جو قدر واپس کرتے ہیں اور وہ فنکشن جو کوئی قدر واپس نہیں کرتے ہیں، دونوں کو "فنکشن" کہا جاتا ہے (ریاضیاتی افعال یا فنکشنل پروگرامنگ کے ساتھ الجھن میں نہ پڑنا، جو مختلف تصورات ہیں)۔ کسی زبان کا مرتب عام طور پر طریقہ کار کالز کا ترجمہ کرتا ہے اور ایک اچھی طرح سے طے شدہ کالنگ کنونشن کے مطابق مشین کی ہدایات میں واپس آتا ہے، تاکہ افعال کو ان پروگراموں سے الگ مرتب کیا جا سکے جو انہیں کال کرتے ہیں۔ کال اور واپسی کے بیانات سے متعلق ہدایات کے سلسلے کو طریقہ کار کا تعارف اور اختتامیہ کہا جاتا ہے۔ پروگرام کو فنکشنز میں توڑنے کے فوائد میں شامل ہیں: ایک پیچیدہ پروگرامنگ ٹاسک کو آسان مراحل میں تقسیم کرنا: یہ منظم پروگرامنگ کے دو اہم ٹولز میں سے ایک ہے، جس میں ڈیٹا ڈھانچے بھی شامل ہیں۔ ایک پروگرام کے اندر ڈپلیکیٹ کوڈ کو کم کرنا۔ متعدد پروگراموں میں کوڈ کے دوبارہ استعمال کو قابل بنانا۔ مختلف پروگرامرز یا پروجیکٹ کے مختلف مراحل میں ایک بڑے پروگرامنگ ٹاسک کو تقسیم کرنا۔ فنکشن کے صارفین سے عمل درآمد کی تفصیلات کو چھپانا۔ فنکشن کال کے ساتھ کوڈ کے بلاک کو تبدیل کرکے کوڈ کی پڑھنے کی اہلیت کو بہتر بنانا جہاں ایک وضاحتی فنکشن کا نام کوڈ کے بلاک کو بیان کرنے کا کام کرتا ہے۔ یہ کالنگ کوڈ کو جامع اور پڑھنے کے قابل بناتا ہے یہاں تک کہ اگر فنکشن کا مقصد دوبارہ استعمال کرنا نہیں ہے۔ ٹریس ایبلٹی کو بہتر بنانا (یعنی۔ زیادہ تر زبانیں کال ٹریس حاصل کرنے کے طریقے پیش کرتی ہیں جن میں شامل افعال کے نام اور شاید اس سے بھی زیادہ معلومات جیسے فائل کے نام اور لائن نمبر شامل ہیں) ؛ کوڈ کو افعال میں تحلیل نہ کرنے سے، ڈیبگنگ شدید طور پر خراب ہو جائے گی نقصانات ان لائن کوڈ کے استعمال کے مقابلے میں، کسی فنکشن کو مدعو کرنا کال میکانزم میں کچھ کمپیوٹیشنل اوور ہیڈ عائد کرتا ہے۔ ایک فنکشن کے لیے عام طور پر معیاری ہاؤس کیپنگ کوڈ کی ضرورت ہوتی ہے-فنکشن کے داخلے اور باہر نکلنے دونوں پر (فنکشن پرولاگ اور اپیلوگ-عام طور پر عام مقصد کے رجسٹر اور واپسی کا پتہ کم سے کم محفوظ کرتے ہیں)۔ سبروٹین کا خیال کمپیوٹنگ مشینوں کے کچھ عرصے سے موجود ہونے کے بعد تیار کیا گیا تھا۔ ریاضی اور مشروط چھلانگ کی ہدایات وقت سے پہلے منصوبہ بندی کی گئی تھیں اور نسبتا کم تبدیل ہوئی ہیں، لیکن طریقہ کار کالز کے لیے استعمال ہونے والی خصوصی ہدایات سالوں کے دوران بہت بدل گئی ہیں۔ ابتدائی کمپیوٹرز اور مائکرو پروسیسرز، جیسے مانچسٹر بیبی اور آر سی اے 1802 میں ایک بھی سبروٹین کال کی ہدایت نہیں تھی۔ سبروٹینز کو لاگو کیا جا سکتا تھا، لیکن ان کے لیے پروگرامرز کو ہر کال سائٹ پر کال کی ترتیب-ہدایات کا ایک سلسلہ-استعمال کرنے کی ضرورت تھی۔ سبروٹینز کو 1945 میں کونراڈ زوز کے زیڈ 4 میں نافذ کیا گیا تھا۔ 1945 میں ایلن ایم ٹورنگ نے سب روٹین سے کال کرنے اور واپس آنے کے لیے "بریو" اور "انبری" اصطلاحات استعمال کیں۔ جنوری 1947 میں جان ماچلی نے ہارورڈ یونیورسٹی اور بیورو آف آرڈیننس، یونائیٹڈ سٹیٹس نیوی کی مشترکہ کفالت کے تحت 'اے سمپوزیم آف لارج اسکیل ڈیجیٹل کیلکولیٹنگ مشینری' میں عمومی نوٹ پیش کیے۔ یہاں وہ سیریل اور متوازی آپریشن پر تبادلہ خیال کرتا ہے جس سے پتہ چلتا ہے کہ کی میک نیلٹی نے ENIAC ٹیم پر جان ماچلی کے ساتھ مل کر کام کیا تھا اور ENIAC کمپیوٹر کے لیے سبروٹینز کے لیے ایک خیال تیار کیا تھا جو وہ دوسری جنگ عظیم کے دوران پروگرام کر رہی تھی۔ اس نے اور دوسرے ای این آئی اے سی پروگرامرز نے میزائل کے راستوں کا حساب لگانے میں مدد کے لیے سبروٹینز کا استعمال کیا۔ گولڈسٹائن اور وان نیومن نے 16 اگست 1948 کو ایک مقالہ لکھا جس میں سبروٹین کے استعمال پر تبادلہ خیال کیا گیا۔ کچھ بہت ابتدائی کمپیوٹرز اور مائکرو پروسیسرز، جیسے کہ آئی بی ایم 1620، انٹیل 4004 اور انٹیل 8008، اور پی آئی سی مائکرو کنکولرز، میں ایک واحد ہدایت والی سبروٹین کال ہوتی ہے جو واپسی کے پتے کو ذخیرہ کرنے کے لیے ایک مخصوص ہارڈ ویئر اسٹیک کا استعمال کرتی ہے-اس طرح کا ہارڈ ویئر صرف چند سطحوں کے سبروٹین نیسٹنگ کی حمایت کرتا ہے، لیکن ریکرسو سبروٹینز کی حمایت کر سکتا ہے۔ 1960 کی دہائی کے وسط سے پہلے کی مشینیں-جیسے کہ UNIVAC I، PDP-1، اور IBM 1130-عام طور پر ایک کالنگ کنونشن کا استعمال کرتی ہیں جس نے انسٹرکشن کاؤنٹر کو سبروٹین کے پہلے میموری لوکیشن میں محفوظ کیا۔ یہ من مانی طور پر سبروٹین گھونسلوں کی گہری سطح کی اجازت دیتا ہے لیکن ریکرسو سبروٹینز کی حمایت نہیں کرتا ہے۔ آئی بی ایم سسٹم/360 میں ایک سبروٹین کال انسٹرکشن تھی جس نے محفوظ کردہ انسٹرکشن کاؤنٹر ویلیو کو جنرل پرپز رجسٹر میں رکھا۔ اس کا استعمال من مانی طور پر ڈیپ سبروٹین نیسٹنگ اور ریکرسو سبروٹینز کو سپورٹ کرنے کے لیے کیا جا سکتا ہے۔ پی ڈی پی-11 (1970) اسٹیک-پشنگ سبروٹین کال انسٹرکشن والے پہلے کمپیوٹرز میں سے ایک ہے۔ یہ خصوصیت من مانی طور پر ڈیپ سبروٹین نیسٹنگ اور ریکرسو سبروٹین دونوں کی حمایت کرتی ہے۔ زبان کی حمایت بہت ابتدائی اسمبلرز میں، ذیلی معمول کی حمایت محدود تھی۔ سبروٹینز کو واضح طور پر ایک دوسرے سے یا مرکزی پروگرام سے الگ نہیں کیا گیا تھا، اور درحقیقت سبروٹین کے سورس کوڈ کو دوسرے ذیلی پروگراموں کے ساتھ جوڑا جا سکتا تھا۔ کچھ اسمبلرز کال اور واپسی کے سلسلے پیدا کرنے کے لیے پہلے سے طے شدہ میکرو پیش کرتے ہیں۔ 1960 کی دہائی تک، اسمبلرز کے پاس عام طور پر ان لائن اور علیحدہ سے اسمبل شدہ سبروٹینز دونوں کے لیے بہت زیادہ نفیس سپورٹ ہوتی تھی جنہیں ایک ساتھ جوڑا جا سکتا تھا۔ صارف کے لکھے ہوئے سبروٹائنز اور افعال کی حمایت کرنے والی پہلی پروگرامنگ زبانوں میں سے ایک فورٹرن II تھی۔ آئی بی ایم فورٹرن II مرتب 1958 میں جاری کیا گیا تھا۔ ALGOL 58 اور دیگر ابتدائی پروگرامنگ زبانوں نے بھی طریقہ کار پروگرامنگ کی حمایت کی۔ کتب خانے اس پیچیدہ نقطہ نظر کے باوجود، سبروٹین بہت مفید ثابت ہوئے۔ انہوں نے بہت سے مختلف پروگراموں میں ایک ہی کوڈ کے استعمال کی اجازت دی۔ ابتدائی کمپیوٹرز پر میموری ایک بہت کم وسائل تھا، اور سبروٹینز نے پروگراموں کے سائز میں نمایاں بچت کی اجازت دی۔ بہت سے ابتدائی کمپیوٹرز نے پروگرام کی ہدایات کو پنچڈ پیپر ٹیپ سے میموری میں لوڈ کیا۔ ہر سبروٹین کو پھر ٹیپ کے ایک علیحدہ ٹکڑے کے ذریعے فراہم کیا جا سکتا ہے، مرکزی پروگرام (یا "مین لائن") سے پہلے یا بعد میں لوڈ یا اسپلیس کیا جا سکتا ہے ؛ اور اسی سبروٹین ٹیپ کو پھر بہت سے مختلف پروگراموں کے ذریعے استعمال کیا جا سکتا ہے۔ اسی طرح کا نقطہ نظر کمپیوٹرز میں استعمال کیا گیا تھا جو پنچڈ کارڈز سے پروگرام کی ہدایات کو لوڈ کرتے تھے۔ نام سبروٹین لائبریری کا اصل مطلب ایک لائبریری تھا، لفظی معنوں میں، جس میں اجتماعی استعمال کے لیے ٹیپ یا کارڈز کے ڈیک کے انڈیکس شدہ مجموعے رکھے جاتے تھے۔ خود ترمیم شدہ کوڈ کی ضرورت کو دور کرنے کے لیے، کمپیوٹر ڈیزائنرز نے بالآخر ایک بالواسطہ چھلانگ کی ہدایت فراہم کی، جس کا آپریڈ، خود واپسی کا پتہ ہونے کے بجائے، ایک متغیر یا پروسیسر رجسٹر کا مقام تھا جس میں واپسی کا پتہ ہوتا ہے۔ ان کمپیوٹرز پر، فنکشن کی ریٹرن جمپ میں ترمیم کرنے کے بجائے، کالنگ پروگرام ریٹرن ایڈریس کو متغیر میں محفوظ کرے گا تاکہ جب فنکشن مکمل ہو جائے تو یہ ایک بالواسطہ جمپ انجام دے جو پہلے سے طے شدہ متغیر کے ذریعہ دیئے گئے مقام پر عمل درآمد کی ہدایت کرے۔ سبروٹین پر چھلانگ لگانا ایک اور پیش قدمی سبروٹین ہدایات پر چھلانگ لگانا تھی، جس نے کالنگ جمپ کے ساتھ ریٹرن ایڈریس کی بچت کو ملایا، اس طرح اوور ہیڈ کو نمایاں طور پر کم کیا گیا۔ آئی بی ایم سسٹم/360 میں، مثال کے طور پر، برانچ انسٹرکشنز بی اے ایل یا بی اے ایل آر، جو پروسیجر کالنگ کے لیے ڈیزائن کی گئی ہیں، کنونشن رجسٹر 14 کے ذریعے، انسٹرکشن میں مخصوص پروسیسر رجسٹر میں ریٹرن ایڈریس کو محفوظ کریں گی۔ واپس آنے کے لیے، سبروٹین کو صرف اس رجسٹر کے ذریعے بالواسطہ برانچ انسٹرکشن (بی آر) پر عمل درآمد کرنا تھا۔ اگر سبروٹین کو کسی اور مقصد کے لیے اس رجسٹر کی ضرورت ہو (جیسے کسی دوسرے سبروٹین کو کال کرنا)، تو یہ رجسٹر کے مندرجات کو نجی میموری لوکیشن یا رجسٹر اسٹیک میں محفوظ کر لے گا۔ ایچ پی 2100 جیسے نظاموں میں، جے ایس بی ہدایت اسی طرح کا کام انجام دے گی، سوائے اس کے کہ واپسی کا پتہ میموری لوکیشن میں محفوظ کیا گیا تھا جو برانچ کا ہدف تھا۔ طریقہ کار پر عمل در اصل میموری کے اگلے مقام پر شروع ہوگا۔ HP 2100 اسمبلی زبان میں، کوئی لکھ سکتا ہے، مثال کے طور پر۔ JSB MYSUB (کالز سبروٹین MYSUB۔) بی بی۔ (میسب مکمل ہونے کے بعد یہاں واپس آؤں گا۔) مرکزی پروگرام سے ایم وائی ایس یو بی نامی ذیلی روٹین پر کال کرنا۔ سبروٹین کو مائی ایس یو بی این او پی (مائی ایس یو بی کے ریٹرن ایڈریس کے لیے اسٹوریج) کے طور پر کوڈ کیا جائے گا۔ اے اے۔ (میسب کے جسم کا آغاز۔) ۔ JMP MYSUB، I (کالنگ پروگرام پر لوٹتا ہے۔) جے ایس بی ہدایت نے اگلی ہدایت (یعنی، بی بی) کا پتہ اس کے آپریڈ (یعنی، ایم وائی ایس یو بی) کے طور پر مخصوص مقام پر رکھا، اور پھر اس کے بعد اگلے مقام (یعنی، اے اے = ایم وائی ایس یو بی + 1) پر برانچ کیا۔ اس کے بعد سبروٹین بالواسطہ جمپ جے ایم پی ایم وائی ایس یو بی، I کو انجام دے کر مرکزی پروگرام میں واپس آسکتا ہے، جس کی شاخیں ایم وائی ایس یو بی کے مقام پر محفوظ مقام پر پہنچ جاتی ہیں۔ فورٹرن اور دیگر زبانوں کے لیے مرتب کرنے والے دستیاب ہونے پر آسانی سے ان ہدایات کا استعمال کر سکتے ہیں۔ اس نقطہ نظر نے کالوں کی متعدد سطحوں کی حمایت کی۔ تاہم، چونکہ سبروٹین کے ریٹرن ایڈریس، پیرامیٹرز، اور ریٹرن ویلیوز کو فکسڈ میموری لوکیشنز تفویض کیے گئے تھے، اس نے ریکرسو کالز کی اجازت نہیں دی۔ اتفاق سے، اسی طرح کا طریقہ لوٹس 1-2-3 نے 1980 کی دہائی کے اوائل میں، اسپریڈشیٹ میں دوبارہ حساب کتاب کے انحصار کو دریافت کرنے کے لیے استعمال کیا تھا۔ یعنی، واپسی کا پتہ محفوظ کرنے کے لیے ہر سیل میں ایک مقام محفوظ کیا گیا تھا۔ چونکہ قدرتی دوبارہ حساب کتاب کے لیے سرکلر حوالہ جات کی اجازت نہیں ہے، اس سے میموری میں اسٹیک کے لیے جگہ محفوظ کیے بغیر ٹری واک کی اجازت ملتی ہے، جو کہ آئی بی ایم پی سی جیسے چھوٹے کمپیوٹرز پر بہت محدود تھا۔ فنکشن کال کے زیادہ تر جدید نفاذ فنکشن کالز اور ریٹرنز کو نافذ کرنے کے لیے کال اسٹیک کا استعمال کرتے ہیں، جو اسٹیک ڈیٹا ڈھانچے کا ایک خاص معاملہ ہے۔ ہر طریقہ کار کال اسٹیک کے اوپری حصے میں ایک نئی انٹری بناتی ہے، جسے اسٹیک فریم کہا جاتا ہے۔ جب طریقہ کار واپس آتا ہے، تو اس کا اسٹیک فریم اسٹیک سے حذف ہو جاتا ہے، اور اس کی جگہ کو دیگر طریقہ کار کالوں کے لیے استعمال کیا جا سکتا ہے۔ ہر اسٹیک فریم میں متعلقہ کال کا نجی ڈیٹا ہوتا ہے، جس میں عام طور پر طریقہ کار کے پیرامیٹرز اور اندرونی متغیرات، اور واپسی کا پتہ شامل ہوتا ہے۔ کال کی ترتیب کو عام ہدایات کی ترتیب کے ذریعے نافذ کیا جا سکتا ہے (ایک نقطہ نظر جو اب بھی کم انسٹرکشن سیٹ کمپیوٹنگ (آر آئی ایس سی) اور بہت طویل انسٹرکشن ورڈ (وی ایل آئی ڈبلیو) آرکیٹیکچرز میں استعمال ہوتا ہے)، لیکن 1960 کی دہائی کے آخر سے ڈیزائن کی گئی بہت سی روایتی مشینوں میں اس مقصد کے لیے خصوصی ہدایات شامل ہیں۔ کال اسٹیک کو عام طور پر میموری کے متصل علاقے کے طور پر لاگو کیا جاتا ہے۔ یہ ایک من مانی ڈیزائن کا انتخاب ہے کہ آیا اسٹیک کا نچلا حصہ اس علاقے کے اندر سب سے کم یا سب سے اونچا پتہ ہے، تاکہ اسٹیک میموری میں آگے یا پیچھے کی طرف بڑھ سکے۔ تاہم، بہت سے آرکیٹیکچرز نے مؤخر الذکر کا انتخاب کیا۔ کچھ ڈیزائن، خاص طور پر کچھ فورتھ کے نفاذ میں، دو الگ الگ اسٹیک استعمال کیے گئے، ایک بنیادی طور پر کنٹرول کی معلومات کے لیے (جیسے ریٹرن ایڈریس اور لوپ کاؤنٹر) اور دوسرا ڈیٹا کے لیے۔ سابقہ کال اسٹیک تھا، یا اس کی طرح کام کرتا تھا اور پروگرامر کے لیے دیگر زبان کی تعمیرات کے ذریعے صرف بالواسطہ طور پر قابل رسائی تھا جبکہ مؤخر الذکر زیادہ براہ راست قابل رسائی تھا۔ جب اسٹیک پر مبنی طریقہ کار کالز پہلی بار متعارف کروائی گئیں، تو ایک اہم محرک قیمتی میموری کو بچانا تھا۔ اس اسکیم کے ساتھ، مرتب کرنے والے کو ہر طریقہ کار کے نجی ڈیٹا (پیرامیٹرز، ریٹرن ایڈریس، اور مقامی متغیرات) کے لیے میموری میں الگ جگہ محفوظ کرنے کی ضرورت نہیں ہے۔ کسی بھی وقت، اسٹیک میں صرف ان کالوں کا نجی ڈیٹا ہوتا ہے جو فی الحال فعال ہیں (یعنی، جنہیں کال کیا گیا ہے لیکن ابھی تک واپس نہیں کیا گیا ہے)۔ ان طریقوں کی وجہ سے جن میں پروگراموں کو عام طور پر کتب خانوں سے جمع کیا جاتا تھا، ایسے پروگرام تلاش کرنا (اور اب بھی ہے) غیر معمولی بات نہیں تھی جس میں ہزاروں فنکشن شامل ہوں، جن میں سے صرف مٹھی بھر ہی کسی بھی لمحے فعال ہوتے ہیں۔ اس طرح کے پروگراموں کے لیے کال اسٹیک میکانزم کافی مقدار میں میموری کو بچا سکتا ہے۔ درحقیقت، کال اسٹیک میکانزم کو خودکار میموری مینجمنٹ کے لیے ابتدائی اور آسان ترین طریقہ کے طور پر دیکھا جا سکتا ہے۔ تاہم، کال اسٹیک طریقہ کار کا ایک اور فائدہ یہ ہے کہ یہ ریکرسو فنکشن کالز کی اجازت دیتا ہے، کیونکہ ایک ہی طریقہ کار پر ہر نیسٹڈ کال کو اس کے نجی ڈیٹا کی ایک الگ مثال ملتی ہے۔ ملٹی تھریڈڈ ماحول میں، عام طور پر ایک سے زیادہ اسٹیک ہوتے ہیں۔ ایک ایسا ماحول جو مکمل طور پر کروٹینز یا سست تشخیص کی حمایت کرتا ہے، ان کے ایکٹیویشن ریکارڈ کو محفوظ کرنے کے لیے اسٹیکس کے علاوہ ڈیٹا ڈھانچے کا استعمال کر سکتا ہے۔ تاخیر سے اسٹیکنگ کال اسٹیک میکانزم کا ایک نقصان طریقہ کار کال کی بڑھتی ہوئی لاگت اور اس کی مماثل واپسی ہے۔ اضافی لاگت میں اسٹیک پوائنٹر کو بڑھانا اور کم کرنا (اور، کچھ آرکیٹیکچرز میں، اسٹیک اوور فلو کی جانچ کرنا)، اور مطلق پتے کے بجائے فریم سے متعلق پتے کے ذریعے مقامی متغیرات اور پیرامیٹرز تک رسائی شامل ہے۔ لاگت کا احساس عمل درآمد کے بڑھتے ہوئے وقت، یا پروسیسر کی پیچیدگی میں اضافہ، یا دونوں میں کیا جا سکتا ہے۔ یہ اوور ہیڈ پتی کے طریقہ کار یا پتی کے افعال میں سب سے زیادہ واضح اور قابل اعتراض ہے، جو خود کو کال کرتے ہوئے کوئی طریقہ کار بنائے بغیر واپس آتے ہیں۔ اس اوور ہیڈ کو کم کرنے کے لیے، بہت سے جدید مرتب کال اسٹیک کے استعمال میں اس وقت تک تاخیر کرنے کی کوشش کرتے ہیں جب تک کہ اس کی واقعی ضرورت نہ ہو۔ مثال کے طور پر، طریقہ کار P کی کال کچھ پروسیسر رجسٹروں میں کال شدہ طریقہ کار کے ریٹرن ایڈریس اور پیرامیٹرز کو محفوظ کر سکتی ہے، اور ایک سادہ چھلانگ کے ذریعے طریقہ کار کے باڈی میں کنٹرول منتقل کر سکتی ہے۔ اگر طریقہ کار P کوئی دوسری کال کیے بغیر واپس آتا ہے، تو کال اسٹیک بالکل استعمال نہیں ہوتا ہے۔ اگر پی کو کسی دوسرے طریقہ کار ق پر کال کرنے کی ضرورت ہے، تو یہ کال اسٹیک کا استعمال کسی بھی رجسٹر (جیسے واپسی کا پتہ) کے مندرجات کو محفوظ کرنے کے لیے کرے گا جس کی ق واپسی کے بعد ضرورت ہوگی۔ C اور C + + کی مثالیں C اور C + + پروگرامنگ زبانوں میں، ذیلی پروگراموں کو فنکشن کہا جاتا ہے (جب کلاس سے منسلک ہوتا ہے تو ممبر فنکشن کے طور پر مزید درجہ بندی کی جاتی ہے، یا جب نہیں ہوتا ہے تو فری فنکشن)۔ یہ زبانیں اس بات کی نشاندہی کرنے کے لیے خصوصی مطلوبہ الفاظ کا استعمال کرتی ہیں کہ فنکشن کوئی قدر واپس نہیں کرتا ہے۔ نوٹ کریں کہ C/C + + افعال کے مضر اثرات ہو سکتے ہیں، بشمول کسی بھی متغیر میں ترمیم کرنا جس کے پتے پیرامیٹرز کے طور پر منتقل کیے جاتے ہیں۔ مثال: وایڈ فنکشن 1 () {/* کچھ کوڈ */} فنکشن کوئی ویلیو واپس نہیں کرتا ہے اور اسے اسٹینڈ ایلون فنکشن کے طور پر پکارنا پڑتا ہے، مثال کے طور پر فنکشن 1 () ؛ انٹ فنکشن 2 () {ریٹرن 5 ؛} یہ فنکشن نتیجہ (نمبر 5) واپس کرتا ہے، اور کال ایک اظہار کا حصہ ہو سکتی ہے، مثال کے طور پر، x + فنکشن 2 () چار فنکشن 3 (انٹ نمبر) {چار سلیکشن [] = {'S'، 'M'، 'T'، 'W'، 'T'، 'F'، 'S'] ؛ ریٹرن سلیکشن [نمبر]] یہ فنکشن 0 اور 6 کے درمیان ایک نمبر کو ابتدائی حرف میں تبدیل کرتا ہے۔ اسے کال کرنے کا نتیجہ متغیر کو تفویض کیا جا سکتا ہے، مثال کے طور پر، num _ दिन = فنکشن 3 (نمبر) ؛۔ وایڈ فنکشن 4 (int * پوائنٹر _ سے _ وار) {(* پوائنٹر _ سے _ وار) + + ؛} یہ فنکشن کوئی ویلیو واپس نہیں کرتا بلکہ اس متغیر میں ترمیم کرتا ہے جس کا ایڈریس پیرامیٹر کے طور پر پاس کیا جاتا ہے۔ اسے فنکشن 4 (& متغیر _ سے _ اضافہ) کے ساتھ بلایا جائے گا۔ بیسک بولیاں مائیکروسافٹ سمال بیسک ایکسمپل () 'کالز دی سبروٹین سب ایکسمپل' سبروٹین TextWindow.WriteLine شروع کرتا ہے ("یہ مائیکروسافٹ سمال بیسک میں سبروٹین کی ایک مثال ہے۔") 'سبروٹین اینڈ سب کیا کرتا ہے' سبروٹین کو ختم کرتا ہے۔ مندرجہ بالا مثال میں، مثال () سبروٹین کو کال کرتی ہے۔ اصل سبروٹین کی وضاحت کے لیے، سب کلیدی لفظ استعمال کیا جانا چاہیے، جس میں سبروٹین کا نام سب کے بعد آتا ہے۔ مواد کی پیروی کے بعد، اینڈ سب کو ٹائپ کرنا ضروری ہے۔ بصری بنیادی (کلاسک) بصری بنیادی (کلاسک) زبان میں، ذیلی پروگراموں کو افعال یا ذیلی (یا کلاس سے وابستہ ہونے پر طریقے) کہا جاتا ہے۔ بصری بنیادی 6 مختلف اصطلاحات کا استعمال کرتا ہے جنہیں اقسام کہا جاتا ہے تاکہ اس بات کی وضاحت کی جا سکے کہ پیرامیٹر کے طور پر کیا پاس کیا جا رہا ہے۔ ڈیفالٹ طور پر، ایک غیر متعینہ متغیر متغیر قسم کے طور پر رجسٹرڈ ہوتا ہے اور اسے بائی ریف (ڈیفالٹ) یا بائی وال کے طور پر منتقل کیا جا سکتا ہے۔ نیز، جب کسی فنکشن یا ذیلی کا اعلان کیا جاتا ہے، تو اسے ایک عوامی، نجی، یا دوست کا عہدہ دیا جاتا ہے، جو اس بات کا تعین کرتا ہے کہ آیا اس تک اس ماڈیول یا پروجیکٹ کے باہر رسائی حاصل کی جا سکتی ہے جس میں اس کا اعلان کیا گیا تھا۔ ویلیو کے لحاظ سے [بائی وال]-ایڈریس پاس کرنے کے بجائے ویلیو کی کاپی پاس کرکے کسی دلیل کی قیمت کو کسی طریقہ کار میں منتقل کرنے کا ایک طریقہ۔ نتیجے کے طور پر، متغیر کی اصل قیمت کو اس طریقہ کار سے تبدیل نہیں کیا جا سکتا جس میں اسے منتقل کیا جاتا ہے۔ حوالہ سے [بائی ریف]-متغیر کے پتے کو پاس کرکے، اس کی قیمت کی کاپی پاس کرنے کے بجائے، کسی دلیل کی قیمت کو کسی طریقہ کار میں منتقل کرنے کا ایک طریقہ۔ یہ طریقہ کار کو اصل متغیر تک رسائی کی اجازت دیتا ہے۔ نتیجے کے طور پر، متغیر کی اصل قیمت کو اس طریقہ کار کے ذریعے تبدیل کیا جا سکتا ہے جس میں اسے منتقل کیا جاتا ہے۔ جب تک کہ دوسری صورت میں وضاحت نہ کی جائے، دلائل حوالہ کے ذریعے منظور کیے جاتے ہیں۔ عوامی (اختیاری)-اس بات کی نشاندہی کرتا ہے کہ فنکشن کا طریقہ کار تمام ماڈیولز میں دیگر تمام طریقہ کار کے لیے قابل رسائی ہے۔ اگر کسی ایسے ماڈیول میں استعمال کیا جاتا ہے جس میں آپشن پرائیویٹ ہوتا ہے، تو یہ طریقہ کار پروجیکٹ کے باہر دستیاب نہیں ہے۔ نجی (اختیاری)-اس بات کی نشاندہی کرتا ہے کہ فنکشن کا طریقہ کار صرف اس ماڈیول کے دیگر طریقہ کار کے لیے قابل رسائی ہے جہاں اس کا اعلان کیا گیا ہے۔ دوست (اختیاری)-صرف کلاس ماڈیول میں استعمال ہوتا ہے۔ اس بات کی نشاندہی کرتا ہے کہ فنکشن کا طریقہ کار پورے پروجیکٹ میں نظر آتا ہے، لیکن کسی شے کی مثال کے کنٹرولر کو نظر نہیں آتا ہے۔ پرائیویٹ فنکشن فنکشن 1 () 'کچھ کوڈ یہاں اینڈ فنکشن فنکشن کوئی ویلیو واپس نہیں کرتا ہے اور اسے اسٹینڈ ایلون فنکشن کے طور پر پکارنا پڑتا ہے، مثال کے طور پر فنکشن 1 پرائیویٹ فنکشن فنکشن 2 () بطور انٹیجر فنکشن 2 = 5 اینڈ فنکشن یہ فنکشن نتیجہ (نمبر 5) دیتا ہے، اور کال ایک اظہار کا حصہ ہو سکتی ہے، مثال کے طور پر، x + فنکشن 2 () پرائیویٹ فنکشن فنکشن 3 (بائی ویل انٹ ویلیو بطور انٹیجر) جیسا کہ سٹرنگ ڈم اسٹری آرری (6) جیسا کہ سٹرنگ اسٹری آرری = ارے ("M"، "T"، "W"، "T"، "F"، "S")۔ اسے کال کرنے کا نتیجہ متغیر کو تفویض کیا جا سکتا ہے، مثال کے طور پر، num _ दिन = فنکشن 3 (نمبر)۔ پرائیویٹ فنکشن فنکشن 4 (بائی ریف انٹو ویلیو بطور انٹیجر) انٹو ویلیو = انٹو ویلیو + 1 اینڈ فنکشن یہ فنکشن کوئی ویلیو واپس نہیں کرتا بلکہ اس متغیر میں ترمیم کرتا ہے جس کا پتہ پیرامیٹر کے طور پر پاس کیا جاتا ہے ؛ اسے "فنکشن 4 (متغیر _ سے _ اضافہ)" کے ساتھ بلایا جائے گا۔ پی ایل/آئی میں ایک کال شدہ طریقہ کار کو ایک ڈسکرپٹر پاس کیا جا سکتا ہے جو دلیل کے بارے میں معلومات فراہم کرتا ہے، جیسے کہ سٹرنگ کی لمبائی اور صف کی حدود۔ یہ طریقہ کار کو زیادہ عام ہونے کی اجازت دیتا ہے اور پروگرامر کو ایسی معلومات منتقل کرنے کی ضرورت کو ختم کرتا ہے۔ ڈیفالٹ طور پر پی ایل/آئی حوالہ کے ذریعے دلائل منتقل کرتا ہے۔ دو جہتی صف کے ہر عنصر کی علامت کو تبدیل کرنے کے لیے ایک (معمولی) فنکشن اس طرح نظر آسکتا ہے: چینج _ سائن: پروسیجر (صف) ؛ ڈیکلیئر ایرے (*، *) فلوٹ ؛ ایرے =-صف ؛ اینڈ چینج _ سائن ؛ اسے مختلف صفوں کے ساتھ اس طرح بلایا جا سکتا ہے:/* پہلی صف کی حدود-5 سے + 10 اور 3 سے 9 * تک/ڈیکلیئر ایرے 1 (-5:10، 3:9) فلوٹ ؛/* دوسری صف کی حدود 1 سے 16 اور 1 سے 16 * تک/ڈیکلیئر ایرے 2 (16,16) فلوٹ کال چینج _ سائن (ایرے 1) ؛ کال چینج _ سائن (ایرے 2) ؛ ازگر میں پائیتھن، کلیدی لفظ ڈیف ایک فنکشن کی وضاحت کے لیے استعمال ہوتا ہے۔ فنکشن کے باڈی کی تشکیل کرنے والے بیانات کو یا تو ایک ہی لائن پر جاری رہنا چاہیے یا اگلی لائن پر شروع ہونا چاہیے اور انڈنٹ ہونا چاہیے۔ مندرجہ ذیل مثال پروگرام "ہیلو ورلڈ!" پرنٹ کرتا ہے۔ اس کے بعد "ویکیپیڈیا" اگلے line.def सिंपल _ فنکشن () پر: پرنٹ ('ہیلو ورلڈ!') پرنٹ ('ویکیپیڈیا') سمپل _ فنکشن () #آؤٹ پٹ یہ ہوگا: ہیلو ورلڈ! ویکیپیڈیا ڈیف فنک (نام) پرنٹ ("ویلکم" + نام) پرنٹ (فنک ("مارٹن"))) #output ہو گا: ویلکم مارٹن لوکل متغیرات، تکرار اور دوبارہ داخل ہونا ایک ذیلی پروگرام کو ایک خاص مقدار میں سکریچ اسپیس کا استعمال کرنا مفید لگ سکتا ہے۔ یعنی، انٹرمیڈیٹ نتائج کو برقرار رکھنے کے لیے اس ذیلی پروگرام کے نفاذ کے دوران استعمال ہونے والی میموری۔ اس سکریچ کی جگہ میں ذخیرہ شدہ متغیرات کو مقامی متغیر کہا جاتا ہے، اور سکریچ کی جگہ کو ایکٹیویشن ریکارڈ کہا جاتا ہے۔ ایک ایکٹیویشن ریکارڈ میں عام طور پر واپسی کا پتہ ہوتا ہے جو اسے بتاتا ہے کہ ذیلی پروگرام ختم ہونے پر کنٹرول واپس کہاں منتقل کرنا ہے۔ ذیلی پروگرام میں کال سائٹس کا کوئی بھی نمبر اور نوعیت ہو سکتی ہے۔ اگر ریکرشن سپورٹ کیا جاتا ہے، تو ایک ذیلی پروگرام خود کو کال بھی کر سکتا ہے، جس کی وجہ سے اس کا نفاذ معطل ہو جاتا ہے جبکہ اسی ذیلی پروگرام کا ایک اور نیسٹڈ نفاذ ہوتا ہے۔ کچھ پیچیدہ الگورتھم کو آسان بنانے اور پیچیدہ مسائل کو توڑنے کے لیے تکرار ایک مفید ذریعہ ہے۔ بار بار آنے والی زبانیں عام طور پر ہر کال پر مقامی متغیرات کی ایک نئی کاپی فراہم کرتی ہیں۔ اگر پروگرامر چاہتا ہے کہ مقامی متغیرات کی قیمت کالوں کے درمیان یکساں رہے، تو انہیں کچھ زبانوں میں جامد قرار دیا جا سکتا ہے، یا عالمی اقدار یا مشترکہ علاقوں کو استعمال کیا جا سکتا ہے۔ فبونیکی نمبروں کو تلاش کرنے کے لیے سی/سی + + میں ریکرسو فنکشن کی ایک مثال یہ ہے: انٹی فب (انٹی این) {اگر (این <= 1) {ریٹرن این ؛} ریٹرن فب (این-1) + فب (این-2) ؛} فورٹرن جیسی ابتدائی زبانوں نے ابتدائی طور پر ریکرسن کی حمایت نہیں کی کیونکہ متغیرات کو مستحکم طور پر مختص کیا گیا تھا، ساتھ ہی ساتھ واپسی کے پتے کا مقام بھی۔ ابتدائی کمپیوٹر انسٹرکشن سیٹوں نے واپسی کے پتے اور متغیرات کو اسٹیک پر محفوظ کرنا مشکل بنا دیا۔ انڈیکس رجسٹر یا جنرل پرپز رجسٹر والی مشینیں، مثال کے طور پر، سی ڈی سی 6000 سیریز، پی ڈی پی-6، جی ای 635، سسٹم/360، یو این آئی وی اے سی 1100 سیریز، ان میں سے کسی ایک رجسٹر کو اسٹیک پوائنٹر کے طور پر استعمال کر سکتی ہیں۔ اے ایل جی او ایل کے بعد کی جدید زبانیں جیسے پی ایل/آئی اور سی تقریبا ہمیشہ ایک اسٹیک کا استعمال کرتی ہیں، جو عام طور پر زیادہ تر جدید کمپیوٹر انسٹرکشن سیٹوں کے ذریعے سپورٹ کی جاتی ہیں تاکہ ذیلی پروگرام کے ہر عمل کے لیے ایک تازہ ایکٹیویشن ریکارڈ فراہم کیا جا سکے۔ اس طرح، نیسٹڈ پھانسی جاری دیگر معطل پھانسیوں پر پڑنے والے اثرات کے بارے میں فکر کیے بغیر اپنے مقامی متغیرات میں ترمیم کرنے کے لیے آزاد ہے۔ جیسے جیسے نیسٹڈ کالز جمع ہوتی ہیں، ایک کال اسٹیک ڈھانچہ تشکیل پاتا ہے، جو ہر معطل ذیلی پروگرام کے لیے ایک ایکٹیویشن ریکارڈ پر مشتمل ہوتا ہے۔ درحقیقت، یہ اسٹیک ڈھانچہ عملی طور پر ہر جگہ موجود ہے، اور اس لیے ایکٹیویشن ریکارڈز کو عام طور پر اسٹیک فریم کہا جاتا ہے۔ کچھ زبانیں جیسے پاسکل، پی ایل/آئی، اور اڈا بھی نیسٹڈ فنکشنز کی حمایت کرتی ہیں، جو صرف بیرونی (پیرنٹ) فنکشن کے دائرہ کار میں کال کرنے کے قابل فنکشن ہیں۔ اندرونی افعال کو بیرونی فعل کے مقامی متغیرات تک رسائی حاصل ہوتی ہے جو انہیں کہتے ہیں۔ یہ ایکٹیویشن ریکارڈ کے اندر اضافی سیاق و سباق کی معلومات کو محفوظ کرکے پورا کیا جاتا ہے، جسے ڈسپلے بھی کہا جاتا ہے۔ اگر کسی ذیلی پروگرام کو اس وقت بھی صحیح طریقے سے انجام دیا جا سکتا ہے جب اسی ذیلی پروگرام کا دوسرا نفاذ پہلے ہی جاری ہے، تو اس ذیلی پروگرام کو دوبارہ داخل ہونے والا کہا جاتا ہے۔ ایک تکراری ذیلی پروگرام دوبارہ داخل ہونا چاہیے۔ ری اینٹرینٹ سب پروگرام ملٹی تھریڈڈ حالات میں بھی مفید ہیں کیونکہ متعدد تھریڈ ایک دوسرے کے ساتھ مداخلت کے خوف کے بغیر ایک ہی ذیلی پروگرام کو کال کر سکتے ہیں۔ آئی بی ایم سی آئی سی ایس ٹرانزیکشن پروسیسنگ سسٹم میں، کواسی-رینٹرنٹ قدرے کم پابند تھا، لیکن اسی طرح، ایپلیکیشن پروگراموں کے لیے ضرورت تھی جو بہت سے تھریڈز کے ذریعے شیئر کیے گئے تھے۔ سختی سے ٹائپ کی گئی زبانوں میں، بعض اوقات یہ مطلوب ہوتا ہے کہ ایک ہی نام کے ساتھ متعدد افعال ہوں، لیکن مختلف قسم کے ڈیٹا پر کام کریں، یا مختلف پیرامیٹر پروفائلز کے ساتھ۔ مثال کے طور پر، ایک مربع جڑ فنکشن کو حقیقی، پیچیدہ اقدار یا میٹرکس پر کام کرنے کے لیے بیان کیا جا سکتا ہے۔ ہر معاملے میں استعمال ہونے والا الگورتھم مختلف ہے، اور واپسی کا نتیجہ مختلف ہو سکتا ہے۔ ایک ہی نام سے تین الگ الگ فنکشن لکھنے سے، پروگرامر کو ہر قسم کے ڈیٹا کے لیے مختلف ناموں کو یاد نہ رکھنے کی سہولت ہوتی ہے۔ مزید برآں، اگر ایک ذیلی قسم کو حقیقی کے لیے، مثبت اور منفی حقیقی کو الگ کرنے کے لیے بیان کیا جا سکتا ہے، تو حقیقی کے لیے دو افعال لکھے جا سکتے ہیں، ایک حقیقی کو واپس کرنے کے لیے جب پیرامیٹر مثبت ہو، اور دوسرا پیچیدہ قدر کو واپس کرنے کے لیے جب پیرامیٹر منفی ہو۔ آبجیکٹ پر مبنی پروگرامنگ میں، جب ایک ہی نام کے افعال کا ایک سلسلہ مختلف پیرامیٹر پروفائلز یا مختلف اقسام کے پیرامیٹرز کو قبول کر سکتا ہے، تو ہر فنکشن کو اوورلوڈ کہا جاتا ہے۔ یہاں C + + میں فنکشن اوورلوڈنگ کی ایک مثال ہے، جو ایک ہی نام (ایریا) لیکن مختلف پیرامیٹرز کے ساتھ دو افعال کے نفاذ کو ظاہر کرتی ہے: #include <iost stream> ڈبل ایریا (ڈبل ایچ، ڈبل ڈبلیو) {ریٹرن ایچ * ڈبلیو ؛}/* پہلا ایریا فنکشن ایک مستطیل کے رقبے کو تلاش کرنے کے لیے ہے، * لہذا یہ اونچائی اور چوڑائی کے لیے دو نمبروں کو پیرامیٹرز کے طور پر قبول کرتا ہے۔ */ڈبل ایریا (ڈبل آر) {ریٹرن آر * آر * 3.14 ؛}/* دوسرا ایریا فنکشن دائرے کے رقبے کو تلاش کرنے کے لیے ہے، * لہذا یہ رداس کے لیے صرف ایک نمبر کو بطور پیرامیٹر قبول کرتا ہے۔ */int مین () {ڈبل ریکٹینگل ایریا = ایریا (3، 4) ؛// یہ پہلے ایریا فنکشن کو کال کرتا ہے، کیونکہ دو پیرامیٹرز فراہم کیے گئے ہیں۔ ڈبل سرکل _ ایریا = ایریا (5) ؛// یہ دوسرے ایریا فنکشن کو کال کرتا ہے، کیونکہ صرف ایک پیرامیٹر فراہم کیا جاتا ہے۔ ایک اور مثال کے طور پر، ایک فنکشن ایک ایسی چیز کی تعمیر کر سکتا ہے جو سمتوں کو قبول کرے، اور اسکرین پر ان نکات تک اپنے راستے کا سراغ لگائے۔ ایسے بہت سے پیرامیٹرز ہیں جنہیں کنسٹرکٹر تک پہنچایا جا سکتا ہے (ٹریس کا رنگ، x اور y کوآرڈینیٹس شروع کرنا، ٹریس کی رفتار)۔ اگر پروگرامر چاہتا ہے کہ کنسٹرکٹر صرف رنگین پیرامیٹر کو قبول کر سکے، تو وہ کسی دوسرے کنسٹرکٹر کو کال کر سکتا ہے جو صرف رنگ کو قبول کرتا ہے، جو بدلے میں کنسٹرکٹر کو تمام پیرامیٹرز کے ساتھ ڈیفالٹ ویلیوز کے سیٹ میں گزرتا ہے۔ دیگر تمام پیرامیٹرز (X اور Y عام طور پر اسکرین پر مرکوز ہوں گے یا اصل پر رکھے جائیں گے، اور رفتار کو کوڈر کے انتخاب کی دوسری قیمت پر سیٹ کیا جائے گا)۔ پی ایل/آئی کے پاس مختلف قسم کے دلائل کے ساتھ کال کیے جانے والے اندراج حوالہ جات کے سیٹ کے لیے عام نام کی وضاحت کرنے کے لیے عام خاصیت ہے۔ مثال: ڈیکلیئر جین _ نیم جنرل (نام کب (فکسڈ بائنری)، شعلہ کب (فلوٹ)، پاتھ نام دیگر) ؛ ہر اندراج کے لیے متعدد دلیل کی تعریفیں متعین کی جا سکتی ہیں۔ "جین _ نیم" پر کال کے نتیجے میں "نام" پر کال ہوگی جب دلیل بائنری طے کی جائے، "شعلہ" جب فلوٹ ہو، وغیرہ۔ اگر دلیل سے میل کھاتا ہے تو کسی بھی انتخاب "پاتھ نام" کو کال نہیں کیا جائے گا۔ بندش ایک ذیلی پروگرام ہے جس میں اس کے کچھ متغیرات کی اقدار اس ماحول سے حاصل کی گئی ہیں جس میں اسے بنایا گیا تھا۔ بندش Lisp پروگرامنگ زبان کی ایک قابل ذکر خصوصیت تھی، جسے جان میکارتھی نے متعارف کرایا تھا۔ نفاذ پر منحصر ہے، بندش ضمنی اثرات کے لیے ایک طریقہ کار کے طور پر کام کر سکتی ہے۔ کنونشن افعال کی کوڈنگ کے لیے وسیع تعداد میں کنونشن تیار کیے گئے ہیں۔ ان کے نام سے متعلق، بہت سے ڈویلپرز نے یہ نقطہ نظر اپنایا ہے کہ کسی فنکشن کا نام ایک فعل ہونا چاہیے جب وہ کسی خاص کام کو انجام دیتا ہے، ایک صفت جب وہ کچھ انکوائری کرتا ہے، اور ایک اسم جب اسے متغیرات کو تبدیل کرنے کے لیے استعمال کیا جاتا ہے۔ کچھ پروگرامرز تجویز کرتے ہیں کہ کسی فنکشن کو صرف ایک کام انجام دینا چاہیے، اور اگر کوئی فنکشن ایک سے زیادہ کام انجام دیتا ہے، تو اسے مزید افعال میں تقسیم کیا جانا چاہیے۔ ان کا استدلال ہے کہ فنکشن کوڈ کی دیکھ بھال میں کلیدی اجزاء ہیں، اور پروگرام میں ان کے کردار واضح رہنے چاہئیں۔ ماڈیولر پروگرامنگ (ماڈیولرائزنگ کوڈ) کے حامی اس بات کی وکالت کرتے ہیں کہ ہر فنکشن کا کوڈ کے دوسرے ٹکڑوں پر کم سے کم انحصار ہونا چاہیے۔ مثال کے طور پر، عالمی متغیرات کا استعمال عام طور پر اس نقطہ نظر کے حامیوں کے ذریعہ غیر دانشمندانہ سمجھا جاتا ہے، کیونکہ یہ فنکشن اور ان عالمی متغیرات کے درمیان سخت جوڑے کا اضافہ کرتا ہے۔ اگر اس طرح کا جوڑا ضروری نہیں ہے، تو ان کا مشورہ یہ ہے کہ اس کے بجائے منظور شدہ پیرامیٹرز کو قبول کرنے کے لیے ری فیکٹر افعال ہوں۔ تاہم، افعال کو منتقل کیے گئے پیرامیٹرز کی تعداد میں اضافہ کوڈ کی پڑھنے کی اہلیت کو متاثر کر سکتا ہے۔ ریٹرن کوڈز اس کے بنیادی یا عام اثر کے علاوہ، ایک سبروٹین کو کالنگ پروگرام کو اس کے نفاذ کے دوران پیش آنے والے غیر معمولی حالات کے بارے میں مطلع کرنے کی ضرورت پڑ سکتی ہے۔ کچھ زبانوں اور پروگرامنگ کے معیارات میں، یہ اکثر ریٹرن کوڈ کے ذریعے کیا جاتا ہے، ایک انٹیجر ویلیو جو ذیلی پروگرام کے ذریعے کسی معیاری مقام پر رکھی جاتی ہے، جو عام اور غیر معمولی حالات کو انکوڈ کرتی ہے۔ آئی بی ایم سسٹم/360 میں، جہاں سبروٹین سے ریٹرن کوڈ کی توقع کی جاتی تھی، ریٹرن ویلیو کو اکثر 4 کے ملٹیپل کے طور پر ڈیزائن کیا جاتا تھا-تاکہ اسے برانچ ٹیبل میں براہ راست برانچ ٹیبل انڈیکس کے طور پر استعمال کیا جا سکے جو اکثر کال کے فورا بعد واقع ہوتا ہے۔ اضافی مشروط ٹیسٹوں سے بچنے کے لیے، کارکردگی کو مزید بہتر بنانا۔ سسٹم/360 اسمبلی زبان میں، کوئی لکھ سکتا ہے، مثال کے طور پر: BAL 14، SUBRTN01 ایک سبروٹین پر جائیں، واپسی کا پتہ R14 B ٹیبل میں محفوظ کریں (15) برانچ ٹیبل کو انڈیکس کرنے کے لیے ریگ 15 میں واپس کی گئی قیمت کا استعمال کریں، * مناسب برانچ انسٹار پر برانچ کریں۔ ٹیبل بی اوکے ریٹرن کوڈ = 00 گڈ} بی بی ڈی ریٹرن کوڈ = 04 غلط ان پٹ} برانچ ٹیبل بی ایرر ریٹرن کوڈ = 08 غیر متوقع حالت} فنکشن کالز کی اصلاح فنکشن کو کال کرنے میں ایک اہم رن ٹائم اوور ہیڈ ہوتا ہے، جس میں دلائل کو پاس کرنا، ذیلی پروگرام میں برانچ کرنا، اور کال کرنے والے کو واپس برانچ کرنا شامل ہے۔ اوور ہیڈ میں اکثر بعض پروسیسر رجسٹروں کو بچانا اور بحال کرنا، کال فریم اسٹوریج مختص کرنا اور دوبارہ حاصل کرنا وغیرہ شامل ہوتے ہیں۔ کچھ زبانوں میں، ہر فنکشن کال کا مطلب فنکشن کے ریٹرن کوڈ کی خودکار جانچ یا مستثنیات کو سنبھالنا بھی ہوتا ہے جو یہ اٹھا سکتا ہے۔ آبجیکٹ پر مبنی زبانوں میں اوور ہیڈ کا ایک اہم ذریعہ میتھڈ کالز کے لیے شدت سے استعمال ہونے والا ڈائنامک ڈسپیچ ہے۔ طریقہ کار کالز کی کچھ بظاہر واضح اصلاحات ہیں جن کا اطلاق نہیں کیا جا سکتا اگر طریقہ کار کے مضر اثرات ہو سکتے ہیں۔ مثال کے طور پر، اظہار (f (x)-1)/(f (x) + 1) میں، فنکشن f کو دو بار کال کیا جانا چاہیے، کیونکہ دونوں کالز مختلف نتائج دے سکتی ہیں۔ مزید برآں، ان چند زبانوں میں جو ڈویژن آپریٹر کے آپریڈز کی تشخیص کی ترتیب کی وضاحت کرتی ہیں، x کی قیمت دوسری کال سے پہلے دوبارہ حاصل کی جانی چاہیے، کیونکہ پہلی کال نے اسے تبدیل کر دیا ہوگا۔ اس بات کا تعین کرنا کہ آیا کسی ذیلی پروگرام کا ضمنی اثر ہو سکتا ہے بہت مشکل ہے (درحقیقت، رائس کے نظریہ کی وجہ سے ناقابل فیصلہ)۔ لہذا، جب کہ وہ اصلاح خالص طور پر فعال پروگرامنگ زبانوں میں محفوظ ہیں، عام طور پر لازمی پروگرامنگ کے مرتب کرنے والوں کو عام طور پر بدترین فرض کرنا پڑتا ہے۔ ان لائننگ اس اوور ہیڈ کو ختم کرنے کے لیے استعمال ہونے والا ایک طریقہ ہر کال سائٹ پر ذیلی پروگرام کے باڈی کی ان لائن توسیع یا ان لائننگ ہے (بمقابلہ فنکشن اور بیک پر برانچنگ)۔ یہ نہ صرف کال اوور ہیڈ سے بچتا ہے، بلکہ یہ مرتب کرنے والے کو اس کال کے سیاق و سباق اور دلائل کو مدنظر رکھتے ہوئے طریقہ کار کے جسم کو زیادہ مؤثر طریقے سے بہتر بنانے کی بھی اجازت دیتا ہے۔ داخل شدہ باڈی کو مرتب کے ذریعے بہتر بنایا جا سکتا ہے۔ تاہم، ان لائننگ عام طور پر کوڈ کے سائز میں اضافہ کرے گی، جب تک کہ پروگرام میں فنکشن پر صرف ایک کال نہ ہو۔ اسسنکرونس پروسیجر کال بھی دیکھیں، ایک ذیلی پروگرام جسے اس کے پیرامیٹرز کے بعد بلایا جاتا ہے دیگر سرگرمیوں کے ذریعہ سیٹ کیا جاتا ہے بلٹ ان فنکشن کمانڈ کوری علیحدگی (سی کیو ایس) مرکب آپریشن کروٹائنز، ذیلی پروگرام جو ایک دوسرے کو کال کرتے ہیں گویا دونوں مرکزی پروگرام تھے تشخیصی حکمت عملی ایونٹ ہینڈلر، ایک ذیلی پروگرام جسے کسی ان پٹ ایونٹ یا انٹرپٹ فنکشن کے جواب میں بلایا جاتا ہے (ریاضی) فنکشنل پروگرامنگ فیوزڈ آپریشن لیمبڈا فنکشن (کمپیوٹر پروگرامنگ)، ایک فنکشن جو شناخت کے طریقہ کار (کمپیوٹر پروگرامنگ) ماڈیولر پروگرامنگ آپریٹر اوورلوڈنگ محفوظ طریقہ کار ٹرانسکلیوژن حوالہ جات ماخذ کوڈ آرٹیکلز مثال کے طور پر سی کوڈ ہولزم پروگرامنگ کی تعمیر کے ساتھ