कार्य प्रस्तावना और उपसंहार: Difference between revisions

From Vigyanwiki
(Created page with "सभा की भाषा कंप्यूटर प्रोग्रामिंग में, फ़ंक्शन प्रोलॉग किसी फ...")
 
No edit summary
Line 1: Line 1:
[[ सभा की भाषा ]] [[कंप्यूटर प्रोग्रामिंग]] में, फ़ंक्शन प्रोलॉग किसी फ़ंक्शन की शुरुआत में कोड की कुछ पंक्तियाँ होती हैं, जो फ़ंक्शन के भीतर उपयोग के लिए [[कॉल स्टैक]] और [[प्रोसेसर रजिस्टर]] तैयार करती हैं। इसी प्रकार, फ़ंक्शन उपसंहार फ़ंक्शन के अंत में दिखाई देता है, और स्टैक और रजिस्टरों को उस स्थिति में पुनर्स्थापित करता है जिसमें वे फ़ंक्शन को कॉल करने से पहले थे।
[[ सभा की भाषा |असेंबली]] [[कंप्यूटर प्रोग्रामिंग]] में, '''फ़ंक्शन प्रोलॉग''' किसी फ़ंक्शन की प्रारंभ में कोड की कुछ पंक्तियाँ होती हैं, जो फ़ंक्शन के अन्दर उपयोग के लिए [[कॉल स्टैक]] और [[प्रोसेसर रजिस्टर]] तैयार करती हैं। इसी प्रकार, फ़ंक्शन एपीलॉग फ़ंक्शन के अंत में दिखाई देता है, और स्टैक और रजिस्टरों को उस स्थिति में पुनर्स्थापित करता है जिसमें वह फ़ंक्शन को कॉल करने से पहले थे।


प्रस्तावना और उपसंहार असेंबली भाषा का हिस्सा नहीं हैं; वे असेंबली भाषा [[प्रोग्रामर]] और कई उच्च-स्तरीय [[प्रोग्रामिंग भाषा]] के [[ संकलक ]]ों द्वारा उपयोग किए जाने वाले सम्मेलन का प्रतिनिधित्व करते हैं। वे काफी कठोर हैं, प्रत्येक कार्य में उनका रूप समान है।
प्रोलॉग और एपीलॉग असेंबली लैंग्वेज का भाग नहीं हैं; वह असेंबली लैंग्वेज [[प्रोग्रामर]] और अनेक उच्च-स्तरीय [[प्रोग्रामिंग भाषा|प्रोग्रामिंग]] लैंग्वेज के [[ संकलक |कंपाइलर]]द्वारा उपयोग किए जाने वाले सम्मेलन का प्रतिनिधित्व करते हैं। वह अधिक कठोर हैं, प्रत्येक कार्य में उनका रूप समान है।


फ़ंक्शन प्रस्तावना और उपसंहार में कभी-कभी बफर अतिप्रवाह सुरक्षा के लिए कोड भी होता है।
फ़ंक्शन प्रोलॉग और एपीलॉग में कभी-कभी बफर अतिप्रवाह सुरक्षा के लिए कोड भी होता है।


==प्रस्तावना==
==प्रोलॉग==
यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो एक फ़ंक्शन प्रस्तावना आम तौर पर निम्नलिखित क्रियाएं करती है:
यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो एक फ़ंक्शन प्रोलॉग सामान्यतः निम्नलिखित क्रियाएं करती है:
*वर्तमान बेस पॉइंटर को स्टैक पर धकेलता है, ताकि इसे बाद में पुनर्स्थापित किया जा सके।
*वर्तमान बेस पॉइंटर को स्टैक पर बल देता है, जिससे इसे पश्चात् में पुनर्स्थापित किया जा सकता है।
*बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर इंगित किया जाता है) ताकि बेस पॉइंटर स्टैक के शीर्ष पर इंगित हो।
*बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर संकेत किया जाता है) जिससे बेस पॉइंटर स्टैक के शीर्ष पर संकेत होता है।
*स्टैक पॉइंटर को उसके मान को घटाकर या बढ़ाकर आगे ले जाता है, यह इस बात पर निर्भर करता है कि स्टैक नीचे बढ़ता है या ऊपर। x86 पर, फ़ंक्शन के स्थानीय चर के लिए जगह बनाने के लिए स्टैक पॉइंटर को कम किया जाता है।
*स्टैक पॉइंटर को उसके मान को घटाकर या बढ़ाकर आगे ले जाता है, यह इस बात पर निर्भर करता है कि स्टैक नीचे बढ़ता है या ऊपर x86 पर, फ़ंक्शन के स्थानीय वैरिएबल के लिए स्थान बनाने के लिए स्टैक पॉइंटर को कम किया जाता है।


