स्टैक ओरिएंटेड प्रोग्रामिंग: Difference between revisions

From Vigyanwiki
No edit summary
 
(8 intermediate revisions by 5 users not shown)
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>}} (Infix संकेतन)।प्रोग्रामिंग लैंग्वेज [[ फोर्थ (प्रोग्रामिंग भाषा) |फोर्थ (प्रोग्रामिंग भाषा)]], [[ कारक (प्रोग्रामिंग भाषा) |कारक (प्रोग्रामिंग भाषा)]], [[ आरपीएल (प्रोग्रामिंग भाषा) |आरपीएल (प्रोग्रामिंग भाषा)]], [[ परिशिष्ट भाग |परिशिष्ट भाग]], [[बिबटेक्स]] स्टाइल डिज़ाइन लैंग्वेज<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> और कई विधानसभा भाषाएं इस प्रतिमान को फिट करती हैं।
स्टैक ओरिएंटेड प्रोग्रामिंग, एक [[प्रोग्रामिंग प्रतिमान]] है जो पासिंग [[ पारसिगर |पारसिगर]] के लिए [[ ढेर मशीन |स्टैक मशीन]] मॉडल पर निर्भर करता है। स्टैक-ओरिएंटेड भाषाएं एक या एक से अधिक स्टैक ([[डेटा संरचना)]] पर काम करती हैं, जिनमें से प्रत्येक एक भिन्न उद्देश्य को पूरा कर सकता है। अन्य प्रोग्रामिंग भाषाओं में प्रोग्रामिंग निर्माण को स्टैक-ओरिएंटेड प्रणाली में उपयोग के लिए संशोधित करने की आवश्यकता है।<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]]थाली लेना <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>) प्लेट पर स्टैक के ऊपर दिखाया गया है।
  [[File:Human stack.svg|220px]]


यह एक बहुत ही सरल गणना है।क्या होगा अगर एक अधिक जटिल गणना की आवश्यकता है, जैसे {{nowrap|<code>(2 + 3) &times; 11 + 1</code>}}?यदि यह पहली बार पोस्टफिक्स रूप में लिखा गया है, तो, अर्थात्, {{nowrap|<code>2 3 add 11 mul 1 add</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) &times; 11 + 1</code>}}? यदि यह पहली बार पोस्टफिक्स रूप में लिखा गया है, तो अर्थात्, {{nowrap|<code>2 3 add 11 mul 1 add</code>}}, गणना बिल्कुल उसी प्रकार से की जा सकती है और सही परिणाम प्राप्त किया जा सकता है। गणना के चरण नीचे दी गई तालिका में दिखाए गए हैं। प्रत्येक कॉलम एक इनपुट तत्व (कन्वेयर के अंत में प्लेट) और उस इनपुट को संसाधित करने के बाद स्टैक की सामग्री दिखाता है।
{| class="wikitable"  
{| class="wikitable"  
|-
|-
Line 35: Line 36:
| style="text-align: right; vertical-align: bottom;" | {{mono|56}}
| style="text-align: right; vertical-align: bottom;" | {{mono|56}}
|}
|}
सभी इनपुट को संसाधित करने के बाद, स्टैक में होता है <code>56</code>, जो जवाब है।
सभी इनपुट को संसाधित करने के बाद, स्टैक में <code>56</code> होते हैं, जो उत्तर है।


इससे, निम्नलिखित का निष्कर्ष निकाला जा सकता है: एक स्टैक-आधारित प्रोग्रामिंग भाषा में डेटा को संभालने का केवल एक ही तरीका होता है, स्टैक के ऊपर डेटा का एक टुकड़ा, पॉपिंग कहा जाता है, और डेटा को स्टैक के ऊपर वापस डाल दिया जाता है, जिसे पुशिंग कहा जाता है।कोई भी अभिव्यक्ति जिसे पारंपरिक रूप से, या किसी अन्य प्रोग्रामिंग भाषा में लिखा जा सकता है, पोस्टफिक्स (या उपसर्ग) रूप में लिखा जा सकता है और इस तरह एक स्टैक-उन्मुख भाषा द्वारा व्याख्या किए जाने के लिए उत्तरदायी हो सकता है।
इससे, निम्नलिखित का निष्कर्ष निकाला जा सकता है: एक स्टैक-आधारित प्रोग्रामिंग भाषा में डेटा को संभालने का सिर्फ एक ही तरीका होता है, स्टैक के ऊपर डेटा का एक टुकड़ा, जिसे पॉपिंग कहा जाता है, और डेटा को स्टैक के ऊपर वापस डाल दिया जाता है, जिसे पुशिंग कहा जाता है। कोई भी अभिव्यक्ति जिसे पारंपरिक रूप से, या किसी अन्य प्रोग्रामिंग भाषा में लिखा जा सकता है, पोस्टफिक्स (या उपसर्ग) रूप में लिखा जा सकता है और इस प्रकार एक स्टैक-ओरिएंटेड भाषा द्वारा व्याख्या किए जाने के लिए उत्तरदायी हो सकता है।


