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

From Vigyanwiki

ढेर-उन्मुख प्रोग्रामिंग, एक प्रोग्रामिंग प्रतिमान है जो पासिंग पारसिगर के लिए ढेर मशीन मॉडल पर निर्भर करता है। ढेर-उन्मुख भाषाएं एक या एक से अधिक स्टैक (डेटा संरचना) पर काम करती हैं, जिनमें से प्रत्येक एक अलग उद्देश्य को पूरा कर सकता है। अन्य प्रोग्रामिंग भाषाओं में प्रोग्रामिंग निर्माण को ढेर-उन्मुख प्रणाली में उपयोग के लिए संशोधित करने की आवश्यकता है।[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]