स्टैक ओरिएंटेड प्रोग्रामिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{Short description|Programming paradigm that relies on a stack machine model}} | {{Short description|Programming paradigm that relies on a stack machine model}} | ||
ढेर-उन्मुख प्रोग्रामिंग, एक [[प्रोग्रामिंग प्रतिमान]] है जो पासिंग [[ पारसिगर |पारसिगर]] के लिए [[ ढेर मशीन |ढेर मशीन]] मॉडल पर निर्भर करता है। ढेर-उन्मुख भाषाएं एक या एक से अधिक स्टैक ([[डेटा संरचना)]] पर काम करती हैं, जिनमें से प्रत्येक एक | ढेर-उन्मुख प्रोग्रामिंग, एक [[प्रोग्रामिंग प्रतिमान]] है जो पासिंग [[ पारसिगर |पारसिगर]] के लिए [[ ढेर मशीन |ढेर मशीन]] मॉडल पर निर्भर करता है। ढेर-उन्मुख भाषाएं एक या एक से अधिक स्टैक ([[डेटा संरचना)]] पर काम करती हैं, जिनमें से प्रत्येक एक भिन्न उद्देश्य को पूरा कर सकता है। अन्य प्रोग्रामिंग भाषाओं में प्रोग्रामिंग निर्माण को ढेर-उन्मुख प्रणाली में उपयोग के लिए संशोधित करने की आवश्यकता है।<ref>Luerweg, T. (2015). Stack based programming paradigms. Concepts of Programming Languages–CoPL’15, 33.</ref> कुछ ढेर-उन्मुख भाषाएं पोस्टफिक्स या [[रिवर्स पोलिश नोटेशन]] में काम करती हैं। किसी कमांड के लिए कोई भी तर्क या पैरामीटर उस कमांड से पहले बताए जाते है। उदाहरण के लिए, पोस्टफिक्स नोटेशन {{nowrap|<code>2, 3, multiply</code>}} के अतिरिक्त {{nowrap|<code>multiply, 2, 3</code>}} (उपसर्ग या पोलिश संकेतन), या {{nowrap|<code>2 multiply 3</code>}} (इन्फ़िक्स संकेतन) लिखा जाता है। प्रोग्रामिंग भाषा [[ फोर्थ (प्रोग्रामिंग भाषा) |फोर्थ (प्रोग्रामिंग भाषा)]], [[ कारक (प्रोग्रामिंग भाषा) |कारक (प्रोग्रामिंग भाषा)]], [[ आरपीएल (प्रोग्रामिंग भाषा) |आरपीएल (प्रोग्रामिंग भाषा)]], [[ परिशिष्ट भाग |परिशिष्ट भाग]], [[बिबटेक्स]] स्टाइल डिज़ाइन भाषा<ref>{{citation|author=Oren Patashnik |title=Designing BibTeX styles |url=http://www.ctan.org/tex-archive/info/biblio/bibtex/contrib/doc/btxhak.pdf}}{{dead link|date=April 2019}}</ref> और कई कोडांतरण भाषाएं इस प्रतिमान को फिट करती हैं। | ||
[[स्टैक]] आधारित एल्गोरिथ्म [[आंकड़ों]] के एक भाग का उपयोग स्टैक के ऊपर से करते हुए तथा स्टैक के ऊपर वापस डेटा को लौटाते हुए डेटा के बारे में विचार करते हैं। स्टैक प्रकलन ऑपरेटरों की आवश्यकता, स्टैक को डेटा में प्रकलन करने की अनुमति देता है। किसी कथन के प्रभाव पर बल देने के लिए, कथन के पहले और | [[स्टैक]] आधारित एल्गोरिथ्म [[आंकड़ों]] के एक भाग का उपयोग स्टैक के ऊपर से करते हुए तथा स्टैक के ऊपर वापस डेटा को लौटाते हुए डेटा के बारे में विचार करते हैं। स्टैक प्रकलन ऑपरेटरों की आवश्यकता, स्टैक को डेटा में प्रकलन करने की अनुमति देता है। किसी कथन के प्रभाव पर बल देने के लिए, कथन के पहले और पश्चात में ढेर के शीर्ष को दिखाते हुए एक टिप्पणी का उपयोग किया जाता है। इसे स्टैक प्रभाव आरेख के रूप में जाना जाता है। | ||
पोस्टस्क्रिप्ट स्टैक अतिरिक्त उद्देश्यों के लिए | पोस्टस्क्रिप्ट स्टैक अतिरिक्त उद्देश्यों के लिए भिन्न-भिन्न स्टैक पर विचार करते हैं। यह चर, शब्दकोशों, प्रक्रियाओं, कुछ विशिष्ट प्रक्रियाओं की शारीरिक रचना, नियंत्रण और प्रवाह पर विचार करता है। [[भाषा मॉडल]] का विश्लेषण अभिव्यक्तियों और प्रोग्रामों को सरल और सैद्धांतिक रूप से व्याख्या करने की अनुमति देता है। | ||
== ढेर-आधारित कलन विधि == | == ढेर-आधारित कलन विधि == | ||
पोस्टस्क्रिप्ट पोस्टफिक्स स्टैक-आधारित भाषा का एक उदाहरण है। इस भाषा में एक अभिव्यक्ति {{nowrap|<code>2 3 mul</code>}} उदाहरण है । अभिव्यक्ति की गणना में यह समझना | पोस्टस्क्रिप्ट पोस्टफिक्स स्टैक-आधारित भाषा का एक उदाहरण है। इस भाषा में एक अभिव्यक्ति {{nowrap|<code>2 3 mul</code>}} उदाहरण है । अभिव्यक्ति की गणना में यह समझना सम्मलित है कि ढेर-आधारित कैसे काम करता है। | ||
ढेर-आधारित को निम्नलिखित कन्वेयर बेल्ट सादृश्य के रूप में प्रस्तुत किया जा सकता है। एक कन्वेयर बेल्ट (इनपुट) के अंत में, प्लेटें चिह्नित होती हैं जिन्हें <code>2</code>, <code>3</code>, और <code>mul</code> के अनुक्रम में रखा गया है। कन्वेयर के अंत में प्लेट (<code>2</code>) लिया जा सकता है, | ढेर-आधारित को निम्नलिखित कन्वेयर बेल्ट सादृश्य के रूप में प्रस्तुत किया जा सकता है। एक कन्वेयर बेल्ट (इनपुट) के अंत में, प्लेटें चिह्नित होती हैं जिन्हें <code>2</code>, <code>3</code>, और <code>mul</code> के अनुक्रम में रखा गया है। कन्वेयर के अंत में प्लेट (<code>2</code>) लिया जा सकता है, चूंकि अन्य प्लेटों को तब तक उपयोग नहीं किया जा सकता है जब तक कि अंत में प्लेट को हटा नहीं दिया जाये, प्लेटों को सिर्फ एक स्टैक में संग्रहीत किया जा सकता है, और इसे सिर्फ स्टैक से जोड़ा या हटाया जा सकता है, तथा इसे मध्य या नीचे से हटाया नहीं जा सकता है। खाली प्लेटों (और एक मार्कर) की आपूर्ति की जा सकती है और प्लेटों को स्थायी रूप से छोड़ दिया जा सकता है। | ||
[[File:Human stack.svg|220px]] | [[File:Human stack.svg|220px]] | ||
Line 15: | Line 15: | ||
प्लेट <code>2</code> लीजिए और इसे स्टैक पर रख दीजिए, फिर प्लेट <code>3</code> लीजिए और स्टैक पर रख दीजिए, इसके बाद <code>mul</code> प्लेट लें, यह निष्पादन करने का एक निर्देश है। फिर, शीर्ष दो प्लेटों को ढेर से हटा दें, उनके लेबल (<code>2</code> और <code>3</code>) को गुणा करें, और परिणाम (<code>6</code>) को एक नई प्लेट पर लिखें, दो पुरानी प्लेट (<code>2</code> और <code>3</code>) और प्लेट <code>mul</code> को त्याग दें, और नई प्लेट को ढेर पर रख दिया जाता है, कन्वेयर पर कोई और प्लेट नहीं रहने के कारण, गणना (<code>6</code>) का परिणाम स्टैक के ऊपर प्लेट पर दिखाया गया है। | प्लेट <code>2</code> लीजिए और इसे स्टैक पर रख दीजिए, फिर प्लेट <code>3</code> लीजिए और स्टैक पर रख दीजिए, इसके बाद <code>mul</code> प्लेट लें, यह निष्पादन करने का एक निर्देश है। फिर, शीर्ष दो प्लेटों को ढेर से हटा दें, उनके लेबल (<code>2</code> और <code>3</code>) को गुणा करें, और परिणाम (<code>6</code>) को एक नई प्लेट पर लिखें, दो पुरानी प्लेट (<code>2</code> और <code>3</code>) और प्लेट <code>mul</code> को त्याग दें, और नई प्लेट को ढेर पर रख दिया जाता है, कन्वेयर पर कोई और प्लेट नहीं रहने के कारण, गणना (<code>6</code>) का परिणाम स्टैक के ऊपर प्लेट पर दिखाया गया है। | ||
यह एक बहुत ही सरल गणना है, क्या होगा | यह एक बहुत ही सरल गणना है, क्या होगा यदि एक अधिक जटिल गणना की आवश्यकता है, जैसे {{nowrap|<code>(2 + 3) × 11 + 1</code>}}? यदि यह पहली बार पोस्टफिक्स रूप में लिखा गया है, तो अर्थात्, {{nowrap|<code>2 3 add 11 mul 1 add</code>}}, गणना बिल्कुल उसी प्रकार से की जा सकती है और सही परिणाम प्राप्त किया जा सकता है। गणना के चरण नीचे दी गई तालिका में दिखाए गए हैं। प्रत्येक कॉलम एक इनपुट तत्व (कन्वेयर के अंत में प्लेट) और उस इनपुट को संसाधित करने के बाद स्टैक की सामग्री दिखाता है। | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Line 38: | Line 38: | ||
सभी इनपुट को संसाधित करने के बाद, स्टैक में <code>56</code> होते हैं, जो उत्तर है। | सभी इनपुट को संसाधित करने के बाद, स्टैक में <code>56</code> होते हैं, जो उत्तर है। | ||
इससे, निम्नलिखित का निष्कर्ष निकाला जा सकता है: एक ढेर-आधारित प्रोग्रामिंग भाषा में डेटा को संभालने का | इससे, निम्नलिखित का निष्कर्ष निकाला जा सकता है: एक ढेर-आधारित प्रोग्रामिंग भाषा में डेटा को संभालने का सिर्फ एक ही तरीका होता है, स्टैक के ऊपर डेटा का एक टुकड़ा, जिसे पॉपिंग कहा जाता है, और डेटा को स्टैक के ऊपर वापस डाल दिया जाता है, जिसे पुशिंग कहा जाता है। कोई भी अभिव्यक्ति जिसे पारंपरिक रूप से, या किसी अन्य प्रोग्रामिंग भाषा में लिखा जा सकता है, पोस्टफिक्स (या उपसर्ग) रूप में लिखा जा सकता है और इस प्रकार एक स्टैक-उन्मुख भाषा द्वारा व्याख्या किए जाने के लिए उत्तरदायी हो सकता है। | ||
== स्टैक प्रकलन == | == स्टैक प्रकलन == | ||
चूंकि स्टैक ढेर-उन्मुख भाषा में डेटा प्रकलन करने का महत्वपूर्ण साधन है, इसलिए ऐसी भाषाएं | चूंकि स्टैक ढेर-उन्मुख भाषा में डेटा प्रकलन करने का महत्वपूर्ण साधन है, इसलिए ऐसी भाषाएं अधिकांशतः स्टैक प्रकलन ऑपरेटरों को कुछ प्रकार के स्टैक प्रकलन प्रदान करती हैं। सामान्यतः ये प्रदान किए जाते हैं <code>dup</code>, ढेर के ऊपर तत्व को डुप्लिकेट करने के लिए, <code>exch</code> (या <code>swap</code>), स्टैक के ऊपर तत्वों का आदान -प्रदान करने के लिए (पहला दूसरा बन जाता है और दूसरा पहले बन जाता है), <code>roll</code>, स्टैक में या स्टैक के भाग में चक्रीय रूप से अनुमति देने के लिए, <code>pop</code> (या <code>drop</code>), स्टैक के ऊपर तत्व को त्यागने के लिए (पुशिंग निहित है), और यह अन्य अध्ययन प्रक्रियाओं में महत्वपूर्ण बन जाते हैं। | ||
== स्टैक प्रभाव आरेख == | == स्टैक प्रभाव आरेख == | ||
कथन के प्रभाव को समझने के लिए एक सहायता के रूप में, एक छोटी टिप्पणी का उपयोग बयान से पहले और | कथन के प्रभाव को समझने के लिए एक सहायता के रूप में, एक छोटी टिप्पणी का उपयोग बयान से पहले और पश्चात में स्टैक के शीर्ष को दिखाते हुए किया जाता है, यदि कई मद हैं तो स्टैक का शीर्ष सबसे सही है। यह संकेतन सामान्यतः अगली भाषा में उपयोग किया जाता है, जहां टिप्पणियां कोष्ठक में संलग्न हैं। | ||
<syntaxhighlight lang="forth">( before -- after )</syntaxhighlight> | <syntaxhighlight lang="forth">( before -- after )</syntaxhighlight> | ||
Line 59: | Line 59: | ||
<syntaxhighlight lang="forth">fib ( n -- n' )</syntaxhighlight> | <syntaxhighlight lang="forth">fib ( n -- n' )</syntaxhighlight> | ||
यह [[होरे तर्क]] में पूर्व शर्त और पश्च [[शर्त लगाने]] के बराबर है। | यह [[होरे तर्क]] में पूर्व शर्त और पश्च [[शर्त लगाने]] के बराबर है। आवश्यक नहीं कि यह स्टैक-आधारित भाषाओं के संदर्भ में हो, दोनों टिप्पणियों को अभिकथन के रूप में भी संदर्भित किया जा सकता है। | ||
== पोस्टस्क्रिप्ट स्टैक == | == पोस्टस्क्रिप्ट स्टैक == | ||
पोस्टस्क्रिप्ट और कुछ अन्य स्टैक भाषाओं में अन्य उद्देश्यों के लिए अन्य | पोस्टस्क्रिप्ट और कुछ अन्य स्टैक भाषाओं में अन्य उद्देश्यों के लिए अन्य भिन्न -भिन्न स्टैक हैं। | ||
=== चर और शब्दकोश === | === चर और शब्दकोश === | ||
विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका है। चर का कार्यान्वयन किसी भी प्रोग्रामिंग भाषा के लिए महत्वपूर्ण है, लेकिन स्टैक-उन्मुख भाषाओं के लिए यह विशेष चिंता का विषय है, क्योंकि डेटा के साथ बातचीत करने का | विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका है। चर का कार्यान्वयन किसी भी प्रोग्रामिंग भाषा के लिए महत्वपूर्ण है, लेकिन स्टैक-उन्मुख भाषाओं के लिए यह विशेष चिंता का विषय है, क्योंकि डेटा के साथ बातचीत करने का सिर्फ एक ही तरीका है। | ||
चर को स्टैक ओरिएंटेड भाषाओं जैसे कि पोस्ट-स्क्रिप्ट में जिस प्रकार कार्यान्वित किया जाता है, उसमें एक | चर को स्टैक ओरिएंटेड भाषाओं जैसे कि पोस्ट-स्क्रिप्ट में जिस प्रकार कार्यान्वित किया जाता है, उसमें एक भिन्न, विशिष्ट स्टैक होता है जिसमें मुख्य मूल्य जोड़े के शब्द होते हैं। एक चर बनाने के लिए, एक कुंजी (चर का नाम) पहले बनाई जानी चाहिए, जिसके साथ एक मान जुड़ा हुआ है। पोस्टस्क्रिप्ट में, एक नाम डेटा ऑब्जेक्ट <code>/</code> के साथ प्रीफ़िक्स्ड होता है, इसलिए <code>/x</code> एक नाम डेटा ऑब्जेक्ट होता है जिसे उदाहरण के लिए संख्या <code>42</code> से जोड़ा जा सकता है। <code>define</code> आदेश <code>def</code>है, इसलिए <code>/x 42 def</code> स्टैक के ऊपर शब्दकोश में नंबर <code>42</code> के साथ नाम <code>x</code> के साथ जुड़ता है। <code>/x</code> और <code>x</code> के बीच एक अंतर उपलब्ध है - पूर्व एक डेटा ऑब्जेक्ट है जो एक नाम का प्रतिनिधित्व करता है, <code>x</code> का अर्थ है जिसे <code>/x</code> के अनुसार परिभाषित किया गया है। | ||
=== प्रक्रियाएं === | === प्रक्रियाएं === | ||
Line 82: | Line 82: | ||
शब्दकोश स्कोपिंग को नियंत्रित करने के साथ-साथ परिभाषाओं को संग्रहीत करने का एक साधन प्रदान करते हैं। | शब्दकोश स्कोपिंग को नियंत्रित करने के साथ-साथ परिभाषाओं को संग्रहीत करने का एक साधन प्रदान करते हैं। | ||
चूंकि डेटा ऑब्जेक्ट शीर्ष-सबसे शब्दकोश में संग्रहीत हैं, एक अप्रत्याशित क्षमता स्वाभाविक रूप से उत्पन्न होती है: जब किसी शब्दकोश से परिभाषा की तलाश करते हैं, तो सबसे ऊपरी शब्दकोश की जाँच की जाती है, फिर अगला, और इसी प्रकार से जाँच को जारी रखा जाता है। यदि एक प्रक्रिया को परिभाषित किया गया है जिसका वही नाम है जो पहले से ही एक | चूंकि डेटा ऑब्जेक्ट शीर्ष-सबसे शब्दकोश में संग्रहीत हैं, एक अप्रत्याशित क्षमता स्वाभाविक रूप से उत्पन्न होती है: जब किसी शब्दकोश से परिभाषा की तलाश करते हैं, तो सबसे ऊपरी शब्दकोश की जाँच की जाती है, फिर अगला, और इसी प्रकार से जाँच को जारी रखा जाता है। यदि एक प्रक्रिया को परिभाषित किया गया है जिसका वही नाम है जो पहले से ही एक भिन्न शब्दकोश में परिभाषित है, तो स्थानीय को बुलाया जाता है। | ||
=== कुछ विशिष्ट प्रक्रियाओं का एनाटॉमी === | === कुछ विशिष्ट प्रक्रियाओं का एनाटॉमी === | ||
प्रक्रियाएं | प्रक्रियाएं अधिकांशतः तर्क लेती हैं। वे प्रक्रिया द्वारा बहुत विशिष्ट तरीके से नियंत्रित किए जाते हैं, जो अन्य प्रोग्रामिंग भाषाओं से भिन्न होते हैं। | ||
पोस्टस्क्रिप्ट में [[फाइबोनैचि संख्या|फिबोनैकी संख्या]] प्रोग्राम की जांच करने के लिए: | पोस्टस्क्रिप्ट में [[फाइबोनैचि संख्या|फिबोनैकी संख्या]] प्रोग्राम की जांच करने के लिए: | ||
Line 103: | Line 103: | ||
प्रोग्राम के प्रत्येक प्रमुख चरण को विघटित करना, स्टैक को प्रतिबिंबित करना, <code>fib(4)</code> की गणना करना सम्मिलित होता है। | प्रोग्राम के प्रत्येक प्रमुख चरण को विघटित करना, स्टैक को प्रतिबिंबित करना, <code>fib(4)</code> की गणना करना सम्मिलित होता है। | ||
stack: 4 | |||
dup | |||
stack: 4 4 | |||
dup | |||
stack: 4 4 4 | |||
1 eq | |||
stack: 4 4 false | |||
exch | |||
stack: 4 false 4 | |||
0 eq | |||
stack: 4 false false | |||
or | |||
stack: 4 false | |||
not | |||
stack: 4 true | |||
चूंकि अभिव्यक्ति सत्य का मूल्यांकन करती है, आंतरिक प्रक्रिया का मूल्यांकन किया जाता है। | चूंकि अभिव्यक्ति सत्य का मूल्यांकन करती है, आंतरिक प्रक्रिया का मूल्यांकन किया जाता है। | ||
stack: 4 | |||
dup | |||
stack: 4 4 | |||
1 sub | |||
stack: 4 3 | |||
fib | |||
: ''(यहाँ पुनरावर्ती कॉल)'' | : ''(यहाँ पुनरावर्ती कॉल)'' | ||
stack: 4 F(3) | |||
exch | |||
stack: F(3) 4 | |||
2 sub | |||
stack: F(3) 2 | |||
fib | |||
: ''(यहाँ पुनरावर्ती कॉल)'' | : ''(यहाँ पुनरावर्ती कॉल)'' | ||
stack: F(3) F(2) | |||
add | |||
stack: F(3)+F(2) | |||
जो अपेक्षित परिणाम है। | जो अपेक्षित परिणाम है। | ||
यह प्रक्रिया | यह प्रक्रिया पूरे प्रकार से स्टैक नाम के चर का उपयोग नहीं करती है, नामित चर <code>/a exch def</code> निर्माण का उपयोग करके बनाए जा सकते हैं। उदाहरण के लिए, <code>{/n exch def n n mul}</code>नामित चर n के साथ एक वर्गाकार प्रक्रिया है। यह मानते हुए कि <code>/sq {/n exch def n n mul} def</code> और <code>3 sq</code> कहा जाता है, प्रक्रिया sq का विश्लेषण निम्न तरीके से किया जाता है: | ||
stack: 3 /n | |||
exch | |||
stack: /n 3 | |||
def | |||
stack: ''empty'' (it has been defined) | |||
n | |||
stack: 3 | |||
n | |||
stack: 3 3 | |||
mul | |||
stack: 9 | |||
जो अपेक्षित परिणाम है। | जो अपेक्षित परिणाम है। | ||
Line 165: | Line 165: | ||
=== नियंत्रण और प्रवाह === | === नियंत्रण और प्रवाह === | ||
चूंकि अज्ञात प्रक्रियाएं उपलब्ध हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है। यदि-फिर-अन्य कथन के लिए डेटा के तीन टुकड़ों की आवश्यकता होती है: एक शर्त, एक प्रक्रिया जिसे स्थिति के सही होने पर किया जाना है, और एक को किया जाना है यदि स्थिति गलत है। उदाहरण के लिए पोस्टस्क्रिप्ट में, | |||
चूंकि अज्ञात प्रक्रियाएं | |||
<syntaxhighlight lang="postscript"> | <syntaxhighlight lang="postscript"> | ||
Line 179: | Line 177: | ||
== भाषा मॉडल का विश्लेषण == | == भाषा मॉडल का विश्लेषण == | ||
जो सरल भाषा में दिया गया मॉडल है, वह अभिव्यक्ति और प्रोग्राम की व्याख्या सरल और सैद्धांतिक रूप से बहुत तेजी से करता है, क्योंकि वाक्यविन्यास विश्लेषण में | जो सरल भाषा में दिया गया मॉडल है, वह अभिव्यक्ति और प्रोग्राम की व्याख्या सरल और सैद्धांतिक रूप से बहुत तेजी से करता है, क्योंकि वाक्यविन्यास विश्लेषण में सिर्फ शाब्दिक विश्लेषण की आवश्यकता नहीं है। जिस विधि से इस प्रकार के प्रोग्राम लिखे जाते हैं, मशीनों द्वारा व्याख्या किए जाने की सुविधा होती है, यही वजह है कि पोस्टस्क्रिप्ट इसके उपयोग के लिए प्रिंटर को अच्छी प्रकार से सूट करता है। चूंकि, पोस्टस्क्रिप्ट प्रोग्राम लिखने का थोड़ा कृत्रिम तरीका स्टैक-उन्मुख भाषाओं जैसे पोस्टस्क्रिप्ट को समझने के लिए एक प्रारंभिक बाधा बना सकता है। | ||
जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करके छाया देने की क्षमता प्रोग्राम को डिबग करने के लिए कठिन बना सकती है, और इस सुविधा का गैर-जिम्मेदार उपयोग अप्रत्याशित व्यवहार का कारण बन सकता है, यह कुछ कार्यों को बहुत सरल कर सकता है। उदाहरण के लिए, पोस्टस्क्रिप्ट उपयोग में, कस्टम ऑपरेटर को परिभाषित करने या शैली उत्पन्न करने के लिए कोड दोहराने के | जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करके छाया देने की क्षमता प्रोग्राम को डिबग करने के लिए कठिन बना सकती है, और इस सुविधा का गैर-जिम्मेदार उपयोग अप्रत्याशित व्यवहार का कारण बन सकता है, यह कुछ कार्यों को बहुत सरल कर सकता है। उदाहरण के लिए, पोस्टस्क्रिप्ट उपयोग में, कस्टम ऑपरेटर को परिभाषित करने या शैली उत्पन्न करने के लिए कोड दोहराने के अतिरिक्त, पृष्ठ पर एक निश्चित शैली लागू करने वाले कस्टम ऑपरेटर के साथ <code>showpage</code> ऑपरेटर को ओवरराइड किया जा सकता है। | ||
== यह भी देखें == | == यह भी देखें == |
Revision as of 22:48, 2 March 2023
ढेर-उन्मुख प्रोग्रामिंग, एक प्रोग्रामिंग प्रतिमान है जो पासिंग पारसिगर के लिए ढेर मशीन मॉडल पर निर्भर करता है। ढेर-उन्मुख भाषाएं एक या एक से अधिक स्टैक (डेटा संरचना) पर काम करती हैं, जिनमें से प्रत्येक एक भिन्न उद्देश्य को पूरा कर सकता है। अन्य प्रोग्रामिंग भाषाओं में प्रोग्रामिंग निर्माण को ढेर-उन्मुख प्रणाली में उपयोग के लिए संशोधित करने की आवश्यकता है।[1] कुछ ढेर-उन्मुख भाषाएं पोस्टफिक्स या रिवर्स पोलिश नोटेशन में काम करती हैं। किसी कमांड के लिए कोई भी तर्क या पैरामीटर उस कमांड से पहले बताए जाते है। उदाहरण के लिए, पोस्टफिक्स नोटेशन 2, 3, multiply
के अतिरिक्त multiply, 2, 3
(उपसर्ग या पोलिश संकेतन), या 2 multiply 3
(इन्फ़िक्स संकेतन) लिखा जाता है। प्रोग्रामिंग भाषा फोर्थ (प्रोग्रामिंग भाषा), कारक (प्रोग्रामिंग भाषा), आरपीएल (प्रोग्रामिंग भाषा), परिशिष्ट भाग, बिबटेक्स स्टाइल डिज़ाइन भाषा[2] और कई कोडांतरण भाषाएं इस प्रतिमान को फिट करती हैं।
स्टैक आधारित एल्गोरिथ्म आंकड़ों के एक भाग का उपयोग स्टैक के ऊपर से करते हुए तथा स्टैक के ऊपर वापस डेटा को लौटाते हुए डेटा के बारे में विचार करते हैं। स्टैक प्रकलन ऑपरेटरों की आवश्यकता, स्टैक को डेटा में प्रकलन करने की अनुमति देता है। किसी कथन के प्रभाव पर बल देने के लिए, कथन के पहले और पश्चात में ढेर के शीर्ष को दिखाते हुए एक टिप्पणी का उपयोग किया जाता है। इसे स्टैक प्रभाव आरेख के रूप में जाना जाता है।
पोस्टस्क्रिप्ट स्टैक अतिरिक्त उद्देश्यों के लिए भिन्न-भिन्न स्टैक पर विचार करते हैं। यह चर, शब्दकोशों, प्रक्रियाओं, कुछ विशिष्ट प्रक्रियाओं की शारीरिक रचना, नियंत्रण और प्रवाह पर विचार करता है। भाषा मॉडल का विश्लेषण अभिव्यक्तियों और प्रोग्रामों को सरल और सैद्धांतिक रूप से व्याख्या करने की अनुमति देता है।
ढेर-आधारित कलन विधि
पोस्टस्क्रिप्ट पोस्टफिक्स स्टैक-आधारित भाषा का एक उदाहरण है। इस भाषा में एक अभिव्यक्ति 2 3 mul
उदाहरण है । अभिव्यक्ति की गणना में यह समझना सम्मलित है कि ढेर-आधारित कैसे काम करता है।
ढेर-आधारित को निम्नलिखित कन्वेयर बेल्ट सादृश्य के रूप में प्रस्तुत किया जा सकता है। एक कन्वेयर बेल्ट (इनपुट) के अंत में, प्लेटें चिह्नित होती हैं जिन्हें 2
, 3
, और mul
के अनुक्रम में रखा गया है। कन्वेयर के अंत में प्लेट (2
) लिया जा सकता है, चूंकि अन्य प्लेटों को तब तक उपयोग नहीं किया जा सकता है जब तक कि अंत में प्लेट को हटा नहीं दिया जाये, प्लेटों को सिर्फ एक स्टैक में संग्रहीत किया जा सकता है, और इसे सिर्फ स्टैक से जोड़ा या हटाया जा सकता है, तथा इसे मध्य या नीचे से हटाया नहीं जा सकता है। खाली प्लेटों (और एक मार्कर) की आपूर्ति की जा सकती है और प्लेटों को स्थायी रूप से छोड़ दिया जा सकता है।
प्लेट 2
लीजिए और इसे स्टैक पर रख दीजिए, फिर प्लेट 3
लीजिए और स्टैक पर रख दीजिए, इसके बाद mul
प्लेट लें, यह निष्पादन करने का एक निर्देश है। फिर, शीर्ष दो प्लेटों को ढेर से हटा दें, उनके लेबल (2
और 3
) को गुणा करें, और परिणाम (6
) को एक नई प्लेट पर लिखें, दो पुरानी प्लेट (2
और 3
) और प्लेट mul
को त्याग दें, और नई प्लेट को ढेर पर रख दिया जाता है, कन्वेयर पर कोई और प्लेट नहीं रहने के कारण, गणना (6
) का परिणाम स्टैक के ऊपर प्लेट पर दिखाया गया है।
यह एक बहुत ही सरल गणना है, क्या होगा यदि एक अधिक जटिल गणना की आवश्यकता है, जैसे (2 + 3) × 11 + 1
? यदि यह पहली बार पोस्टफिक्स रूप में लिखा गया है, तो अर्थात्, 2 3 add 11 mul 1 add
, गणना बिल्कुल उसी प्रकार से की जा सकती है और सही परिणाम प्राप्त किया जा सकता है। गणना के चरण नीचे दी गई तालिका में दिखाए गए हैं। प्रत्येक कॉलम एक इनपुट तत्व (कन्वेयर के अंत में प्लेट) और उस इनपुट को संसाधित करने के बाद स्टैक की सामग्री दिखाता है।
Input | 2 | 3 | add | 11 | mul | 1 | add |
---|---|---|---|---|---|---|---|
Stack | 2 | 3 2 |
5 | 11 5 |
55 | 1 55 |
56 |
सभी इनपुट को संसाधित करने के बाद, स्टैक में 56
होते हैं, जो उत्तर है।
इससे, निम्नलिखित का निष्कर्ष निकाला जा सकता है: एक ढेर-आधारित प्रोग्रामिंग भाषा में डेटा को संभालने का सिर्फ एक ही तरीका होता है, स्टैक के ऊपर डेटा का एक टुकड़ा, जिसे पॉपिंग कहा जाता है, और डेटा को स्टैक के ऊपर वापस डाल दिया जाता है, जिसे पुशिंग कहा जाता है। कोई भी अभिव्यक्ति जिसे पारंपरिक रूप से, या किसी अन्य प्रोग्रामिंग भाषा में लिखा जा सकता है, पोस्टफिक्स (या उपसर्ग) रूप में लिखा जा सकता है और इस प्रकार एक स्टैक-उन्मुख भाषा द्वारा व्याख्या किए जाने के लिए उत्तरदायी हो सकता है।
स्टैक प्रकलन
चूंकि स्टैक ढेर-उन्मुख भाषा में डेटा प्रकलन करने का महत्वपूर्ण साधन है, इसलिए ऐसी भाषाएं अधिकांशतः स्टैक प्रकलन ऑपरेटरों को कुछ प्रकार के स्टैक प्रकलन प्रदान करती हैं। सामान्यतः ये प्रदान किए जाते हैं dup
, ढेर के ऊपर तत्व को डुप्लिकेट करने के लिए, exch
(या swap
), स्टैक के ऊपर तत्वों का आदान -प्रदान करने के लिए (पहला दूसरा बन जाता है और दूसरा पहले बन जाता है), roll
, स्टैक में या स्टैक के भाग में चक्रीय रूप से अनुमति देने के लिए, pop
(या drop
), स्टैक के ऊपर तत्व को त्यागने के लिए (पुशिंग निहित है), और यह अन्य अध्ययन प्रक्रियाओं में महत्वपूर्ण बन जाते हैं।
स्टैक प्रभाव आरेख
कथन के प्रभाव को समझने के लिए एक सहायता के रूप में, एक छोटी टिप्पणी का उपयोग बयान से पहले और पश्चात में स्टैक के शीर्ष को दिखाते हुए किया जाता है, यदि कई मद हैं तो स्टैक का शीर्ष सबसे सही है। यह संकेतन सामान्यतः अगली भाषा में उपयोग किया जाता है, जहां टिप्पणियां कोष्ठक में संलग्न हैं।
( before -- after )
उदाहरण के लिए, बेसिक फोर्थ स्टैक ऑपरेटरों का वर्णन किया गया है:
dup ( a -- a a )
drop ( a -- )
swap ( a b -- b a )
over ( a b -- a b a )
rot ( a b c -- b c a )
और नीचे दिए गए fib
फ़ंक्शन का वर्णन किया गया है:
fib ( n -- n' )
यह होरे तर्क में पूर्व शर्त और पश्च शर्त लगाने के बराबर है। आवश्यक नहीं कि यह स्टैक-आधारित भाषाओं के संदर्भ में हो, दोनों टिप्पणियों को अभिकथन के रूप में भी संदर्भित किया जा सकता है।
पोस्टस्क्रिप्ट स्टैक
पोस्टस्क्रिप्ट और कुछ अन्य स्टैक भाषाओं में अन्य उद्देश्यों के लिए अन्य भिन्न -भिन्न स्टैक हैं।
चर और शब्दकोश
विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका है। चर का कार्यान्वयन किसी भी प्रोग्रामिंग भाषा के लिए महत्वपूर्ण है, लेकिन स्टैक-उन्मुख भाषाओं के लिए यह विशेष चिंता का विषय है, क्योंकि डेटा के साथ बातचीत करने का सिर्फ एक ही तरीका है।
चर को स्टैक ओरिएंटेड भाषाओं जैसे कि पोस्ट-स्क्रिप्ट में जिस प्रकार कार्यान्वित किया जाता है, उसमें एक भिन्न, विशिष्ट स्टैक होता है जिसमें मुख्य मूल्य जोड़े के शब्द होते हैं। एक चर बनाने के लिए, एक कुंजी (चर का नाम) पहले बनाई जानी चाहिए, जिसके साथ एक मान जुड़ा हुआ है। पोस्टस्क्रिप्ट में, एक नाम डेटा ऑब्जेक्ट /
के साथ प्रीफ़िक्स्ड होता है, इसलिए /x
एक नाम डेटा ऑब्जेक्ट होता है जिसे उदाहरण के लिए संख्या 42
से जोड़ा जा सकता है। define
आदेश def
है, इसलिए /x 42 def
स्टैक के ऊपर शब्दकोश में नंबर 42
के साथ नाम x
के साथ जुड़ता है। /x
और x
के बीच एक अंतर उपलब्ध है - पूर्व एक डेटा ऑब्जेक्ट है जो एक नाम का प्रतिनिधित्व करता है, x
का अर्थ है जिसे /x
के अनुसार परिभाषित किया गया है।
प्रक्रियाएं
स्टैक-आधारित प्रोग्रामिंग भाषा में एक प्रक्रिया को डेटा ऑब्जेक्ट के रूप में अपने अधिकार में माना जाता है। पोस्टस्क्रिप्ट में, प्रक्रियाओं को {
और }
के बीच निरूपित किया जाता है।
उदाहरण के लिए, पोस्टस्क्रिप्ट सिंटैक्स में,
{ dup mul }
एक अज्ञात प्रक्रिया को स्टैक के शीर्ष पर जो है उसकी प्रतिकृति करने के लिए निरूपित करता है और परिणाम को एक वर्ग प्रक्रिया से गुणा करता है।
चूंकि प्रक्रियाओं को सरल डेटा ऑब्जेक्ट के रूप में माना जाता है, तथा प्रक्रियाओं वाले नामों को परिभाषित किया जा सकता है। जब उन्हें पुनः प्राप्त किया जाता है, तो उन्हें सीधे निष्पादित किया जाता है।
शब्दकोश स्कोपिंग को नियंत्रित करने के साथ-साथ परिभाषाओं को संग्रहीत करने का एक साधन प्रदान करते हैं।
चूंकि डेटा ऑब्जेक्ट शीर्ष-सबसे शब्दकोश में संग्रहीत हैं, एक अप्रत्याशित क्षमता स्वाभाविक रूप से उत्पन्न होती है: जब किसी शब्दकोश से परिभाषा की तलाश करते हैं, तो सबसे ऊपरी शब्दकोश की जाँच की जाती है, फिर अगला, और इसी प्रकार से जाँच को जारी रखा जाता है। यदि एक प्रक्रिया को परिभाषित किया गया है जिसका वही नाम है जो पहले से ही एक भिन्न शब्दकोश में परिभाषित है, तो स्थानीय को बुलाया जाता है।
कुछ विशिष्ट प्रक्रियाओं का एनाटॉमी
प्रक्रियाएं अधिकांशतः तर्क लेती हैं। वे प्रक्रिया द्वारा बहुत विशिष्ट तरीके से नियंत्रित किए जाते हैं, जो अन्य प्रोग्रामिंग भाषाओं से भिन्न होते हैं।
पोस्टस्क्रिप्ट में फिबोनैकी संख्या प्रोग्राम की जांच करने के लिए:
/fib
{
dup dup 1 eq exch 0 eq or not
{
dup 1 sub fib
exch 2 sub fib
add
} if
} def
स्टैक पर एक पुनरावर्ती परिभाषा का उपयोग किया जाता है, फिबोनैकी संख्या फ़ंक्शन एक तर्क लेता है। सबसे पहले, यह 1 या 0 होने के लिए परीक्षण किया जाता है।
प्रोग्राम के प्रत्येक प्रमुख चरण को विघटित करना, स्टैक को प्रतिबिंबित करना, fib(4)
की गणना करना सम्मिलित होता है।
stack: 4 dup stack: 4 4 dup stack: 4 4 4 1 eq stack: 4 4 false exch stack: 4 false 4 0 eq stack: 4 false false or stack: 4 false not stack: 4 true
चूंकि अभिव्यक्ति सत्य का मूल्यांकन करती है, आंतरिक प्रक्रिया का मूल्यांकन किया जाता है।
stack: 4 dup stack: 4 4 1 sub stack: 4 3 fib
- (यहाँ पुनरावर्ती कॉल)
stack: 4 F(3) exch stack: F(3) 4 2 sub stack: F(3) 2 fib
- (यहाँ पुनरावर्ती कॉल)
stack: F(3) F(2) add stack: F(3)+F(2)
जो अपेक्षित परिणाम है।
यह प्रक्रिया पूरे प्रकार से स्टैक नाम के चर का उपयोग नहीं करती है, नामित चर /a exch def
निर्माण का उपयोग करके बनाए जा सकते हैं। उदाहरण के लिए, {/n exch def n n mul}
नामित चर n के साथ एक वर्गाकार प्रक्रिया है। यह मानते हुए कि /sq {/n exch def n n mul} def
और 3 sq
कहा जाता है, प्रक्रिया sq का विश्लेषण निम्न तरीके से किया जाता है:
stack: 3 /n exch stack: /n 3 def stack: empty (it has been defined) n stack: 3 n stack: 3 3 mul stack: 9
जो अपेक्षित परिणाम है।
नियंत्रण और प्रवाह
चूंकि अज्ञात प्रक्रियाएं उपलब्ध हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है। यदि-फिर-अन्य कथन के लिए डेटा के तीन टुकड़ों की आवश्यकता होती है: एक शर्त, एक प्रक्रिया जिसे स्थिति के सही होने पर किया जाना है, और एक को किया जाना है यदि स्थिति गलत है। उदाहरण के लिए पोस्टस्क्रिप्ट में,
2 3 gt { (2 is greater than three) = } { (2 is not greater than three) = } ifelse
C में लगभग समकक्ष प्रदर्शन करता है:
if (2 > 3) { printf("2 is greater than three\n"); } else { printf("2 is not greater than three\n"); }
लूपिंग और अन्य निर्माण समान हैं।
भाषा मॉडल का विश्लेषण
जो सरल भाषा में दिया गया मॉडल है, वह अभिव्यक्ति और प्रोग्राम की व्याख्या सरल और सैद्धांतिक रूप से बहुत तेजी से करता है, क्योंकि वाक्यविन्यास विश्लेषण में सिर्फ शाब्दिक विश्लेषण की आवश्यकता नहीं है। जिस विधि से इस प्रकार के प्रोग्राम लिखे जाते हैं, मशीनों द्वारा व्याख्या किए जाने की सुविधा होती है, यही वजह है कि पोस्टस्क्रिप्ट इसके उपयोग के लिए प्रिंटर को अच्छी प्रकार से सूट करता है। चूंकि, पोस्टस्क्रिप्ट प्रोग्राम लिखने का थोड़ा कृत्रिम तरीका स्टैक-उन्मुख भाषाओं जैसे पोस्टस्क्रिप्ट को समझने के लिए एक प्रारंभिक बाधा बना सकता है।
जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करके छाया देने की क्षमता प्रोग्राम को डिबग करने के लिए कठिन बना सकती है, और इस सुविधा का गैर-जिम्मेदार उपयोग अप्रत्याशित व्यवहार का कारण बन सकता है, यह कुछ कार्यों को बहुत सरल कर सकता है। उदाहरण के लिए, पोस्टस्क्रिप्ट उपयोग में, कस्टम ऑपरेटर को परिभाषित करने या शैली उत्पन्न करने के लिए कोड दोहराने के अतिरिक्त, पृष्ठ पर एक निश्चित शैली लागू करने वाले कस्टम ऑपरेटर के साथ showpage
ऑपरेटर को ओवरराइड किया जा सकता है।
यह भी देखें
- स्टैक-आधारित प्रोग्रामिंग भाषाओं की सूची
- रिवर्स पोलिश नोटेशन
- वापसी-उन्मुख प्रोग्रामिंग
संदर्भ
- ↑ Luerweg, T. (2015). Stack based programming paradigms. Concepts of Programming Languages–CoPL’15, 33.
- ↑ Oren Patashnik, Designing BibTeX styles (PDF)[dead link]