कुछ प्रकार के स्टैक का उपयोग किए बिना फ़ंक्शन कॉल सिमेंटिक्स को लागू करना संभव नहीं है। केवल शब्द का खेल खेलना संभव है (उदाहरण के लिए इसके लिए एक अलग नाम का उपयोग करें, जैसे "FILO रिटर्न बफर")।
ऐसा कुछ उपयोग करना संभव है जो फ़ंक्शन कॉल सिमेंटिक्स को लागू नहीं करता है (जैसे निरंतर गुजर शैली, अभिनेता), और फिर इसके ऊपर फ़ंक्शन कॉल शब्दार्थ का निर्माण करें; लेकिन इसका मतलब यह है कि फ़ंक्शन के वापस आने पर नियंत्रण को ट्रैक करने के लिए किसी प्रकार की डेटा संरचना को जोड़ना, और यह कि डेटा संरचना एक प्रकार का स्टैक होगा (या एक अलग नाम / विवरण के साथ एक स्टैक)।
कल्पना कीजिए कि आपके पास कई कार्य हैं जो सभी एक दूसरे को कॉल कर सकते हैं। रन-टाइम पर, प्रत्येक फ़ंक्शन को पता होना चाहिए कि फ़ंक्शन से बाहर निकलने के लिए कहां वापस लौटना है। यदि आपके पास first
कॉल है second
तो आपके पास:
second returns to somewhere in first
फिर, यदि आपके पास second
कॉल third
है:
third returns to somewhere in second
second returns to somewhere in first
फिर, यदि आपके पास third
कॉल fourth
है:
fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first
जैसा कि प्रत्येक फ़ंक्शन को कहा जाता है, अधिक "कहां लौटना है" जानकारी को कहीं संग्रहीत किया जाना चाहिए।
यदि कोई फ़ंक्शन वापस आता है, तो इसकी "जहां लौटने के लिए" जानकारी का उपयोग किया जाता है और अब इसकी आवश्यकता नहीं है। उदाहरण के लिए, यदि fourth
कहीं वापस लौटा जाता है third
तो "कहाँ वापस लौटना है" की मात्रा बन जाएगी:
third returns to somewhere in second
second returns to somewhere in first
मूल रूप से; "फ़ंक्शन कॉल शब्दार्थ" का तात्पर्य है:
- आपके पास "कहाँ वापस लौटना है" जानकारी होनी चाहिए
- फ़ंक्शन के रूप में जानकारी की मात्रा बढ़ती है और फ़ंक्शन वापस आने पर कम हो जाती है
- संग्रहीत जानकारी "जहां वापस लौटना है" का पहला टुकड़ा "जहां वापस लौटने के लिए" जानकारी को छोड़ दिया गया, का अंतिम टुकड़ा होगा
यह एक FILO / LIFO बफर या स्टैक का वर्णन करता है।
यदि आप एक प्रकार के पेड़ का उपयोग करने का प्रयास करते हैं, तो पेड़ में प्रत्येक नोड में एक से अधिक बच्चे नहीं होंगे। नोट: कई बच्चों के साथ एक नोड केवल तभी हो सकता है जब कोई फ़ंक्शन एक ही समय में 2 या अधिक फ़ंक्शन कॉल करता है , जिसके लिए किसी प्रकार की संगामिति (उदाहरण के लिए थ्रेड, कांटा (), आदि) की आवश्यकता होती है और यह "फ़ंक्शन कॉल शब्दार्थ" नहीं होगा। यदि पेड़ में प्रत्येक नोड में एक से अधिक बच्चे नहीं होंगे; फिर उस "पेड़" का उपयोग केवल फिलो / लिफो बफर या स्टैक के रूप में किया जाएगा; और क्योंकि यह केवल एक फिलो / LIFO बफर या स्टैक के रूप में उपयोग किया जाता है, यह दावा करना उचित है कि "ट्री" एक स्टैक है (और केवल अंतर शब्द गेम और / या कार्यान्वयन विवरण है)।
वही किसी भी अन्य डेटा संरचना पर लागू होता है जो "फ़ंक्शन कॉल शब्दार्थ" को लागू करने के लिए बोधगम्य रूप से उपयोग किया जा सकता है - इसका उपयोग स्टैक के रूप में किया जाएगा (और अंतर केवल शब्द का खेल और / या कार्यान्वयन विवरण है); जब तक कि यह "फ़ंक्शन कॉल शब्दार्थ" को तोड़ न दे। नोट: यदि मैं कर सकता हूं तो मैं अन्य डेटा संरचनाओं के लिए उदाहरण प्रदान करूंगा, लेकिन मैं किसी भी अन्य संरचना के बारे में नहीं सोच सकता जो थोड़ा प्रशंसनीय है।
बेशक एक स्टैक कैसे लागू किया जाता है यह एक कार्यान्वयन विवरण है। यह मेमोरी का एक क्षेत्र हो सकता है (जहाँ आप "करंट स्टैक टॉप" का ट्रैक रखते हैं), यह किसी प्रकार की लिस्टेड लिस्ट हो सकती है (जहाँ आप "लिस्ट में मौजूद एंट्री" का ट्रैक रखते हैं), या इसे कुछ में लागू किया जा सकता है। अन्य रास्ता। यह भी कोई फर्क नहीं पड़ता कि हार्डवेयर में अंतर्निहित समर्थन है या नहीं।
नोट: यदि किसी भी प्रक्रिया का केवल एक ही आह्वान किसी भी समय सक्रिय हो सकता है; फिर आप "जहां वापस लौटने के लिए" जानकारी के लिए सांख्यिकीय रूप से स्थान आवंटित कर सकते हैं। यह अभी भी एक स्टैक है (उदाहरण के लिए एक FILO / LIFO रास्ते में प्रयुक्त सांख्यिकीय रूप से आवंटित प्रविष्टियों की एक लिंक की गई सूची)।
यह भी ध्यान दें कि कुछ चीजें हैं जो "फ़ंक्शन कॉल शब्दार्थ" का पालन नहीं करती हैं। इन चीजों में "संभावित रूप से बहुत अलग शब्दार्थ" (जैसे निरंतरता गुजरना, अभिनेता मॉडल) शामिल हैं; और समसामयिक एक्सटेंशन जैसे "फ़ंक्शन कॉल शब्दार्थ" को सम्मिलित करें (थ्रेड्स, फ़ाइबर, जो भी हो), setjmp
/ longjmp
, अपवाद हैंडलिंग, आदि शामिल हैं।