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

From Vigyanwiki
No edit summary
Line 104: Line 104:


कार्यक्रम के प्रत्येक प्रमुख चरणों में से प्रत्येक को विघटित करना, स्टैक को दर्शाते हुए, गणना की गणना करना <code>fib(4)</code> :
कार्यक्रम के प्रत्येक प्रमुख चरणों में से प्रत्येक को विघटित करना, स्टैक को दर्शाते हुए, गणना की गणना करना <code>fib(4)</code> :
  स्टैक: 4
  stack: 4
  डुबकी
    dup
  स्टैक: 4 4
                stack: 4 4
  डुबकी
    dup
  स्टैक: 4 4 4
                stack: 4 4 4
  1 ईक
    1 eq
  स्टैक: 4 4 झूठी
                stack: 4 4 false
  आदान -प्रदान करना
    exch
  स्टैक: 4 झूठी 4
                stack: 4 false 4
  0 ईक
    0 eq
  स्टैक: 4 झूठी झूठी
                stack: 4 false false
  या
    or
  स्टैक: 4 झूठी
                stack: 4 false
  नहीं
    not
  स्टैक: 4 सच
                stack: 4 true
 


चूंकि अभिव्यक्ति सच का मूल्यांकन करती है, इसलिए आंतरिक प्रक्रिया का मूल्यांकन किया जाता है।
चूंकि अभिव्यक्ति सच का मूल्यांकन करती है, इसलिए आंतरिक प्रक्रिया का मूल्यांकन किया जाता है।
  स्टैक: 4
  stack: 4
  डुबकी
    dup
  स्टैक: 4 4
                stack: 4 4
  1 उप
    1 sub
  स्टैक: 4 3
                stack: 4 3
  मिथ्या
    fib
: (पुनरावर्ती कॉल यहाँ)
: ''(recursive call here)''
  स्टैक: 4 एफ (3)
                stack: 4 F(3)
  आदान -प्रदान करना
    exch
  स्टैक: एफ (3) 4
                stack: F(3) 4
  2 उप
    2 sub
  स्टैक: एफ (3) 2
                stack: F(3) 2
  मिथ्या
    fib
: (पुनरावर्ती कॉल यहाँ)
: ''(recursive call here)''
  स्टैक: एफ (3) एफ (2)
                stack: F(3) F(2)
  जोड़ना
    add
  स्टैक: एफ (3)+एफ (2)
                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> निम्नलिखित तरीके से विश्लेषण किया जाता है:
यह प्रक्रिया नामित चर का उपयोग नहीं करती है, विशुद्ध रूप से स्टैक।नामित चर का उपयोग करके बनाया जा सकता है <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> निम्नलिखित तरीके से विश्लेषण किया जाता है:
   ढेर: 3 /एन
   stack: 3 /n
  आदान -प्रदान करना
    exch
  स्टैक: /एन 3
                stack: /n 3
  डीईएफ़
    def
  स्टैक: खाली (इसे परिभाषित किया गया है)
                stack: ''empty'' (it has been defined)
  एन
    n
  स्टैक: 3
                stack: 3
  एन
    n
  स्टैक: 3 3
                stack: 3 3  
  एमयूएल
    mul
  स्टैक: 9
                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]]


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

Revision as of 12:03, 27 February 2023

स्टैक-ओरिएंटेड प्रोग्रामिंग, एक प्रोग्रामिंग प्रतिमान है जो पासिंग पारसिगर के लिए एक ढेर मशीन मॉडल पर निर्भर करता है।स्टैक-ओरिएंटेड भाषाएं एक या एक से अधिक स्टैक (डेटा संरचना) एस पर काम करती हैं, जिनमें से प्रत्येक एक अलग उद्देश्य की सेवा कर सकता है।अन्य प्रोग्रामिंग भाषाओं में प्रोग्रामिंग निर्माण को स्टैक-ओरिएंटेड सिस्टम में उपयोग के लिए संशोधित करने की आवश्यकता है।[1] कुछ स्टैक-ओरिएंटेड भाषाएं पोस्टफिक्स या रिवर्स पोलिश नोटेशन में काम करती हैं।किसी कमांड के लिए कोई भी तर्क या पैरामीटर उस कमांड से पहले बताए गए हैं।उदाहरण के लिए, पोस्टफिक्स नोटेशन लिखा जाएगा 2, 3, multiply के बजाय multiply, 2, 3 (उपसर्ग या पोलिश संकेतन), या 2 multiply 3 (Infix संकेतन)।प्रोग्रामिंग लैंग्वेज फोर्थ (प्रोग्रामिंग भाषा), कारक (प्रोग्रामिंग भाषा), आरपीएल (प्रोग्रामिंग भाषा), परिशिष्ट भाग, बिबटेक्स स्टाइल डिज़ाइन लैंग्वेज[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 एक नाम डेटा ऑब्जेक्ट है, जिसके साथ जोड़ा जा सकता है, उदाहरण के लिए, संख्या 42define ई> कमांड है def, इसलिए

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

यह भी देखें

संदर्भ

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