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

From Vigyanwiki
No edit summary
No edit summary
Line 67: Line 67:
विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका है। चर का कार्यान्वयन किसी भी प्रोग्रामिंग भाषा के लिए महत्वपूर्ण है, लेकिन स्टैक-उन्मुख भाषाओं के लिए यह विशेष चिंता का विषय है, क्योंकि डेटा के साथ बातचीत करने का केवल एक ही तरीका है।
विभिन्न अभिव्यक्तियों के मूल्यांकन का पहले ही विश्लेषण किया जा चुका है। चर का कार्यान्वयन किसी भी प्रोग्रामिंग भाषा के लिए महत्वपूर्ण है, लेकिन स्टैक-उन्मुख भाषाओं के लिए यह विशेष चिंता का विषय है, क्योंकि डेटा के साथ बातचीत करने का केवल एक ही तरीका है।


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


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


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


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


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


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


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


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


Line 99: 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  
Line 118: Line 119:
                 stack: 4 true
                 stack: 4 true


 
चूंकि अभिव्यक्ति सत्य का मूल्यांकन करती है, आंतरिक प्रक्रिया का मूल्यांकन किया जाता है।
चूंकि अभिव्यक्ति सच का मूल्यांकन करती है, इसलिए आंतरिक प्रक्रिया का मूल्यांकन किया जाता है।
   stack: 4
   stack: 4
     dup  
     dup  
Line 126: Line 126:
                 stack: 4 3
                 stack: 4 3
     fib
     fib
: ''(recursive call here)''
: ''(यहाँ पुनरावर्ती कॉल)''
                 stack: 4 F(3)
                 stack: 4 F(3)
     exch  
     exch  
Line 133: Line 133:
                 stack: F(3) 2
                 stack: F(3) 2
     fib
     fib
: ''(recursive call here)''
: ''(यहाँ पुनरावर्ती कॉल)''
                 stack: F(3) F(2)
                 stack: F(3) F(2)
     add
     add
Line 139: Line 139:
जो अपेक्षित परिणाम है।
जो अपेक्षित परिणाम है।


यह प्रक्रिया नामित चर का उपयोग नहीं करती है, विशुद्ध रूप से स्टैक।नामित चर का उपयोग करके बनाया जा सकता है <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> निम्नलिखित तरीके से विश्लेषण किया जाता है:
यह प्रक्रिया पूरी तरह से स्टैक नाम के चर का उपयोग नहीं करती है, नामित चर <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  
   stack: 3 /n  
     exch  
     exch  
Line 166: Line 166:
=== नियंत्रण और प्रवाह ===
=== नियंत्रण और प्रवाह ===
चूंकि अनाम प्रक्रियाएं मौजूद हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है।IF-SHEN-ELSE स्टेटमेंट के लिए डेटा के तीन टुकड़ों की आवश्यकता होती है: एक स्थिति, यदि स्थिति सही है, तो एक प्रक्रिया की जानी है, और यदि स्थिति गलत है तो एक किया जाना है।उदाहरण के लिए पोस्टस्क्रिप्ट में,
चूंकि अनाम प्रक्रियाएं मौजूद हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है।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 177: Line 179:


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


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


== यह भी देखें ==
== यह भी देखें ==

Revision as of 22:18, 2 March 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

जो अपेक्षित परिणाम है।

नियंत्रण और प्रवाह

चूंकि अनाम प्रक्रियाएं मौजूद हैं, प्रवाह नियंत्रण स्वाभाविक रूप से उत्पन्न हो सकता है।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 ऑपरेटर को ओवरराइड किया जा सकता है।

यह भी देखें

संदर्भ

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