स्टैक ओरिएंटेड प्रोग्रामिंग: Difference between revisions
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>}} उदाहरण है । अभिव्यक्ति की गणना में यह समझना शामिल है कि ढेर-आधारित कैसे काम करता है। | ||
ढेर-आधारित को निम्नलिखित कन्वेयर बेल्ट सादृश्य के रूप में प्रस्तुत किया जा सकता है। एक कन्वेयर बेल्ट (इनपुट) के अंत में, प्लेटें चिह्नित होती हैं जिन्हें <code>2</code>, <code>3</code>, और <code>mul</code> के अनुक्रम में रखा गया है। कन्वेयर के अंत में प्लेट (<code>2</code>) लिया जा सकता है, हालांकि अन्य प्लेटों को तब तक उपयोग नहीं किया जा सकता है जब तक कि अंत में प्लेट को हटा नहीं दिया जाये, प्लेटों को केवल एक स्टैक में संग्रहीत किया जा सकता है, और इसे केवल स्टैक से जोड़ा या हटाया जा सकता है, तथा इसे मध्य या नीचे से हटाया नहीं जा सकता है। खाली प्लेटों (और एक मार्कर) की आपूर्ति की जा सकती है और प्लेटों को स्थायी रूप से छोड़ दिया जा सकता है। | |||
[[File:Human stack.svg|220px]] | [[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>) का परिणाम स्टैक के ऊपर प्लेट पर दिखाया गया है। | ||
गणना बिल्कुल उसी तरह से की जा सकती है और सही परिणाम प्राप्त | |||
यह एक बहुत ही सरल गणना है, क्या होगा अगर एक अधिक जटिल गणना की आवश्यकता है, जैसे {{nowrap|<code>(2 + 3) × 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>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> फ़ंक्शन का वर्णन किया गया है: | ||
<syntaxhighlight lang="forth">fib ( n -- n' )</syntaxhighlight> | <syntaxhighlight lang="forth">fib ( n -- n' )</syntaxhighlight> | ||
यह [[ | यह [[होरे तर्क]] में पूर्व शर्त और पश्च [[शर्त लगाने]] के बराबर है। जरूरी नहीं कि यह स्टैक-आधारित भाषाओं के संदर्भ में हो, दोनों टिप्पणियों को अभिकथन के रूप में भी संदर्भित किया जा सकता है। | ||
== पोस्टस्क्रिप्ट स्टैक == | == पोस्टस्क्रिप्ट स्टैक == | ||
पोस्टस्क्रिप्ट और कुछ अन्य स्टैक भाषाओं में अन्य उद्देश्यों के लिए अन्य अलग -अलग | पोस्टस्क्रिप्ट और कुछ अन्य स्टैक भाषाओं में अन्य उद्देश्यों के लिए अन्य अलग -अलग स्टैक हैं। | ||
=== चर और शब्दकोश === | === चर और शब्दकोश === | ||
विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका | विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका है। चर का कार्यान्वयन किसी भी प्रोग्रामिंग भाषा के लिए महत्वपूर्ण है, लेकिन स्टैक-उन्मुख भाषाओं के लिए यह विशेष चिंता का विषय है, क्योंकि डेटा के साथ बातचीत करने का केवल एक ही तरीका है। | ||
<code>/x 42 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>{</code> और <code>}</code>। | ||
उदाहरण के लिए, पोस्टस्क्रिप्ट सिंटैक्स में, | उदाहरण के लिए, पोस्टस्क्रिप्ट सिंटैक्स में, | ||
Line 179: | Line 177: | ||
== भाषा मॉडल का विश्लेषण == | == भाषा मॉडल का विश्लेषण == | ||
एक | एक ढेर-उन्मुख भाषा में प्रदान किए गए सरल मॉडल को अभिव्यक्तियों और प्रोग्रामों को बस और सैद्धांतिक रूप से बहुत तेजी से मूल्यांकन करने की अनुमति मिलती है, क्योंकि किसी भी सिंटैक्स विश्लेषण की आवश्यकता नहीं है, केवल शाब्दिक विश्लेषण।जिस तरह से इस तरह के प्रोग्रामों को लिखा जाता है, वह मशीनों द्वारा व्याख्या की जा रही है, यही वजह है कि पोस्टस्क्रिप्ट प्रिंटर को इसके उपयोग के लिए अच्छी तरह से सूट करता है।हालांकि, पोस्टस्क्रिप्ट प्रोग्राम लिखने का थोड़ा कृत्रिम तरीका ढेर-उन्मुख भाषाओं जैसे कि पोस्टस्क्रिप्ट को समझने के लिए एक प्रारंभिक बाधा बन सकता है। | ||
जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करने वाले विधि द्वारा छाया करने की क्षमता | जबकि इनबिल्ट और अन्य परिभाषाओं को ओवरराइड करने वाले विधि द्वारा छाया करने की क्षमता प्रोग्रामों को डिबग करने के लिए कठिन बना सकती है, और इस सुविधा के गैर -जिम्मेदार उपयोग से अप्रत्याशित व्यवहार हो सकता है, यह कुछ कार्यों को बहुत सरल बना सकता है।उदाहरण के लिए, पोस्टस्क्रिप्ट उपयोग में, <code>showpage</code> ऑपरेटर को एक कस्टम के साथ ओवरराइड किया जा सकता है जो एक कस्टम ऑपरेटर को परिभाषित करने या स्टाइल उत्पन्न करने के लिए कोड को दोहराने के बजाय पृष्ठ पर एक निश्चित शैली लागू करता है। | ||
== यह भी देखें == | == यह भी देखें == |
Revision as of 09: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
स्टैक पर एक पुनरावर्ती परिभाषा का उपयोग किया जाता है।Fibonacci संख्या फ़ंक्शन एक तर्क लेता है।सबसे पहले, यह 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
- (recursive call here)
stack: 4 F(3) exch stack: F(3) 4 2 sub stack: F(3) 2 fib
- (recursive call here)
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
जो अपेक्षित परिणाम है।
नियंत्रण और प्रवाह
चूंकि अनाम प्रक्रियाएं मौजूद हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है।IF-SHEN-ELSE स्टेटमेंट के लिए डेटा के तीन टुकड़ों की आवश्यकता होती है: एक स्थिति, यदि स्थिति सही है, तो एक प्रक्रिया की जानी है, और यदि स्थिति गलत है तो एक किया जाना है।उदाहरण के लिए पोस्टस्क्रिप्ट में,
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]