मैं यह समझने की कोशिश कर रहा हूं कि प्रोग्रामिंग भाषाओं के निम्न स्तर के संचालन कैसे काम करते हैं और विशेष रूप से वे ओएस / सीपीयू के साथ कैसे बातचीत करते हैं। मैंने शायद स्टैक ओवरफ्लो पर यहां हर स्टैक / हीप संबंधित धागे में हर उत्तर पढ़ा है, और वे सभी शानदार हैं। लेकिन अभी भी एक बात है जो मुझे अभी तक पूरी तरह से समझ नहीं आई है।
छद्म कोड में इस फ़ंक्शन पर विचार करें जो मान्य रस्ट कोड हो ;-)
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(a, b);
doAnotherThing(c, d);
}
इस तरह से मैं लाइन एक्स की तरह दिखने के लिए स्टैक मान लेता हूं:
Stack
a +-------------+
| 1 |
b +-------------+
| 2 |
c +-------------+
| 3 |
d +-------------+
| 4 |
+-------------+
अब, सब कुछ मैंने पढ़ा है कि स्टैक कैसे काम करता है, यह सख्ती से LIFO नियमों का पालन करता है (अंतिम में, पहले बाहर)। .NET, जावा या किसी अन्य प्रोग्रामिंग भाषा में स्टैक डेटाटाइप की तरह।
लेकिन अगर ऐसा है, तो लाइन X के बाद क्या होगा? क्योंकि जाहिर है, अगली बात हम जरूरत के साथ काम करने के लिए है a
और b
, लेकिन इसका मतलब यह होगा कि कि OS / सीपीयू (?) पॉप आउट करना है d
और c
पहले करने के लिए वापस पाने के लिए a
और b
। लेकिन तब यह खुद को पैर में गोली मार लेता था, क्योंकि इसकी जरूरत होती है c
और d
अगली पंक्ति में।
तो, मुझे आश्चर्य है कि वास्तव में पर्दे के पीछे क्या होता है?
एक और संबंधित प्रश्न। विचार करें कि हम इस तरह के अन्य कार्यों में से एक का संदर्भ देते हैं:
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(&a, &b);
doAnotherThing(c, d);
}
मैं चीजों को कैसे समझता हूं, इसका मतलब यह होगा कि पैरामीटर doSomething
अनिवार्य रूप से उसी मेमोरी पते की ओर इशारा कर रहे हैं जैसे कि a
और b
अंदर foo
। लेकिन तब फिर से इसका मतलब है कि स्टैक तकa
b
कोई पॉप नहीं है, जब तक हम नहीं होते हैं और हो रहे हैं।
उन दो मामलों से मुझे लगता है कि मैंने पूरी तरह से समझा नहीं है कि स्टैक कैसे काम करता है और यह कैसे पूरी तरह से LIFO नियमों का पालन करता है।
LIFO
इसका मतलब है कि आप केवल स्टैक के अंत में तत्वों को जोड़ या हटा सकते हैं, और आप किसी भी तत्व को हमेशा पढ़ / बदल सकते हैं।