== स्टैक हेरफेर ==
== स्टैक प्रकलन ==
चूंकि स्टैक स्टैक-ओरिएंटेड भाषा में डेटा में हेरफेर करने का महत्वपूर्ण साधन है, इसलिए ऐसी भाषाएं अक्सर स्टैक हेरफेर ऑपरेटरों को कुछ प्रकार के स्टैक हेरफेर प्रदान करती हैं।आमतौर पर प्रदान किए जाते हैं <code>dup</code>, ढेर के ऊपर तत्व को डुप्लिकेट करने के लिए, <code>exch</code> (या <code>swap</code>), स्टैक के ऊपर तत्वों का आदान -प्रदान करने के लिए (पहला दूसरा बन जाता है और दूसरा पहले बन जाता है), <code>roll</code>, स्टैक में या स्टैक के हिस्से में चक्रीय रूप से अनुमति देने के लिए, <code>pop</code> (या <code>drop</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 55: Line 56:
rot  ( a b c -- b c a )
rot  ( a b c -- b c a )
</syntaxhighlight>
</syntaxhighlight>
और यह <code>fib</code> नीचे दिए गए फ़ंक्शन का वर्णन किया गया है:
और नीचे दिए गए <code>fib</code> फ़ंक्शन का वर्णन किया गया है:


<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>/</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> के अनुसार परिभाषित किया गया है।
 
<code>/x 42 def</code>
नाम के साथ सहयोगी <code>x</code> संख्या के साथ <code>42</code> डिक्शनरी में स्टैक के ऊपर।के बीच एक अंतर मौजूद है <code>/x</code> और <code>x</code> - पूर्व एक डेटा ऑब्जेक्ट है जो एक नाम का प्रतिनिधित्व करता है, <code>x</code> के तहत परिभाषित किया गया है के लिए खड़ा है <code>/x</code>


=== प्रक्रियाएं ===
=== प्रक्रियाएं ===
स्टैक-आधारित प्रोग्रामिंग भाषा में एक प्रक्रिया को अपने आप में डेटा ऑब्जेक्ट के रूप में माना जाता है।पोस्टस्क्रिप्ट में, प्रक्रियाओं को निरूपित किया जाता है <code>{</code> और <code>}</code>
स्टैक-आधारित प्रोग्रामिंग भाषा में एक प्रक्रिया को डेटा ऑब्जेक्ट के रूप में अपने अधिकार में माना जाता है। पोस्टस्क्रिप्ट में, प्रक्रियाओं को <code>{</code> और <code>}</code> के बीच निरूपित किया जाता है।


उदाहरण के लिए, पोस्टस्क्रिप्ट सिंटैक्स में,
उदाहरण के लिए, पोस्टस्क्रिप्ट सिंटैक्स में,


<code>{ dup mul }</code>
<code>{ dup mul }</code>
स्टैक के शीर्ष पर क्या है, डुप्लिकेट करने के लिए एक अनाम प्रक्रिया का प्रतिनिधित्व करता है और फिर परिणाम को गुणा करता है - एक वर्ग प्रक्रिया।


चूंकि प्रक्रियाओं को सरल डेटा ऑब्जेक्ट के रूप में माना जाता है, इसलिए प्रक्रियाओं वाले नामों को परिभाषित किया जा सकता है।जब उन्हें पुनर्प्राप्त किया जाता है, तो उन्हें सीधे निष्पादित किया जाता है।
एक अज्ञात प्रक्रिया को स्टैक के शीर्ष पर जो है उसकी प्रतिकृति करने के लिए निरूपित करता है और परिणाम को एक वर्ग प्रक्रिया से गुणा करता है।


शब्दकोश स्कोपिंग को नियंत्रित करने के साथ -साथ परिभाषाओं के भंडारण का एक साधन प्रदान करते हैं।
चूंकि प्रक्रियाओं को सरल डेटा ऑब्जेक्ट के रूप में माना जाता है, तथा प्रक्रियाओं वाले नामों को परिभाषित किया जा सकता है। जब उन्हें पुनः प्राप्त किया जाता है, तो उन्हें सीधे निष्पादित किया जाता है।


चूंकि डेटा ऑब्जेक्ट्स को शीर्ष-सबसे अधिक शब्दकोश में संग्रहीत किया जाता है, इसलिए एक अप्रत्याशित क्षमता स्वाभाविक रूप से उत्पन्न होती है: जब एक शब्दकोश से एक परिभाषा को देखते हुए, सबसे ऊपर शब्दकोश की जाँच की जाती है, तो अगला, और इसी तरह।यदि एक प्रक्रिया को परिभाषित किया जाता है, जिसका नाम एक ही नाम है जैसा कि पहले से ही एक अलग शब्दकोश में परिभाषित किया गया है, तो स्थानीय को बुलाया जाएगा।
शब्दकोश स्कोपिंग को नियंत्रित करने के साथ-साथ परिभाषाओं को संग्रहीत करने का एक साधन प्रदान करते हैं।


=== कुछ विशिष्ट प्रक्रियाओं की शारीरिक रचना ===
चूंकि डेटा ऑब्जेक्ट शीर्ष-सबसे शब्दकोश में संग्रहीत हैं, एक अप्रत्याशित क्षमता स्वाभाविक रूप से उत्पन्न होती है: जब किसी शब्दकोश से परिभाषा की तलाश करते हैं, तो सबसे ऊपरी शब्दकोश की जाँच की जाती है, फिर अगला, और इसी प्रकार से जाँच को जारी रखा जाता है। यदि एक प्रक्रिया को परिभाषित किया गया है जिसका वही नाम है जो पहले से ही एक भिन्न शब्दकोश में परिभाषित है, तो स्थानीय को बुलाया जाता है।
प्रक्रियाएं अक्सर तर्क लेते हैं।वे प्रक्रिया द्वारा बहुत विशिष्ट तरीके से संभाला जाता है, अन्य प्रोग्रामिंग भाषाओं से अलग।


पोस्टस्क्रिप्ट में एक [[फाइबोनैचि संख्या]] कार्यक्रम की जांच करने के लिए:
=== कुछ विशिष्ट प्रक्रियाओं का एनाटॉमी ===
प्रक्रियाएं अधिकांशतः तर्क लेती हैं। वे प्रक्रिया द्वारा बहुत विशिष्ट तरीके से नियंत्रित किए जाते हैं, जो अन्य प्रोग्रामिंग भाषाओं से भिन्न होते हैं।
 
पोस्टस्क्रिप्ट में [[फाइबोनैचि संख्या|फिबोनैकी संख्या]] प्रोग्राम की जांच करने के लिए:
<syntaxhighlight lang="postscript">
<syntaxhighlight lang="postscript">


Line 101: Line 100:
   } def
   } def
