कॉल स्टैक नीचे या ऊपर से शुरू होता है?


11

एक स्टैक कुछ ऐसा है जो बॉटम-अप को ढेर करता है।

इसलिए कॉल स्टैक स्टैक पर नए आइटम जोड़ता है जब फ़ंक्शन को स्टैक से हटाए जाने वाले आइटम के साथ कहा जाता है क्योंकि प्रत्येक फ़ंक्शन तब तक समाप्त होता है जब तक स्टैक खाली नहीं होता है और फिर प्रोग्राम समाप्त होता है।

यदि उपरोक्त सही है, तो लोग कॉल स्टैक "मूविंग" को नियंत्रित करने का संदर्भ क्यों देते हैं? जब तक यह नीचे तक नहीं पहुंचता तब तक कॉल स्टैक नीचे निश्चित रूप से नियंत्रित होता है।


जब कोई फ़ंक्शन कहा जाता है, तो स्टैक के शीर्ष पर एक आइटम जोड़ा जाता है, और उस फ़ंक्शन को नियंत्रण पास किया जाता है। इसलिए नियंत्रण स्टैक में अंतर्निहित वस्तु से ऊपर की ओर ऊपर की ओर बढ़ता है।
ट्रेकरोड

1
@greengit: एक्सप्रेशन "कॉल स्टैक" का उपयोग अपवादों के साथ किया जाता है, जहां नियंत्रण वास्तव में विपरीत तरीके से चलता है।
माइकल बोर्गवर्ड

@ मिचेल बोर्गवर्ड: आप सही हैं।
ट्रेकरोड

1
@MichaelBorgwardt: मैंने अभिव्यक्ति " कॉल स्टैक को स्थानांतरित करने में त्रुटि" देखी है । निश्चित रूप से यह गलत है।
CJ7

जवाबों:


9

इसके उपयोग के दो संभावित कारण हैं:

  • अपवादों के संदर्भ में, कॉलिंग फ़ंक्शन / विधि पर नियंत्रण चलता है, और यह कॉल पदानुक्रम आम तौर पर शीर्ष पर मुख्य विधि के साथ कल्पना की जाती है और विधि कॉलों में एक पदानुक्रम नीचे की ओर होता है, जिसमें घटते स्तर का सार होता है। इस पदानुक्रम में, एक अपवाद ऊपर की ओर बढ़ता है।

  • एक सामान्य x86 अनुप्रयोग में वास्तविक प्रोग्राम स्टैक उल्टा होता है, अर्थात यह नीचे की तरफ बढ़ता है। PUSH / PUSHW / PUSHD मशीन कोड निर्देश स्टैक पॉइंटर को कम करते हैं। अन्य आर्किटेक्चर इस मॉडल को साझा कर सकते हैं।


क्या नीचे-ऊपर शुरू होने वाली वस्तुओं के ढेर में "स्टैक" की रोजमर्रा की अवधारणा के विपरीत टॉप-डाउन विचार नहीं है?
CJ7

@ क्रेगज: तो यह तथ्य है कि स्टैक की सामग्री के प्रत्येक बाइट के बिट्स को अलग-अलग चिप्स में भौतिक रूप से संग्रहीत किया जाएगा। किसे पड़ी है?
माइकल बॉर्गवर्ड

1

यह सब शब्दों की परिभाषा पर निर्भर करता है; इस संदर्भ में "टॉप" और "बॉटम" शब्दों से आपका क्या तात्पर्य है, और ऑपरेटिंग सिस्टम या कंप्यूटर आर्किटेक्चर के कार्यान्वयन पर भी।

मुझे बहुत पहले से निम्नलिखित याद है, जब मैं कमोडोर 64 पर प्रोग्रामिंग कर रहा था। पता $ 0800 (2048) और $ 9FFF (40959) के बीच की मेमोरी बेसिक कार्यक्रमों के लिए आरक्षित थी। आपके BASIC प्रोग्राम का कोड निचले पते पर शुरू किया गया था ($ 0800, वहाँ से ऊपर की ओर बढ़ते हुए)। उप-वर्ग के वेरिएबल्स और रिटर्न पतों को संग्रहीत करने के लिए स्टैक, उस सीमा के शीर्ष ($ 9FFF) पर शुरू हुआ और निचले पतों की ओर बढ़ा। तो इस संदर्भ में स्टैक को नीचे की ओर बढ़ते हुए देखना तर्कसंगत था, और जब आप सबरूटीन से लौटते हैं तो सबरूटीन के स्टैक फ्रेम को स्टिक पॉइंटर को बढ़ाकर छोड़ दिया जाता था, ताकि आप कह सकें कि आप स्टैक को ऊपर ले जा रहे थे "जब एक सबरूटीन से लौटते हुए।