कई संभावित प्रस्तावनाएं लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। ये अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही तरीके से उपयोग करता है।
अनेक संभावित प्रोलॉग लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। यह अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही विधि से उपयोग करता है।


उदाहरण के तौर पर, यहां [[जीएनयू कंपाइलर संग्रह]] द्वारा निर्मित एक विशिष्ट [[x86 असेंबली भाषा]] फ़ंक्शन प्रस्तावना है
उदाहरण के तौर पर, यहां [[जीएनयू कंपाइलर संग्रह|जीएनयू कंपाइलर स्टोर]] द्वारा निर्मित एक विशिष्ट [[x86 असेंबली भाषा|x86 असेंबली]] लैंग्वेज फ़ंक्शन प्रोलॉग है
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
push ebp
push ebp
Line 21: Line 21:
एन तत्काल मूल्य स्थानीय उपयोग के लिए स्टैक पर आरक्षित बाइट्स की संख्या है।
एन तत्काल मूल्य स्थानीय उपयोग के लिए स्टैक पर आरक्षित बाइट्स की संख्या है।


का उपयोग करके समान परिणाम प्राप्त किया जा सकता है <code>enter</code> अनुदेश:
<code>enter</code> अनुदेश का उपयोग करके समान परिणाम प्राप्त किया जा सकता है :
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
enter N, 0
enter N, 0
</syntaxhighlight>
</syntaxhighlight>
के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अलावा) का उपयोग करके अधिक जटिल प्रस्तावनाएँ प्राप्त की जा सकती हैं <code>enter</code> अनुदेश. ये प्रस्तावनाएं [[नेस्टेड फ़ंक्शन]] की अनुमति देने के लिए कई आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि [[पास्कल प्रोग्रामिंग भाषा]] जैसी भाषाओं के लिए आवश्यक है। हालाँकि, इन भाषाओं के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वे कुछ मामलों में घोंसले की गहराई को सीमित करते हैं।{{Citation needed|date=June 2011}}
<code>enter</code> अनुदेश के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अतिरिक्त) का उपयोग करके अधिक काम्प्लेक्स प्रोलॉग प्राप्त की जा सकती हैं . यह प्रोलॉग [[नेस्टेड फ़ंक्शन]] की अनुमति देने के लिए अनेक आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि [[पास्कल प्रोग्रामिंग भाषा|पास्कल प्रोग्रामिंग]] लैंग्वेज जैसी लैंग्वेज के लिए आवश्यक है। चूँकि, इन लैंग्वेज के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वह कुछ स्थितियों में नेस्टिंग डेप्थ को सीमित करते हैं।{{Citation needed|date=June 2011}}