</syntaxhighlight>
</syntaxhighlight>
स्टैक पर एक पुनरावर्ती परिभाषा का उपयोग किया जाता है।Fibonacci संख्या फ़ंक्शन एक तर्क लेता है।सबसे पहले, यह 1 या 0 होने के लिए परीक्षण किया जाता है।
स्टैक पर एक पुनरावर्ती परिभाषा का उपयोग किया जाता है, फिबोनैकी संख्या फ़ंक्शन एक तर्क लेता है। सबसे पहले, यह 1 या 0 होने के लिए परीक्षण किया जाता है।


कार्यक्रम के प्रत्येक प्रमुख चरणों में से प्रत्येक को विघटित करना, स्टैक को दर्शाते हुए, गणना की गणना करना <code>fib(4)</code> :
प्रोग्राम के प्रत्येक प्रमुख चरण को विघटित करना, स्टैक को प्रतिबिंबित करना, <code>fib(4)</code> की गणना करना सम्मिलित होता है।
  stack: 4
          stack: 4
    dup  
  dup  
                stack: 4 4
          stack: 4 4
    dup  
  dup  
                stack: 4 4 4
          stack: 4 4 4
    1 eq  
  1 eq  
                stack: 4 4 false
          stack: 4 4 false
    exch  
  exch  
                stack: 4 false 4
          stack: 4 false 4
    0 eq
  0 eq
                stack: 4 false false
          stack: 4 false false
    or
  or
                stack: 4 false
          stack: 4 false
    not
  not
                stack: 4 true
          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: 4
          stack: 3 /n
    dup
  exch
                stack: 4 4
          stack: /n 3
    1 sub
  def
                stack: 4 3
          stack: ''empty'' (it has been defined)
    fib
  n
