मैं प्रोग्रामिंग भाषाओं के लिए कार्यान्वयन तकनीकों में देख रहा हूं, और हाल ही में स्पेगेटी स्टैक में आया हूं, जो एक निरंतर गुजर शैली मॉडल (उदाहरण के लिए स्कीम और एसएमएल / एनजे में उनके उपयोग को देखते हुए) के लिए एक अच्छा फिट है । सरलता के लिए, आइए केवल इस प्रश्न के लिए एकल-थ्रेडेड प्रक्रियाओं पर विचार करें।
हालाँकि, मैं विकिपीडिया पर चित्र से थोड़ा भ्रमित हूँ ( अन्यत्र भी पाया जाता है )। विशेष रूप से, मुझे समझ नहीं आता कि ऐसी स्थिति कैसे पैदा हो सकती है। मैं केवल कल्पना कर सकता हूं कि ग्रे-आउट शाखाएं अगम्य हैं और कचरा एकत्र किया जाना चाहिए। दूसरी ओर, स्पेगेटी स्टैक का उपयोग करके सीपीएस को लागू करने के तरीके के बारे में मेरी अस्पष्ट समझ के साथ, मैं कल्पना नहीं कर सकता कि आप कभी भी उस संरचना में लूप कैसे प्राप्त कर सकते हैं। मुझे यह निष्कर्ष निकालना है कि, "पैरेंट-पॉइंटर ट्री" के बजाय, यह वास्तव में एक निर्देशित चक्रीय ग्राफ है, जिसमें कई गैर-कचरा स्रोत होते हैं, जैसे कि थ्रेड होते हैं, और जितने सिंक होते हैं (संभावित) "निकास बिंदु" होते हैं।
लेकिन इस कार्यान्वयन की मेरी समझ बहुत अस्पष्ट है, इसलिए मुझे लगता है कि मैं शायद कुछ याद कर रहा हूं। मुझे आशा है कि कोई व्यक्ति "स्पेगेटी कॉल स्टैक्स" पर मुझे यहां बता सकता है, जिसका अर्थ है कि सीपीएस-आधारित प्रक्रियाओं को लागू करने के लिए स्कीम और / या एसएमएल / एनजे में उपयोग किए गए डेटा संरचना।
निम्नलिखित स्पेगेटी कॉल स्टैक को देखते हुए:
[exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C]
जहां तक मैं समझता हूं, बी से कोई भी प्रवाह नियंत्रण या तो माता-पिता के लिए कूदकर स्टैक को अनइंस्टॉल करता है (ए सक्रिय हो जाता है, अगम्य बी अब कचरा है), या सबग्राफ द्वारा सक्रिय फ्रेम की जगह, केवल बी द्वारा रखे गए संदर्भों का उपयोग करके जुड़ा हुआ है / संदर्भ नए फ्रेम के लिए। निष्पादन सी को फ्रेम करने के लिए प्रवाहित नहीं हो सकता है, जिसका अर्थ यह होना चाहिए कि फ्रेम सी कचरा है।
पिछली स्थिति के बजाय, मुझे लगता है कि निम्नलिखित कचरा मुक्त स्थिति उत्पन्न हो सकती है:
[exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´
उदाहरण के लिए, मैं कल्पना कर सकता हूं कि फ्रेम Z कुछ निर्णय फ़ंक्शन से संबंधित है, जो या तो फ्रेम X या फ्रेम Y के साथ जारी रहता है (जिनमें से कोई भी W पर वापस आ जाएगा)। इसका मतलब यह है कि स्पेगेटी कॉल स्टैक "पैरेंट पॉइंटर ट्री " नहीं हैं।
हालाँकि, मैं किसी भी स्थिति की कल्पना नहीं कर सकता जहाँ एक लूप का निर्माण किया जा सके। उदाहरण के लिए, निम्न स्थिति लें:
[exit point] <-- ... <-- [frame P] --> [frame Q (active)] ^ | | v `---- [frame R]
मुझे पता है कि पुनरावर्ती बाइंडिंग एक चीज है, लेकिन मुझे बहुत संदेह है कि यह समझदार है। यदि Q को R पर लौटना है, तो Q को "खर्च" किया जाता है। यदि R को P पर लौटना है, और P केवल Q पर वापस नहीं लौट सकता है, क्योंकि पहले इसे फिर से स्थापित करने की आवश्यकता होगी। जैसे, छोरों असंगत राज्यों का कारण होगा। (जब तक, निश्चित रूप से, मैं इस डेटा संरचना के उद्देश्य को गलत समझता हूं, और आप केवल अपने वर्तमान फ्रेम के लिए टेम्पलेट के रूप में इसमें नोड्स का उपयोग करेंगे।)
इन टिप्पणियों से, मुझे यह निष्कर्ष निकालना होगा कि एक स्पेगेटी कॉल स्टैक (कचरा रहित) वास्तव में एक डीएजी है। क्या ये सही है? या क्या मैं इस डेटा संरचना के उद्देश्य को गलत समझ रहा हूं?
अपडेट:
मैंने निम्नलिखित पेपर की एक प्रति के माध्यम से स्किम्ड किया है :
ईए हक और बीए डेंट। 1968. बरोज़ 'B6500 / B7500 स्टैक तंत्र। में 30 अप्रैल की कार्यवाही - 2 मई, 1968, वसंत संयुक्त कंप्यूटर सम्मेलन (AFIPS '68 (स्प्रिंग))। एसीएम, न्यूयॉर्क, एनवाई, यूएसए, 245-251। DOI = http://dx.doi.org/10.1145/1468075.1468111
यह पेपर सुगरो स्टैक सिस्टम को परिभाषित करता है। जैसा कि यह पता चला है, यह सुगारो स्टैक सिस्टम एक पारंपरिक कॉल स्टैक है जो कई "नौकरियों" को आंशिक रूप से साझा स्टैक के फ्रेम के माध्यम से चलने की अनुमति देता है; यह निरंतरता से संबंधित नहीं है।
निम्नलिखित पत्र (और इसके 1996 साथी पेपर) स्पष्ट रूप से बताते हैं कि SML / NJ संकलक में क्या चल रहा है:
झोंग शाओ और एंड्रयू डब्ल्यू एपल। 2000. कुशल और सुरक्षित-फॉर-स्पेस क्लोजर रूपांतरण। एसीएम ट्रांस। कार्यक्रम। लैंग। Syst। 22, 1 (जनवरी 2000), 129-161। DOI = http://dx.doi.org/10.1145/345099.345125
मुझे लगता है कि मुझे इस प्रश्न के साथ कुछ और करने से पहले इस पेपर ( लेखक की वेबसाइट पर कॉपी ) को पढ़ना चाहिए । "सुरक्षित रूप से लिंक किए गए क्लोजर" अवधारणा सुगारो स्टैक सिस्टम के समान है, जिसमें यह हमेशा बहुत उथला होता है और केवल मुफ्त चर साझा करने का इरादा होता है:
हमारा नया क्लोजर-कन्वर्जन एल्गोरिथ्म सुरक्षित रूप से जुड़े क्लोजर (चित्रा 1 में 3 कॉलम) का उपयोग करता है जिसमें केवल फ़ंक्शन में वास्तव में आवश्यक चर होते हैं लेकिन एक ही जीवनकाल में एक चर रिकॉर्ड के साथ चर को समूह में बंद करके नकल से बचें । [...] लिंक किए गए क्लोजर के विपरीत, सुरक्षित रूप से जुड़े क्लोजर का नेस्टिंग स्तर कभी भी दो से अधिक नहीं होता है (क्लोजर के लिए एक परत, अलग-अलग जीवन समय के रिकॉर्ड के लिए एक और) ताकि वे अभी भी बहुत तेजी से परिवर्तनीय एक्सेस समय का आनंद लें।
कागज में यह भी स्पष्ट रूप से उल्लेख किया गया है कि यह "किसी रनटाइम स्टैक" का उपयोग नहीं करता है:
इसके बजाय, हम सभी सक्रियण रिकॉर्डों को निरंतरता के कार्यों के लिए बंद के रूप में मानते हैं और उन्हें ढेर में रजिस्टरों में आवंटित करते हैं।
मुझे लगता है कि मैंने विकिपीडिया लेख को गलत समझा और / या गलत तरीके से पढ़ा, क्योंकि प्रवाह नियंत्रण के लिए स्पेगेटी स्टैक्स का उपयोग नहीं किया जाता है। हालांकि, एपेल और शाओ द्वारा पत्रों को सावधानीपूर्वक पढ़ने के बाद, मैं शायद "स्पेगेटी कॉल स्टैक" (जो कि स्पष्ट रूप से कोई बात नहीं है) के बजाय क्लोजर की निर्भरता ग्राफ के संदर्भ में प्रश्न को शांत कर सकता है।