==उपसंहार==
==एपीलॉग==
फ़ंक्शन उपसंहार फ़ंक्शन प्रस्तावना की क्रियाओं को उलट देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह आम तौर पर निम्नलिखित क्रियाएं करता है (यह प्रक्रिया एक आर्किटेक्चर से दूसरे आर्किटेक्चर में भिन्न हो सकती है):
फ़ंक्शन एपीलॉग फ़ंक्शन प्रोलॉग की क्रियाओं को परिवर्तित कर देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह सामान्यतः निम्नलिखित क्रियाएं करता है (यह प्रक्रिया एक आर्किटेक्चर से दूसरे आर्किटेक्चर में भिन्न हो सकती है):
*स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, ताकि स्थानीय चर के लिए प्रस्तावना में आरक्षित स्थान खाली हो जाए।
*स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, जिससे स्थानीय वैरिएबल के लिए प्रोलॉग में आरक्षित स्थान रिक्त हो जाते है।
*बेस पॉइंटर को स्टैक से हटा देता है, ताकि इसे प्रस्तावना से पहले उसके मान पर पुनर्स्थापित किया जा सके।
*बेस पॉइंटर को स्टैक से हटा देता है, जिससे इसे प्रोलॉग से पहले उसके मान पर पुनर्स्थापित किया जा सकता है।
*पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और उस पर कूदकर, कॉलिंग फ़ंक्शन पर वापस लौटता है।
*पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और जम्पिंग करके, कॉलिंग फ़ंक्शन पर वापस लौटता है।


दिया गया उपसंहार उपरोक्त प्रस्तावनाओं में से किसी एक के प्रभाव को उलट देगा (या तो पूर्ण प्रस्तावना, या जो उपयोग करता है) <code>enter</code>). कुछ कॉलिंग परंपराओं के तहत स्टैक से तर्कों को साफ़ करना कैली की ज़िम्मेदारी है, इसलिए उपसंहार में स्टैक पॉइंटर को नीचे या ऊपर ले जाने का चरण भी शामिल हो सकता है।
दिया गया एपीलॉग उपरोक्त प्रोलॉगओं में से किसी एक के प्रभाव को परिवर्तित कर देगा (या तो पूर्ण प्रोलॉग, या जो <code>enter</code> उपयोग करता है). कुछ कॉलिंग परंपराओं के अनुसार स्टैक से लॉजिक को साफ़ करना कैली का दायित्व है, इसलिए एपीलॉग में स्टैक पॉइंटर को नीचे या ऊपर ले जाने का फेज भी सम्मिलित हो सकता है।


उदाहरण के लिए, इन तीन चरणों को निम्नलिखित निर्देशों द्वारा 32-बिट x86 असेंबली भाषा में पूरा किया जा सकता है:
उदाहरण के लिए, इन तीन फेज  को निम्नलिखित निर्देशों द्वारा 32-बिट x86 असेंबली लैंग्वेज में पूरा किया जा सकता है:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
mov esp, ebp
mov esp, ebp
Line 41: Line 41:
ret
ret
</syntaxhighlight>
</syntaxhighlight>
प्रस्तावना की तरह, x[[86]] प्रोसेसर में एक अंतर्निहित निर्देश होता है जो उपसंहार का भाग निष्पादित करता है। निम्नलिखित कोड उपरोक्त कोड के बराबर है:
प्रोलॉग की तरह, x[[86]] प्रोसेसर में एक अंतर्निहित निर्देश होता है जो एपीलॉग का भाग निष्पादित करता है। निम्नलिखित कोड उपरोक्त कोड के समान है:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
leave
leave
Line 47: Line 47:
</syntaxhighlight>
</syntaxhighlight>


<code>leave</code> ई> निर्देश निष्पादित करता है <code>mov</code> और <code>pop</code> निर्देश, जैसा कि ऊपर बताया गया है।


एक फ़ंक्शन में कई उपसंहार हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में एक सामान्य उपसंहार पर जाना चाहिए, या उसमें अपना स्वयं का उपसंहार होना चाहिए। इसलिए, प्रोग्रामर या कंपाइलर अक्सर इसके संयोजन का उपयोग करते हैं <code>leave</code> और <code>ret</code> किसी भी बिंदु पर फ़ंक्शन से बाहर निकलने के लिए। (उदाहरण के लिए, एक C (प्रोग्रामिंग भाषा) कंपाइलर a को प्रतिस्थापित करेगा <code>return</code> एक के साथ बयान <code>leave</code>/<code>ret</code> अनुक्रम)।
जैसा कि ऊपर बताया गया है, <code>leave</code> निर्देश <code>mov</code> और <code>pop</code> निर्देश निष्पादित करता है।
 