: ''(recursive call here)''
          stack: 3
                stack: 4 F(3)
  n
    exch
          stack: 3 3  
                stack: F(3) 4
  mul
    2 sub
          stack: 9
                stack: F(3) 2
    fib
: ''(recursive call here)''
                stack: F(3) F(2)
    add
                stack: F(3)+F(2)
जो अपेक्षित परिणाम है।
जो अपेक्षित परिणाम है।


यह प्रक्रिया नामित चर का उपयोग नहीं करती है, विशुद्ध रूप से स्टैक।नामित चर का उपयोग करके बनाया जा सकता है <code>/a exch def</code> निर्माण।उदाहरण के लिए, <code>{/n exch def n n mul}</code> एक नामित चर के साथ एक वर्ग प्रक्रिया है <code>n</code>।ये मानते हुए <code>/sq {/n exch def n n mul} def</code> और <code>3 sq</code> कहा जाता है, प्रक्रिया <code>sq</code> निम्नलिखित तरीके से विश्लेषण किया जाता है:
  stack: 3 /n
    exch
                stack: /n 3
    def
                stack: ''empty'' (it has been defined)
    n
                stack: 3
    n
                stack: 3 3
    mul
                stack: 9
जो अपेक्षित परिणाम है।


[[Category:All articles with dead external links]]
 
[[Category:Articles with dead external links from April 2019]]
 
[[Category:Articles with invalid date parameter in template]]
 
[[Category:Created On 18/02/2023]]
 
[[Category:Machine Translated Page]]
 
[[Category:Pages with script errors|Short description/doc]]
 
[[Category:Short description with empty Wikidata description]]
 
[[Category:Template documentation pages|Short description/doc]]
 
[[Category:Templates Vigyan Ready]]
 
[[Category:Templates that add a tracking category]]


=== नियंत्रण और प्रवाह ===
=== नियंत्रण और प्रवाह ===
चूंकि अनाम प्रक्रियाएं मौजूद हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है।IF-SHEN-ELSE स्टेटमेंट के लिए डेटा के तीन टुकड़ों की आवश्यकता होती है: एक स्थिति, यदि स्थिति सही है, तो एक प्रक्रिया की जानी है, और यदि स्थिति गलत है तो एक किया जाना है।उदाहरण के लिए पोस्टस्क्रिप्ट में,
चूंकि अज्ञात प्रक्रियाएं उपलब्ध हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है। यदि-फिर-अन्य कथन के लिए डेटा के तीन टुकड़ों की आवश्यकता होती है: एक शर्त, एक प्रक्रिया जिसे स्थिति के सही होने पर किया जाना है, और एक को किया जाना है यदि स्थिति गलत है। उदाहरण के लिए पोस्टस्क्रिप्ट में,
<syntaxhighlight lang="postscript">
<syntaxhighlight lang="postscript">


  2 3 gt { (2 is greater than three) = } { (2 is not greater than three) = } ifelse
  2 3 gt { (2 is greater than three) = } { (2 is not greater than three) = } ifelse
</syntaxhighlight>
</syntaxhighlight>
C में निकट के बराबर प्रदर्शन करता है:
C में लगभग समकक्ष प्रदर्शन करता है:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
  if (2 > 3) { printf("2 is greater than three\n"); } else { printf("2 is not greater than three\n"); }
  if (2 > 3) { printf("2 is greater than three\n"); } else { printf("2 is not greater than three\n"); }
Line 179: Line 177:


