जवाबों:
स्टैक फ्रेम डेटा का एक फ्रेम है जो स्टैक पर धकेल दिया जाता है। कॉल स्टैक के मामले में, एक स्टैक फ्रेम एक फ़ंक्शन कॉल और उसके तर्क डेटा का प्रतिनिधित्व करेगा।
यदि मुझे सही ढंग से याद है, तो फ़ंक्शन रिटर्न पता पहले स्टैक पर धकेल दिया जाता है, फिर स्थानीय चर के लिए तर्क और स्थान। साथ में, वे "फ्रेम" बनाते हैं, हालांकि यह संभावना वास्तुकला-निर्भर है। प्रोसेसर जानता है कि प्रत्येक फ्रेम में कितने बाइट्स हैं और स्टैक पॉइंटर को उसी हिसाब से आगे बढ़ाता है क्योंकि फ्रेम को धक्का दिया जाता है और स्टैक को पॉप किया जाता है।
उच्च-स्तरीय कॉल स्टैक और प्रोसेसर के कॉल स्टैक के बीच एक बड़ा अंतर है।
जब हम प्रोसेसर के कॉल स्टैक के बारे में बात करते हैं, तो हम असेंबली या मशीन कोड में बाइट / वर्ड स्तर पर पते और मूल्यों के साथ काम करने के बारे में बात कर रहे हैं । उच्च-स्तरीय भाषाओं के बारे में बात करते समय "कॉल स्टैक्स" होते हैं, लेकिन वे रनटाइम वातावरण द्वारा प्रबंधित डिबगिंग / रनटाइम टूल होते हैं ताकि आप लॉग कर सकें कि आपके प्रोग्राम में क्या गलती हुई (उच्च स्तर पर)। इस स्तर पर, लाइन नंबर और विधि और वर्ग नाम जैसी चीजें अक्सर ज्ञात होती हैं। जब तक प्रोसेसर को कोड मिलता है, तब तक उसके पास इन चीजों की कोई अवधारणा नहीं होती है।
यदि आप स्टैक को बहुत अच्छी तरह से समझते हैं तो आप समझ पाएंगे कि मेमोरी प्रोग्राम में कैसे काम करती है और यदि आप समझते हैं कि प्रोग्राम में मेमोरी कैसे काम करती है तो आप समझेंगे कि प्रोग्राम में कैसे काम करता है और यदि आप समझते हैं कि प्रोग्राम में फ़ंक्शन स्टोर कैसे होता है, तो आप समझ पाएंगे कि रिकर्सिव फंक्शन कैसे काम करता है और यदि आप समझते हैं कि पुनरावर्ती कार्य कैसे काम करता है आप समझेंगे कि संकलक कैसे काम करता है और यदि आप समझते हैं कि संकलक कैसे काम करता है तो आपका दिमाग संकलक के रूप में काम करेगा और आप किसी भी कार्यक्रम को बहुत आसानी से डीबग करेंगे
मुझे समझाएं कि स्टैक कैसे काम करता है:
पहले आपको यह जानना होगा कि स्टैक में कार्यों का प्रतिनिधित्व कैसे किया जाता है:
हीप गतिशील रूप से आवंटित मूल्यों को संग्रहीत करता है।
स्टैक स्वचालित आवंटन और विलोपन मूल्यों को संग्रहीत करता है।
आइए उदाहरण के साथ समझते हैं:
def hello(x):
if x==1:
return "op"
else:
u=1
e=12
s=hello(x-1)
e+=1
print(s)
print(x)
u+=1
return e
hello(4)
अब इस कार्यक्रम के कुछ हिस्सों को समझें:
अब देखते हैं कि स्टैक क्या है और स्टैक पार्ट्स क्या हैं:
स्टैक का आवंटन:
एक बात याद रखें: यदि किसी भी फ़ंक्शन की वापसी की स्थिति संतुष्ट हो जाती है, तो कोई बात नहीं है कि उसने स्थानीय चर को लोड किया है या नहीं, यह तुरंत स्टैक से वापस आ जाएगा स्टैक फ्रेम के साथ। इसका मतलब यह है कि जब भी किसी भी पुनरावर्ती कार्य को आधार की स्थिति मिलती है और हम आधार की स्थिति के बाद वापसी करते हैं, तो आधार स्थिति स्थानीय चर को लोड करने के लिए इंतजार नहीं करेगी जो कार्यक्रम के "और" भाग में स्थित हैं। यह स्टैक से वर्तमान फ्रेम को तुरंत वापस कर देगा जिसके बाद अगला फ्रेम अब सक्रियण रिकॉर्ड में है।
व्यवहार में इसे देखें:
ब्लॉक का निपटान:
इसलिए अब जब भी कोई फ़ंक्शन रिटर्न स्टेटमेंट का सामना करता है, तो यह स्टैक से वर्तमान फ्रेम को हटा देता है।
स्टैक से लौटते समय, मूल्यों को मूल क्रम के विपरीत वापस आ जाएगा जिसमें उन्हें स्टैक में आवंटित किया गया था।
hello()
पुनरावर्ती रूप से कहा जाता है hello()
जो तब (फिर से) पुनरावर्ती रूप से कहा जाता है hello()
, और वैश्विक फ्रेम मूल कार्य है जिसे पहला कहा जाता है hello()
?
एक त्वरित लपेटो। हो सकता है कि किसी का बेहतर स्पष्टीकरण हो।
एक कॉल स्टैक 1 या कई कई स्टैक फ़्रेम से बना होता है। प्रत्येक स्टैक फ्रेम एक फ़ंक्शन या प्रक्रिया के लिए कॉल से मेल खाती है जिसे अभी तक रिटर्न के साथ समाप्त नहीं किया गया है।
स्टैक फ्रेम का उपयोग करने के लिए, एक थ्रेड दो पॉइंटर्स रखता है, एक को स्टैक पॉइंटर (SP) कहा जाता है, और दूसरे को फ़्रेम पॉइंटर (FP) कहा जाता है। एसपी हमेशा स्टैक के "टॉप" की ओर इशारा करता है, और एफपी हमेशा फ्रेम के "टॉप" की ओर इशारा करता है। इसके अतिरिक्त, थ्रेड एक प्रोग्राम काउंटर (पीसी) भी रखता है जो निष्पादित होने वाले अगले निर्देश को इंगित करता है।
निम्नलिखित स्टैक पर संग्रहीत हैं: स्थानीय चर और अस्थायी, वर्तमान अनुदेश के वास्तविक पैरामीटर (प्रक्रिया, कार्य, आदि)
स्टैक की सफाई के संबंध में अलग-अलग कॉलिंग कन्वेंशन हैं।
"एक कॉल स्टैक स्टैक फ्रेम से बना है ..." - विकिपीडिया
स्टैक फ्रेम एक ऐसी चीज है जिसे आप स्टैक पर रखते हैं। वे डेटा संरचनाएं हैं जिनमें कॉल करने के लिए सबरूटीन्स के बारे में जानकारी होती है।
प्रोग्रामर के पास स्टैक फ्रेम के बारे में प्रश्न हो सकते हैं जो एक व्यापक शब्द में नहीं है (यह स्टैक में एक एकल इकाई है जो केवल एक फ़ंक्शन कॉल प्रदान करता है और रिटर्न एड्रेस, दलीलें और स्थानीय चर रखता है) लेकिन एक संकीर्ण अर्थ में - जब शब्द stack frames
में उल्लेख किया गया है संकलक विकल्पों का संदर्भ।
प्रश्न के लेखक का मतलब है या नहीं, लेकिन संकलक विकल्पों के पहलू से एक स्टैक फ्रेम की अवधारणा एक बहुत महत्वपूर्ण मुद्दा है, यहां अन्य उत्तरों द्वारा कवर नहीं किया गया है।
उदाहरण के लिए, Microsoft Visual Studio 2015 C / C ++ कंपाइलर के पास निम्नलिखित विकल्प हैं stack frames
:
GCC निम्नलिखित है:
Intel C ++ कंपाइलर में निम्नलिखित हैं:
जिसका निम्नलिखित उपनाम है:
डेल्फी में निम्नलिखित कमांड-लाइन विकल्प है:
उस विशिष्ट अर्थ में, संकलक के दृष्टिकोण से, एक स्टैक फ्रेम रूटीन के लिए केवल प्रविष्टि और निकास कोड है , जो एक एंकर को स्टैक में धकेलता है - जिसका उपयोग डिबगिंग के लिए और अपवाद हैंडलिंग के लिए भी किया जा सकता है। डिबगिंग टूल स्टैक डेटा को स्कैन कर सकते हैं और इन एंकर्स का उपयोग बैकट्रॉस्टिंग के लिए करते हैं, जबकि call sites
स्टैक में पता लगाने के लिए, अर्थात् कार्यों के नामों को प्रदर्शित करने के लिए उन्हें पदानुक्रम कहा जाता है। इंटेल वास्तुकला के लिए, यह है push ebp; mov ebp, esp
या enter
प्रवेश और के लिए mov esp, ebp; pop ebp
या leave
बाहर निकलने के लिए।
इसीलिए प्रोग्रामर के लिए यह समझना बहुत जरूरी है कि कंपाइलर ऑप्शन में स्टैक फ्रेम क्या होता है - क्योंकि कंपाइलर इस कोड को जेनरेट करने के लिए कंट्रोल कर सकता है या नहीं।
कुछ मामलों में, स्टैक फ्रेम (रूटीन के लिए प्रवेश और निकास कोड) को कंपाइलर द्वारा छोड़ा जा सकता है, और चर को सीधे आधार पॉइंटर (बीपी /) के बजाय स्टैक पॉइंटर (एसपी / ईएसपी / आरएसपी) के माध्यम से एक्सेस किया जाएगा। ईएसपी / आरएसपी)। उदाहरण के लिए, स्टैक फ्रेम की चूक के लिए शर्तें:
स्टैक फ्रेम (रूटीन के लिए प्रवेश और निकास कोड) को कोड को छोटा और तेज बनाया जा सकता है, लेकिन यह डिबगर्स की डेटा को स्टैक में डेटा को वापस करने और प्रोग्रामर को प्रदर्शित करने की क्षमता को नकारात्मक रूप से प्रभावित कर सकता है। ये संकलक विकल्प हैं जो निर्धारित करते हैं कि किन परिस्थितियों में एक फ़ंक्शन में प्रवेश और निकास कोड होना चाहिए, उदाहरण के लिए: (ए) हमेशा, (बी) कभी नहीं, (सी) जब आवश्यक हो (शर्तों को निर्दिष्ट करते हुए)।
स्टैक फ्रेम एक फ़ंक्शन कॉल से संबंधित पैक की गई जानकारी है। इस जानकारी में आम तौर पर वें फ़ंक्शन, स्थानीय चर और जहां समापन पर वापस लौटना तर्क शामिल हैं। सक्रियण रिकॉर्ड स्टैक फ्रेम का दूसरा नाम है। स्टैक फ्रेम का लेआउट निर्माता द्वारा एबीआई में निर्धारित किया गया है और आईएसए का समर्थन करने वाले प्रत्येक कंपाइलर को इस मानक के अनुरूप होना चाहिए, हालांकि लेआउट योजना कंपाइलर पर निर्भर हो सकती है। आमतौर पर स्टैक फ्रेम का आकार सीमित नहीं होता है, लेकिन सिस्टम कॉल ... आदि को स्टैक फ्रेम के साथ हस्तक्षेप किए बिना निष्पादित करने की अनुमति देने के लिए "लाल / संरक्षित क्षेत्र" नामक एक अवधारणा है।
हमेशा एक एसपी होता है लेकिन कुछ एबीआई (एआरएम और पावरपीसी उदाहरण के लिए) पर एफपी वैकल्पिक है। स्टैक पर रखे जाने वाले तर्क को केवल एसपी का उपयोग करके ऑफसेट किया जा सकता है। फ़ंक्शन कॉल के लिए स्टैक फ़्रेम उत्पन्न होता है या नहीं, यह प्रकार और तर्कों की संख्या, स्थानीय चर और स्थानीय चर कैसे आम तौर पर एक्सेस किया जाता है पर निर्भर करता है। अधिकांश आईएसएएस पर, पहले, रजिस्टरों का उपयोग किया जाता है और यदि रजिस्टरों की तुलना में अधिक तर्क होते हैं, तो वे उन तर्कों को पारित करने के लिए समर्पित होते हैं, जिन्हें स्टैक पर रखा जाता है (उदाहरण के लिए x86 ABI में पूर्णांक तर्क पास करने के लिए 6 रजिस्टर हैं)। इसलिए, कभी-कभी, कुछ कार्यों को स्टैक पर रखने के लिए स्टैक फ्रेम की आवश्यकता नहीं होती है, बस रिटर्न एड्रेस को स्टैक पर धकेल दिया जाता है।