मुझे नहीं पता कि यह विंडोज या इंटेल x86 प्रोसेसर के उदाहरण के आधुनिक संस्करणों पर कैसे काम करता है। हो सकता है कि स्टैक दूसरे तरीके से काम करता है, यानी यह निचले से उच्च पते तक बढ़ता है। अगर ऐसा है तो आप शायद "टॉप", "बॉटम" और "अप", "डाउन" जैसे शब्दों का इस्तेमाल करेंगे।


0

फू (6, x + 1) जैसे किसी फ़ंक्शन को कॉल करने के लिए ...

  1. कॉलर के संदर्भ में वास्तविक पैरामीटर अभिव्यक्तियों का मूल्यांकन करें, जैसे कि x + 1।
  2. एक उद्देश्य के लिए समर्पित रनटाइम "कॉल स्टैक" पर स्मृति के एक उपयुक्त "स्थानीय ब्लॉक" को धक्का देकर फू () के स्थानीय लोगों के लिए स्मृति आवंटित करें। मापदंडों के लिए, लेकिन स्थानीय चर के लिए, चरण (1) से मानों को फू () के स्थानीय ब्लॉक में उचित स्लॉट में संग्रहीत न करें।
  3. निष्पादन के कॉलर के वर्तमान पते (इसके "रिटर्न एड्रेस") को स्टोर करें और निष्पादन को फू () में स्विच करें।
  4. foo () कॉल स्टैक के अंत में आसानी से उपलब्ध अपने स्थानीय ब्लॉक के साथ निष्पादित करता है।
  5. जब फू () समाप्त हो जाता है, तो यह स्टैक से अपने स्थानीय लोगों को पॉप करके बाहर निकलता है और पहले से संग्रहीत रिटर्न पते का उपयोग करके कॉलर को "रिटर्न" करता है। अब कॉलर के लोकल स्टैक के अंत में हैं और यह निष्पादन को फिर से शुरू कर सकता है।

संदर्भ:

http://cslibrary.stanford.edu/102/PointersAndMemory.pdf (p15)


ध्यान दें कि यह कॉलिंग कन्वेंशन के लिए अत्यधिक विशिष्ट है। कॉलिंग कन्वेंशन हैं जो कॉलर को साफ करते हैं, अधिकांश कम से कम कुछ रजिस्टरों का उपयोग करते हैं, आदि

0

यदि आप एक स्टैक को नीचे की चीज़ के रूप में देखते हैं, जैसे कि टेनिस गेंदों के साथ एक सिलेंडर में सामान्य गुरुत्वाकर्षण वास्तविकता के तहत तत्कालीन नियंत्रण को स्टैक ऊपर ले जाता है जैसा कि फ़ंक्शन कहा जाता है। जैसे ही कार्य पूरा हो जाता है, नियंत्रण स्टैक नीचे चला जाता है।

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

ये दोनों आपके सिर में सिर्फ मॉडल हैं और अनिवार्य रूप से पूरी तरह से मनमाने हैं। यदि आप चाहें तो इसे साइड से साइड की चीज़ के रूप में देख सकते हैं, लेकिन लोगों के साथ संवाद करने में परेशानी हो सकती है। मुझे व्यक्तिगत रूप से लगता है कि यदि A, B और B को C कहता है तो C स्टैक के नीचे है (उल्टा गुरुत्वाकर्षण वास्तविकता) और यदि C में कोई अपवाद होता है, तो आप उस अपवाद को "A" में बबल करना चाहते हैं, मुझे लगता है कि यह हो सकता है। अधिक सामान्य भाषा उपयोग क्योंकि भावना यह है कि सी नीचे गहरा है और ए शीर्ष है। पहला फ़ंक्शन अधिक सहज रूप से मेरे लिए सबसे ऊपर है और प्रत्येक कॉल पर फ़ंक्शन गहरा हो जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.