== भाषा मॉडल का विश्लेषण ==
== भाषा मॉडल का विश्लेषण ==
एक स्टैक-ओरिएंटेड भाषा में प्रदान किए गए सरल मॉडल को अभिव्यक्तियों और कार्यक्रमों को बस और सैद्धांतिक रूप से बहुत तेजी से मूल्यांकन करने की अनुमति मिलती है, क्योंकि किसी भी सिंटैक्स विश्लेषण की आवश्यकता नहीं है, केवल शाब्दिक विश्लेषण।जिस तरह से इस तरह के कार्यक्रमों को लिखा जाता है, वह मशीनों द्वारा व्याख्या की जा रही है, यही वजह है कि पोस्टस्क्रिप्ट प्रिंटर को इसके उपयोग के लिए अच्छी तरह से सूट करता है।हालांकि, पोस्टस्क्रिप्ट प्रोग्राम लिखने का थोड़ा कृत्रिम तरीका स्टैक-ओरिएंटेड भाषाओं जैसे कि पोस्टस्क्रिप्ट को समझने के लिए एक प्रारंभिक बाधा बन सकता है।
जो सरल भाषा में दिया गया मॉडल है, वह अभिव्यक्ति और प्रोग्राम की व्याख्या सरल और सैद्धांतिक रूप से बहुत तेजी से करता है, क्योंकि वाक्यविन्यास विश्लेषण में सिर्फ शाब्दिक विश्लेषण की आवश्यकता नहीं है। जिस विधि से इस प्रकार के प्रोग्राम लिखे जाते हैं, मशीनों द्वारा व्याख्या किए जाने की सुविधा होती है, यही वजह है कि पोस्टस्क्रिप्ट इसके उपयोग के लिए प्रिंटर को अच्छी प्रकार से सूट करता है। चूंकि, पोस्टस्क्रिप्ट प्रोग्राम लिखने का थोड़ा कृत्रिम तरीका स्टैक-ओरिएंटेड भाषाओं जैसे पोस्टस्क्रिप्ट को समझने के लिए एक प्रारंभिक बाधा बना सकता है।


जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करने वाले विधि द्वारा छाया करने की क्षमता कार्यक्रमों को डिबग करने के लिए कठिन बना सकती है, और इस सुविधा के गैर -जिम्मेदार उपयोग से अप्रत्याशित व्यवहार हो सकता है, यह कुछ कार्यों को बहुत सरल बना सकता है।उदाहरण के लिए, पोस्टस्क्रिप्ट उपयोग में, <code>showpage</code> ऑपरेटर को एक कस्टम के साथ ओवरराइड किया जा सकता है जो एक कस्टम ऑपरेटर को परिभाषित करने या स्टाइल उत्पन्न करने के लिए कोड को दोहराने के बजाय पृष्ठ पर एक निश्चित शैली लागू करता है।
जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करके छाया देने की क्षमता प्रोग्राम को डिबग करने के लिए कठिन बना सकती है, और इस सुविधा का गैर-जिम्मेदार उपयोग अप्रत्याशित व्यवहार का कारण बन सकता है, यह कुछ कार्यों को बहुत सरल कर सकता है। उदाहरण के लिए, पोस्टस्क्रिप्ट उपयोग में, कस्टम ऑपरेटर को परिभाषित करने या शैली उत्पन्न करने के लिए कोड दोहराने के अतिरिक्त, पृष्ठ पर एक निश्चित शैली लागू करने वाले कस्टम ऑपरेटर के साथ <code>showpage</code> ऑपरेटर को ओवरराइड किया जा सकता है।


== यह भी देखें ==
== यह भी देखें ==
* [[स्टैक-आधारित प्रोग्रामिंग भाषाओं की सूची]]
* [[स्टैक-आधारित प्रोग्रामिंग भाषाओं की सूची]]
* रिवर्स पोलिश नोटेशन
* रिवर्स पोलिश नोटेशन
* [[वापसी-उन्मुख प्रोग्रामिंग]]
* [[वापसी-उन्मुख प्रोग्रामिंग|वापसी-ओरिएंटेड प्रोग्रामिंग]]


==संदर्भ==
==संदर्भ==
<references/>
<references/>
[[Category: स्टैक-ओरिएंटेड प्रोग्रामिंग भाषाएँ | स्टैक-ओरिएंटेड प्रोग्रामिंग भाषाएँ ]] [[Category: प्रोग्रामिंग प्रतिमान]]


 
[[Category:All articles with dead external links]]
 
[[Category:Articles with dead external links from April 2019]]
[[Category: Machine Translated Page]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Created On 18/02/2023]]
[[Category:Created On 18/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors|Short description/doc]]
[[Category:Short description with empty Wikidata description]]
[[Category:Template documentation pages|Short description/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:प्रोग्रामिंग प्रतिमान]]
[[Category:स्टैक-ओरिएंटेड प्रोग्रामिंग भाषाएँ| स्टैक-ओरिएंटेड प्रोग्रामिंग भाषाएँ ]]

Latest revision as of 12:24, 14 September 2023