एक फ़ंक्शन में अनेक एपीलॉग हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में एक सामान्य एपीलॉग पर जाना चाहिए, या उसमें अपना स्वयं का एपीलॉग होना चाहिए। इसलिए, प्रोग्रामर या कंपाइलर अधिकांशतः इसके संयोजन <code>leave</code> और <code>ret</code> का उपयोग करते हैं  किसी भी बिंदु पर फ़ंक्शन से बाहर निकलने के लिए। (उदाहरण के लिए, एक C कंपाइलर एक <code>return</code> स्टेटमेंट को <code>leave</code>/<code>ret</code> अनुक्रम के साथ प्रतिस्थापित करेगा)।


== अग्रिम पठन ==
== अग्रिम पठन ==

Revision as of 17:04, 8 August 2023

असेंबली कंप्यूटर प्रोग्रामिंग में, फ़ंक्शन प्रोलॉग किसी फ़ंक्शन की प्रारंभ में कोड की कुछ पंक्तियाँ होती हैं, जो फ़ंक्शन के अन्दर उपयोग के लिए कॉल स्टैक और प्रोसेसर रजिस्टर तैयार करती हैं। इसी प्रकार, फ़ंक्शन एपीलॉग फ़ंक्शन के अंत में दिखाई देता है, और स्टैक और रजिस्टरों को उस स्थिति में पुनर्स्थापित करता है जिसमें वह फ़ंक्शन को कॉल करने से पहले थे।

प्रोलॉग और एपीलॉग असेंबली लैंग्वेज का भाग नहीं हैं; वह असेंबली लैंग्वेज प्रोग्रामर और अनेक उच्च-स्तरीय प्रोग्रामिंग लैंग्वेज के कंपाइलरद्वारा उपयोग किए जाने वाले सम्मेलन का प्रतिनिधित्व करते हैं। वह अधिक कठोर हैं, प्रत्येक कार्य में उनका रूप समान है।

फ़ंक्शन प्रोलॉग और एपीलॉग में कभी-कभी बफर अतिप्रवाह सुरक्षा के लिए कोड भी होता है।

प्रोलॉग

यदि आर्किटेक्चर में बेस पॉइंटर (जिसे फ्रेम पॉइंटर भी कहा जाता है) और स्टैक पॉइंटर होता है तो एक फ़ंक्शन प्रोलॉग सामान्यतः निम्नलिखित क्रियाएं करती है:

  • वर्तमान बेस पॉइंटर को स्टैक पर बल देता है, जिससे इसे पश्चात् में पुनर्स्थापित किया जा सकता है।
  • बेस पॉइंटर का मान स्टैक पॉइंटर के पते पर सेट किया जाता है (जो स्टैक के शीर्ष पर संकेत किया जाता है) जिससे बेस पॉइंटर स्टैक के शीर्ष पर संकेत होता है।
  • स्टैक पॉइंटर को उसके मान को घटाकर या बढ़ाकर आगे ले जाता है, यह इस बात पर निर्भर करता है कि स्टैक नीचे बढ़ता है या ऊपर x86 पर, फ़ंक्शन के स्थानीय वैरिएबल के लिए स्थान बनाने के लिए स्टैक पॉइंटर को कम किया जाता है।

अनेक संभावित प्रोलॉग लिखी जा सकती हैं, जिसके परिणामस्वरूप थोड़ा अलग स्टैक कॉन्फ़िगरेशन हो सकता है। यह अंतर स्वीकार्य हैं, जब तक प्रोग्रामर या कंपाइलर फ़ंक्शन के अंदर स्टैक का सही विधि से उपयोग करता है।

उदाहरण के तौर पर, यहां जीएनयू कंपाइलर स्टोर द्वारा निर्मित एक विशिष्ट x86 असेंबली लैंग्वेज फ़ंक्शन प्रोलॉग है

	push ebp
	mov	ebp, esp
	sub	esp, N

एन तत्काल मूल्य स्थानीय उपयोग के लिए स्टैक पर आरक्षित बाइट्स की संख्या है।

