उपरोक्त उद्धरण सही है - संकलक आमतौर पर संकलन-समय पर स्थानीय चर के पते को नहीं जानता है। उस ने कहा, संकलक शायद स्टैक फ्रेम के आधार से ऑफ़सेट जानता है जिस पर एक स्थानीय चर स्थित होगा, लेकिन कॉल स्टैक की गहराई के आधार पर, जो रनटाइम पर एक अलग पते में अनुवाद कर सकता है। तो वहाँ
int Factorial(int num) {
int result;
if (num == 0)
result = 1;
else
result = num * Factorial(num - 1);
return result;
}
पैरामीटर num
के आधार पर, इस कोड को कई पुनरावर्ती कॉल करने के अंत सकता है,: एक उदाहरण के रूप में, यह पुनरावर्ती कोड पर विचार (जो, वैसे, किसी भी अच्छे कोड का मतलब नहीं कर रहा है!) स्मृति में result
की कई प्रतियां होंगी, प्रत्येक में एक अलग मूल्य होगा। नतीजतन, संकलक यह नहीं जान सकता कि वे कहां जाएंगे। हालांकि, result
का प्रत्येक उदाहरण शायद प्रत्येक Factorial
आमंत्रण वाले स्टैक फ्रेम के आधार से उसी राशि को ऑफ़सेट करेगा, हालांकि सिद्धांत में संकलक इस कोड को अनुकूलित करने जैसी अन्य चीजें कर सकता है ताकि result
की केवल एक प्रति हो।
आम तौर पर, कंपाइलर्स स्टैक फ्रेम के मॉडल को बनाए रखने और स्टैक फ्रेम में अगला खाली स्थान कहकर स्थानीय चर आवंटित करते हैं। इस तरह, स्थानीय वैरिएबल को स्टैक फ्रेम की शुरुआत के सापेक्ष आवंटित किया जा सकता है, और जब फ़ंक्शन को कहा जाता है कि स्टैक पते के संयोजन के साथ सापेक्ष पते का उपयोग किया जा सकता है, तो उस चर के स्थान को उस विशेष स्टैक फ्रेम में देखने के लिए ।
दूसरी ओर वैश्विक चर, उनके पते संकलन-समय पर ज्ञात हो सकते हैं। वे मुख्य रूप से स्थानीय लोगों से भिन्न होते हैं कि एक कार्यक्रम में हमेशा वैश्विक चर की एक प्रति होती है। निष्पादन कैसे चला जाता है इस पर निर्भर करता है कि स्थानीय चर 0 या अधिक बार मौजूद हो सकते हैं। इस तथ्य के परिणामस्वरूप कि वैश्विक की एक अनूठी प्रति है, संकलक इसके लिए एक पता हार्डकोड कर सकता है।
आगे पढ़ने के लिए के रूप में, आप कैसे एक संकलक चर बाहर रखना कर सकते हैं, तो आप Aho, लाम, सेठी, और उलमान द्वारा Compilers: Principles, Techniques, and Tools, Second Edition की एक प्रति लेने के लिए चाहते हो सकता है के एक काफी गहराई उपचार चाहते हैं तो । हालांकि इस पुस्तक में से अधिकांश पुस्तकें अन्य कंपाइलर निर्माण तकनीकों से संबंधित हैं, पुस्तक का एक बड़ा हिस्सा कोड जनरेशन और अनुकूलन को लागू करने के लिए समर्पित है जिसका उपयोग जेनरेट कोड को बेहतर बनाने के लिए किया जा सकता है।
आशा है कि इससे मदद मिलती है!
कुछ अर्थों में, ओएस को प्रोग्राम लोड करने तक एमएमयू में वर्चुअल मेमोरी मैपिंग सेट अप करने तक कोई पता नहीं पता है। कंपाइलर लेआउट जानता है, वह क्रम है जिसमें चीजें दिखाई देती हैं, लेकिन कुछ आधार पते से सब कुछ मापा जाता है। स्थिर भंडारण अवधि के लिए, यह बाइनरी के लोड पते से मापा जाता है। स्वचालित भंडारण अवधि के लिए, यह स्टैक सूचक से मापा जाता है। और गतिशील भंडारण में रन-टाइम पर निर्धारित पता होता है, लेकिन सदस्यों को गतिशील पते से ऑफसेट पर संग्रहीत किया जाता है। –
@ बेन: यह एक पूरी तरह से अलग मुद्दा है। –