स्टैक ओरिएंटेड प्रोग्रामिंग, एक प्रोग्रामिंग प्रतिमान है जो पासिंग पारसिगर के लिए स्टैक मशीन मॉडल पर निर्भर करता है। स्टैक-ओरिएंटेड भाषाएं एक या एक से अधिक स्टैक (डेटा संरचना) पर काम करती हैं, जिनमें से प्रत्येक एक भिन्न उद्देश्य को पूरा कर सकता है। अन्य प्रोग्रामिंग भाषाओं में प्रोग्रामिंग निर्माण को स्टैक-ओरिएंटेड प्रणाली में उपयोग के लिए संशोधित करने की आवश्यकता है।[1] कुछ स्टैक-ओरिएंटेड भाषाएं पोस्टफिक्स या रिवर्स पोलिश नोटेशन में काम करती हैं। किसी कमांड के लिए कोई भी तर्क या पैरामीटर उस कमांड से पहले बताए जाते है। उदाहरण के लिए, पोस्टफिक्स नोटेशन 2, 3, multiply के अतिरिक्त multiply, 2, 3 (उपसर्ग या पोलिश संकेतन), या 2 multiply 3 (इन्फ़िक्स संकेतन) लिखा जाता है। प्रोग्रामिंग भाषा फोर्थ (प्रोग्रामिंग भाषा), कारक (प्रोग्रामिंग भाषा), आरपीएल (प्रोग्रामिंग भाषा), परिशिष्ट भाग, बिबटेक्स स्टाइल डिज़ाइन भाषा[2] और कई कोडांतरण भाषाएं इस प्रतिमान को फिट करती हैं।

स्टैक आधारित एल्गोरिथ्म आंकड़ों के एक भाग का उपयोग स्टैक के ऊपर से करते हुए तथा स्टैक के ऊपर वापस डेटा को लौटाते हुए डेटा के बारे में विचार करते हैं। स्टैक प्रकलन ऑपरेटरों की आवश्यकता, स्टैक को डेटा में प्रकलन करने की अनुमति देता है। किसी कथन के प्रभाव पर बल देने के लिए, कथन के पहले और पश्चात में स्टैक के शीर्ष को दिखाते हुए एक टिप्पणी का उपयोग किया जाता है। इसे स्टैक प्रभाव आरेख के रूप में जाना जाता है।

पोस्टस्क्रिप्ट स्टैक अतिरिक्त उद्देश्यों के लिए भिन्न-भिन्न स्टैक पर विचार करते हैं। यह चर, शब्दकोशों, प्रक्रियाओं, कुछ विशिष्ट प्रक्रियाओं की शारीरिक रचना, नियंत्रण और प्रवाह पर विचार करता है। भाषा मॉडल का विश्लेषण अभिव्यक्तियों और प्रोग्रामों को सरल और सैद्धांतिक रूप से व्याख्या करने की अनुमति देता है।

स्टैक-आधारित कलन विधि

पोस्टस्क्रिप्ट पोस्टफिक्स स्टैक-आधारित भाषा का एक उदाहरण है। इस भाषा में एक अभिव्यक्ति 2 3 mul उदाहरण है। अभिव्यक्ति की गणना में यह समझना सम्मलित है कि स्टैक-आधारित कैसे काम करता है।

स्टैक-आधारित को निम्नलिखित कन्वेयर बेल्ट सादृश्य के रूप में प्रस्तुत किया जा सकता है। एक कन्वेयर बेल्ट (इनपुट) के अंत में, प्लेटें चिह्नित होती हैं जिन्हें 2, 3, और mul के अनुक्रम में रखा गया है। कन्वेयर के अंत में प्लेट (2) लिया जा सकता है, चूंकि अन्य प्लेटों को तब तक उपयोग नहीं किया जा सकता है जब तक कि अंत में प्लेट को हटा नहीं दिया जाये, प्लेटों को सिर्फ एक स्टैक में संग्रहीत किया जा सकता है, और इसे सिर्फ स्टैक से जोड़ा या हटाया जा सकता है, तथा इसे मध्य या नीचे से हटाया नहीं जा सकता है। खाली प्लेटों (और एक मार्कर) की आपूर्ति की जा सकती है और प्लेटों को स्थायी रूप से छोड़ दिया जा सकता है।

Human stack.svg

प्लेट 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 ऑपरेटर को ओवरराइड किया जा सकता है।

यह भी देखें

संदर्भ

  1. Luerweg, T. (2015). Stack based programming paradigms. Concepts of Programming Languages–CoPL’15, 33.
  2. Oren Patashnik, Designing BibTeX styles (PDF)[dead link]