enter अनुदेश का उपयोग करके समान परिणाम प्राप्त किया जा सकता है :

	enter	N, 0

enter अनुदेश के दूसरे ऑपरेंड के लिए विभिन्न मानों (0 के अतिरिक्त) का उपयोग करके अधिक काम्प्लेक्स प्रोलॉग प्राप्त की जा सकती हैं . यह प्रोलॉग नेस्टेड फ़ंक्शन की अनुमति देने के लिए अनेक आधार/फ़्रेम पॉइंटर्स को आगे बढ़ाती हैं, जैसा कि पास्कल प्रोग्रामिंग लैंग्वेज जैसी लैंग्वेज के लिए आवश्यक है। चूँकि, इन लैंग्वेज के आधुनिक संस्करण इन निर्देशों का उपयोग नहीं करते हैं क्योंकि वह कुछ स्थितियों में नेस्टिंग डेप्थ को सीमित करते हैं।[citation needed]

एपीलॉग

फ़ंक्शन एपीलॉग फ़ंक्शन प्रोलॉग की क्रियाओं को परिवर्तित कर देता है और कॉलिंग फ़ंक्शन पर नियंत्रण लौटा देता है। यह सामान्यतः निम्नलिखित क्रियाएं करता है (यह प्रक्रिया एक आर्किटेक्चर से दूसरे आर्किटेक्चर में भिन्न हो सकती है):

  • स्टैक पॉइंटर को वर्तमान बेस पॉइंटर पर छोड़ें, जिससे स्थानीय वैरिएबल के लिए प्रोलॉग में आरक्षित स्थान रिक्त हो जाते है।
  • बेस पॉइंटर को स्टैक से हटा देता है, जिससे इसे प्रोलॉग से पहले उसके मान पर पुनर्स्थापित किया जा सकता है।
  • पिछले फ्रेम के प्रोग्राम काउंटर को स्टैक से हटाकर और जम्पिंग करके, कॉलिंग फ़ंक्शन पर वापस लौटता है।

दिया गया एपीलॉग उपरोक्त प्रोलॉगओं में से किसी एक के प्रभाव को परिवर्तित कर देगा (या तो पूर्ण प्रोलॉग, या जो enter उपयोग करता है). कुछ कॉलिंग परंपराओं के अनुसार स्टैक से लॉजिक को साफ़ करना कैली का दायित्व है, इसलिए एपीलॉग में स्टैक पॉइंटर को नीचे या ऊपर ले जाने का फेज भी सम्मिलित हो सकता है।

उदाहरण के लिए, इन तीन फेज को निम्नलिखित निर्देशों द्वारा 32-बिट x86 असेंबली लैंग्वेज में पूरा किया जा सकता है:

	mov	esp, ebp
	pop	ebp
	ret

प्रोलॉग की तरह, x86 प्रोसेसर में एक अंतर्निहित निर्देश होता है जो एपीलॉग का भाग निष्पादित करता है। निम्नलिखित कोड उपरोक्त कोड के समान है:

	leave
	ret


जैसा कि ऊपर बताया गया है, leave निर्देश mov और pop निर्देश निष्पादित करता है।

एक फ़ंक्शन में अनेक एपीलॉग हो सकते हैं। प्रत्येक फ़ंक्शन निकास बिंदु को या तो अंत में एक सामान्य एपीलॉग पर जाना चाहिए, या उसमें अपना स्वयं का एपीलॉग होना चाहिए। इसलिए, प्रोग्रामर या कंपाइलर अधिकांशतः इसके संयोजन leave और ret का उपयोग करते हैं किसी भी बिंदु पर फ़ंक्शन से बाहर निकलने के लिए। (उदाहरण के लिए, एक C कंपाइलर एक return स्टेटमेंट को leave/ret अनुक्रम के साथ प्रतिस्थापित करेगा)।

अग्रिम पठन

  • de Boyne Pollard, Jonathan (2010). "The gen on function perilogues". Frequently Given Answers.