स्टैक मशीन: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(6 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|Type of computer}}
{{Short description|Type of computer}}
{{For|stack machines in automata theory|Pushdown automaton}}
[[कंप्यूटर विज्ञान]], [[कंप्यूटर इंजीनियरिंग]] और प्रोग्रामिंग भाषा के कार्यान्वयन में '''स्टैक मशीन''' मुख्य रूप से [[कंप्यूटर प्रोसेसर]] या [[आभासी मशीन|वर्चुअल मशीन]] के रूप में उपयोग किया जाता हैं जिसमें प्राथमिक इंटरैक्शन को पुश डाउन स्टैक (अमूर्त डेटा प्रकार) से अल्पकालिक अस्थायी मानों में स्थानांतरित किया जाता हैं। हार्डवेयर प्रोसेसर की स्थिति में, [[हार्डवेयर ढेर|हार्डवेयर सेट]] का उपयोग किया जाता है। स्टैक का उपयोग [[प्रोसेसर रजिस्टर]] की आवश्यक संख्या को महत्वपूर्ण रूप से कम कर देता है। स्टैक मशीनें इसके अतिरिक्त लोड/स्टोर संचालन या एकाधिक स्टैक के साथ [[पुश-डाउन ऑटोमेटा]] का विस्तार करती हैं और इसलिए इसमें [[ट्यूरिंग-पूर्ण|ट्यूरिंग चरण पूर्ण]] रूप से सम्मलित हैं।
[[कंप्यूटर विज्ञान]], [[कंप्यूटर इंजीनियरिंग]] और प्रोग्रामिंग भाषा के कार्यान्वयन में, एक स्टैक मशीन एक [[कंप्यूटर प्रोसेसर]] या एक [[आभासी मशीन]] है जिसमें प्राथमिक इंटरैक्शन एक पुश डाउन स्टैक (अमूर्त डेटा प्रकार) से अल्पकालिक अस्थायी मानों को स्थानांतरित कर रहा है। हार्डवेयर प्रोसेसर के मामले में, [[हार्डवेयर ढेर]] का उपयोग किया जाता है। स्टैक का उपयोग [[प्रोसेसर रजिस्टर]]ों की आवश्यक संख्या को महत्वपूर्ण रूप से कम कर देता है। स्टैक मशीनें अतिरिक्त लोड/स्टोर संचालन या एकाधिक स्टैक के साथ [[पुश-डाउन ऑटोमेटा]] का विस्तार करती हैं और इसलिए [[ट्यूरिंग-पूर्ण]] हैं।


== डिजाइन ==
== डिजाइन ==
अधिकांश या सभी स्टैक मशीन निर्देश मानते हैं कि ऑपरेंड स्टैक से होंगे, और परिणाम स्टैक में रखे जाएंगे। स्टैक आसानी से दो से अधिक इनपुट या एक से अधिक परिणाम रखता है, इसलिए संचालन के एक समृद्ध सेट की गणना की जा सकती है। स्टैक मशीन कोड (कभी-कभी [[पी-कोड]] कहा जाता है) में, निर्देशों में अक्सर केवल एक [[opcode]] होता है जो एक ऑपरेशन को कमांड करता है, बिना किसी अतिरिक्त फ़ील्ड के एक स्थिर, रजिस्टर या मेमोरी सेल की पहचान करता है, जिसे शून्य पता प्रारूप के रूप में जाना जाता है।<ref name="Beard_1997"/>यह निर्देश डिकोडिंग को बहुत सरल करता है। शाखाएं, तत्काल लोड, और लोड/स्टोर निर्देशों के लिए एक तर्क क्षेत्र की आवश्यकता होती है, लेकिन स्टैक मशीनें अक्सर यह व्यवस्था करती हैं कि इनमें से अक्सर मामले [[अंश]] के एक कॉम्पैक्ट समूह में ओपकोड के साथ फिट होते हैं। निर्देशों का आदेश देकर पूर्व परिणामों से ऑपरेंड का चयन निहित रूप से किया जाता है। कुछ स्टैक मशीन निर्देश सेट सीधे हार्डवेयर चलाने के बजाय वर्चुअल मशीन के व्याख्यात्मक निष्पादन के लिए अभिप्रेत हैं।
अधिकांश या सभी स्टैक मशीन निर्देश मानते हैं कि ऑपरेंड स्टैक से होंगे और परिणाम स्टैक में रखे जाते हैं। इस प्रकार स्टैक सरलता से दो से अधिक इनपुट या से अधिक परिणाम देता है, इसलिए संचालन के समृद्ध सेट की गणना की जा सकती है। इस प्रकार स्टैक मशीन कोड (कभी-कभी [[पी-कोड]] कहा जाता है) में, निर्देशों में अधिकांशतः केवल [[opcode|ओपी कोड]] होता है जो होने वाले विभिन्न ऑपरेशन को कमांड करता है, इस प्रकार बिना किसी अतिरिक्त फ़ील्ड के स्थिर, रजिस्टर या मेमोरी सेल की पहचान करता है, जिसे शून्य पता प्रारूप के रूप में जाना जाता है।<ref name="Beard_1997"/> इस प्रकार यह निर्देश डिकोडिंग को बहुत सरलता से करता है। ये शाखाएं, तत्काल लोड, और लोड/स्टोर निर्देशों के लिए तर्क क्षेत्र की आवश्यकता होती है, किन्तु स्टैक मशीनें अधिकांशतः यह व्यवस्था करती हैं कि इनमें से अधिकांशतः इस स्थिति में मिलने वाले [[अंश]] के कॉम्पैक्ट समूह में ओपकोड के साथ फिट होते हैं। इन निर्देशों को आदेश देकर पूर्व परिणामों से ऑपरेंड का चयन निहित रूप से किया जाता है। इस प्रकार कुछ स्टैक मशीन निर्देश सेट सीधे हार्डवेयर चलाने के अतिरिक्त वर्चुअल मशीन के व्याख्यात्मक निष्पादन के लिए अभिप्रेत हैं।


पूर्णांक स्थिरांक ऑपरेंड द्वारा धकेले जाते हैं {{code|Push}} या {{code|Load Immediate}} निर्देश। मेमोरी को अक्सर अलग से एक्सेस किया जाता है {{code|Load}} या {{code|Store}} स्मृति पता युक्त निर्देश या ढेर में मानों से पते की गणना करना। सभी व्यावहारिक स्टैक मशीनों में स्पष्ट पते की गणना के बिना [[स्थानीय चर]] और औपचारिक मापदंडों तक पहुँचने के लिए लोड-स्टोर ऑपकोड के वेरिएंट होते हैं। यह वर्तमान टॉप-ऑफ़-स्टैक पते से ऑफ़सेट द्वारा या स्थिर फ़्रेम-बेस रजिस्टर से ऑफ़सेट द्वारा हो सकता है।
पूर्णांक स्थिरांक ऑपरेंड {{code|Push}} या {{code|Load Immediate}} निर्देश द्वारा धकेले जाते हैं। इस प्रकार मेमोरी को अधिकांशतः अलग से {{code|Load}} या {{code|Store}} स्मृति पता युक्त निर्देश या ढेर में मानों से पते की गणना करने के लिए एक्सेस किया जाता है । इस प्रकार सभी व्यावहारिक स्टैक मशीनों में स्पष्ट पते की गणना के बिना [[स्थानीय चर]] और औपचारिक मापदंडों तक पहुँचने के लिए लोड-स्टोर ऑपकोड के वेरिएंट होते हैं। यह वर्तमान टॉप-ऑफ़-स्टैक पते से ऑफ़सेट द्वारा या स्थिर फ़्रेम-बेस रजिस्टर से ऑफ़सेट द्वारा हो सकता है।


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


[[File:AST binary tree arith variables.svg|thumb|व्यंजक A*(B-C) + (D+E) के लिए बाइनरी सिंटैक्स ट्री]]उदाहरण के लिए, अभिव्यक्ति A*(B-C)+(D+E) पर विचार करें, जिसे रिवर्स पोलिश नोटेशन में A B C - * D E + + के रूप में लिखा गया है। एक साधारण काल्पनिक स्टैक मशीन पर इसे संकलित करना और चलाना इसका रूप ले लेगा:
[[File:AST binary tree arith variables.svg|thumb|व्यंजक A*(B-C) + (D+E) के लिए बाइनरी सिंटैक्स ट्री]]उदाहरण के लिए, अभिव्यक्ति A*(B-C)+(D+E) पर विचार करें, जिसे रिवर्स पोलिश नोटेशन में A B C - * D E + + के रूप में लिखा गया है। इस प्रकार साधारण काल्पनिक स्टैक मशीन पर इसे संकलित करना और रन करने के लिए इसका रूप ले लेगा जो इस प्रकार होगा:


                  # ढेर सामग्री (बाएं सबसे = शीर्ष = सबसे हाल):
      # stack contents (leftmost = top = most recent):
  पुश ए # ए
  पुश बी # बी ए
  धक्का सी # सी बी ए
  घटाना # बी-सी ए
  गुणा # ए * (बी-सी)
  पुश डी # डीए * (बी-सी)
  धक्का ई # ई डी ए*(बी-सी)
  # डी+ई ए*(बी-सी) जोड़ें
  # ए*(बी-सी)+(डी+ई) जोड़ें


स्टैक के दो सबसे ऊपरी ऑपरेंड पर अंकगणितीय ऑपरेशन 'घटाना', 'गुणा' और 'जोड़ना' कार्य करते हैं। कंप्यूटर स्टैक के सबसे ऊपरी (सबसे हाल के) मानों से दोनों ऑपरेंड लेता है। कंप्यूटर उन दो मानों को परिकलित अंतर, योग या उत्पाद से बदल देता है। दूसरे शब्दों में निर्देश के ऑपरेंड को स्टैक से पॉपअप किया जाता है, और इसके परिणाम (ओं) को फिर स्टैक पर वापस धकेल दिया जाता है, जो अगले निर्देश के लिए तैयार होता है।
  push A  #  A
  push B  #  B  A
  push C  # C B  A
  subtract  #  B-C A
  multiply  #  A*(B-C)
  push D  #  D  A*(B-C)
  push E  # E D  A*(B-C)
  add    #  D+E A*(B-C)


स्टैक मशीनों में उनके एक्सप्रेशन स्टैक और उनके [[कॉल स्टैक]] | कॉल-रिटर्न स्टैक अलग या एक एकीकृत संरचना के रूप में हो सकते हैं। यदि उन्हें अलग किया जाता है, तो स्टैक मशीन के निर्देश कम अंतःक्रियाओं और कम डिज़ाइन जटिलता के साथ [[निर्देश पाइपलाइनिंग]] हो सकते हैं, इसलिए यह आमतौर पर तेज़ी से चलेगा।
स्टैक के दो सबसे ऊपरी ऑपरेंड पर अंकगणितीय ऑपरेशन 'घटाना', 'गुणा' और 'जोड़ना' कार्य करते हैं। कंप्यूटर स्टैक के सबसे ऊपरी (वर्तमान के) मानों से दोनों ऑपरेंड लेता है। कंप्यूटर उन दो मानों को परिकलित अंतर, योग या उत्पाद से परिवर्तित कर देता हैं। दूसरे शब्दों में निर्देश के ऑपरेंड को स्टैक से पॉपअप किया जाता है, और इस प्रकार इसके परिणाम (ओं) को पुनः स्टैक करके वापस धकेल देता हैं, जो अगले निर्देश के लिए तैयार होता है।


संकलित स्टैक कोड का अनुकूलन काफी संभव है। कंपाइलर आउटपुट के बैक-एंड ऑप्टिमाइज़ेशन को कोड में महत्वपूर्ण सुधार करने के लिए प्रदर्शित किया गया है,<ref name="Koopman_1994"/><ref name="Bailey_2000"/>और संभावित प्रदर्शन, जबकि संकलक के भीतर वैश्विक अनुकूलन आगे लाभ प्राप्त करता है।<ref name="Shannon-Bailey_2006"/>
स्टैक मशीनों में उनके एक्सप्रेशन स्टैक और उनके [[कॉल स्टैक]] या कॉल-रिटर्न स्टैक अलग या एकीकृत संरचना के रूप में संलग्न हो सकते हैं। यदि उन्हें अलग किया जाता है, तो स्टैक मशीन के निर्देश कम अंतःक्रियाओं और कम डिज़ाइन जटिलता के साथ [[निर्देश पाइपलाइनिंग]] हो सकते हैं, इसलिए यह सामान्यतः तेज़ी से रन करने लगता हैं।
=== ढेर भंडारण ===
कुछ स्टैक मशीनों में सीमित आकार का स्टैक होता है, जिसे एक रजिस्टर फ़ाइल के रूप में कार्यान्वित किया जाता है। ALU इसे एक इंडेक्स के साथ एक्सेस करेगा। एक बड़ी रजिस्टर फाइल बहुत सारे ट्रांजिस्टर का उपयोग करती है और इसलिए यह विधि केवल छोटे सिस्टम के लिए उपयुक्त है। कुछ मशीनों में मेमोरी में एक्सप्रेशन स्टैक और एक अलग रजिस्टर स्टैक दोनों होते हैं। इस स्थिति में, सॉफ़्टवेयर या कोई व्यवधान उनके बीच डेटा स्थानांतरित कर सकता है। कुछ मशीनों में असीमित आकार का ढेर होता है, जिसे रैम में एक सरणी के रूप में कार्यान्वित किया जाता है, जो मेमोरी एक्सेस को कम करने के लिए स्टैक एड्रेस रजिस्टरों के कुछ शीर्ष द्वारा कैश किया जाता है। मेमोरी निर्देशों से स्पष्ट लोड को छोड़कर, ऑपरेंड उपयोग का क्रम डेटा स्टैक में ऑपरेंड के क्रम के समान होता है, इसलिए उत्कृष्ट प्रीफेचिंग आसानी से पूरा किया जा सकता है।


विचार करना {{code|X+1}}. यह संकलित करता है {{code|Load X}}; {{code|Load 1}}; {{code|Add}}. रैम में पूरी तरह से संग्रहीत स्टैक के साथ, यह इन-मेमोरी स्टैक को लिखता और पढ़ता है:
संकलित स्टैक कोड का अनुकूलन अधिक संभव है। इस प्रकार कंपाइलर आउटपुट के बैक-एंड ऑप्टिमाइज़ेशन को कोड में महत्वपूर्ण सुधार करने के लिए प्रदर्शित किया गया है,<ref name="Koopman_1994" /><ref name="Bailey_2000" />और संभावित प्रदर्शन, जबकि संकलक के भीतर वैश्विक अनुकूलन आगे लाभ प्राप्त करता है।<ref name="Shannon-Bailey_2006" />
* एक्स लोड करें, मेमोरी को पुश करें
=== भंडारण ===
* लोड 1, मेमोरी में पुश करें
कुछ स्टैक मशीनों में सीमित आकार का स्टैक होता है, जिसे रजिस्टर फ़ाइल के रूप में कार्यान्वित किया जाता है। एएलयू इसे इंडेक्स के साथ एक्सेस करेगा। किसी बड़ी रजिस्टर फाइल पर बहुत सारे ट्रांजिस्टर का उपयोग करती है और इसलिए यह विधि केवल छोटे सिस्टम के लिए उपयुक्त है। कुछ मशीनों में मेमोरी में एक्सप्रेशन स्टैक और अलग रजिस्टर स्टैक दोनों होते हैं। इस प्रकार इस स्थिति में, सॉफ़्टवेयर या कोई व्यवधान उनके बीच डेटा स्थानांतरित कर सकता है। कुछ मशीनों में असीमित आकार का ढेर होता है, जिसे रैम में सरणी के रूप में कार्यान्वित किया जाता है, जो इस प्रकार मेमोरी एक्सेस को कम करने के लिए स्टैक एड्रेस रजिस्टरों के कुछ शीर्ष द्वारा कैश किया जाता है। इस प्रकार मेमोरी निर्देशों से स्पष्ट लोड को छोड़कर, ऑपरेंड उपयोग का क्रम डेटा स्टैक में ऑपरेंड के क्रम के समान होता है, इसलिए उत्कृष्ट प्रीफेचिंग सरलता से पूरा किया जा सकता है।
* मेमोरी से 2 मान पॉप करें, परिणाम जोड़ें और मेमोरी में पुश करें
कुल 5 डेटा कैश संदर्भों के लिए।


इससे अगला कदम एक स्टैक मशीन या इंटरप्रेटर है जिसमें सिंगल टॉप-ऑफ-स्टैक रजिस्टर होता है। उपरोक्त कोड तब करता है:
इस पर विचार करे- {{code|X+1}} यह संकलित करता है कि {{code|Load X}}. {{code|Load 1}}. {{code|Add}} रैम में पूर्ण रूप से संग्रहीत स्टैक के साथ, यह इन-मेमोरी स्टैक को लिखता और पढ़ता है:
* एक्स को खाली टीओएस रजिस्टर (यदि हार्डवेयर मशीन है) में लोड करें या टीओएस रजिस्टर को मेमोरी में पुश करें, एक्स को टीओएस रजिस्टर में लोड करें (यदि दुभाषिया है)
* एक्स लोड करें, मेमोरी को पुश किया जाता हैं
* TOS रजिस्टर को मेमोरी में पुश करें, 1 को TOS रजिस्टर में लोड करें
* लोड 1, मेमोरी में पुश करते हैं
* मेमोरी से लेफ्ट ऑपरेंड पॉप करें, टीओएस रजिस्टर में जोड़ें और इसे वहीं छोड़ दें
* मेमोरी से 2 मान पॉप करके प्राप्त परिणाम को जोड़कर बाद में मेमोरी में पुश कर देते हैं।
कुल 5 डेटा कैश संदर्भों के लिए, सबसे खराब स्थिति। आम तौर पर, दुभाषिए शून्यता को ट्रैक नहीं करते हैं, क्योंकि उनके पास नहीं है- स्टैक पॉइंटर के नीचे कुछ भी एक गैर-खाली मान है, और टीओएस कैश रजिस्टर हमेशा गर्म रखा जाता है। विशिष्ट जावा दुभाषिए इस तरह से टॉप-ऑफ़-स्टैक को बफ़र नहीं करते हैं, हालाँकि, क्योंकि प्रोग्राम और स्टैक में छोटे और विस्तृत डेटा मानों का मिश्रण होता है।
कुल 5 डेटा कैश संदर्भों के लिए इसका उपयोग किया जाता हैं।


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


== इतिहास और कार्यान्वयन ==
== इतिहास और कार्यान्वयन ==
इस तरह की एक विधि का विवरण जिसमें रजिस्टरों में एक समय में केवल दो मानों की आवश्यकता होती है, पूर्व-निर्धारित ऑपरेंडों के एक सीमित सेट के साथ, जो आगे ऑपरेंड, फ़ंक्शंस और सबरूटीन्स की परिभाषा द्वारा विस्तारित करने में सक्षम थे, पहले रॉबर्ट द्वारा सम्मेलन में प्रदान किया गया था। 1961 में एस बार्टन।<ref name="Barton_1961"/><ref name="Barton_1987"/>
इस तरह की विधि का विवरण जिसमें रजिस्टरों में समय में केवल दो मानों की आवश्यकता होती है, इस प्रकार पूर्व-निर्धारित ऑपरेंडों के सीमित सेट के साथ, जो आगे ऑपरेंड, फ़ंक्शंस और सबरूटीन्स की परिभाषा द्वारा विस्तारित करने में सक्षम थे, पहले रॉबर्ट ने 1961 में एस बार्टन द्वारा सम्मेलन में प्रदान किया गया था।<ref name="Barton_1961"/><ref name="Barton_1987"/>
=== वाणिज्यिक ढेर मशीनें ===
=== वाणिज्यिक संग्रहित मशीनें ===
{{see also|High-level language computer architecture}}
{{see also|उच्च स्तरीय भाषा कंप्यूटर संरचना}}
हार्डवेयर में सीधे क्रियान्वित स्टैक निर्देश सेट के उदाहरणों में शामिल हैं
 
* [[कोनराड ज़्यूस]] द्वारा [[Z4 (कंप्यूटर)]] (1945) कंप्यूटर।<ref name="Blaauw-Brooks_1997"/><ref name="LaForest_2007"/>* [[बरोज़ लार्ज सिस्टम्स]] आर्किटेक्चर (1961 से)
हार्डवेयर में सीधे क्रियान्वित स्टैक निर्देश सेट के उदाहरणों में सम्मलित हैं
* [[अंग्रेजी इलेक्ट्रिक KDF9]] मशीन। पहली बार 1964 में वितरित, KDF9 में अंकगणितीय रजिस्टरों का 19-स्तरीय गहरा पुशडाउन स्टैक था, और सबरूटीन रिटर्न पतों के लिए 17-स्तरीय गहरा स्टैक था।
* [[कोनराड ज़्यूस]] द्वारा [[Z4 (कंप्यूटर)]] (1945) कंप्यूटर की संरचना की गई।<ref name="Blaauw-Brooks_1997"/><ref name="LaForest_2007"/>* [[बरोज़ लार्ज सिस्टम्स]] संरचना (1961 से)
* [[कोलिन्स रेडियो]] [[कोलिन्स अनुकूली प्रसंस्करण प्रणाली]] मिनीकंप्यूटर (CAPS, 1969 से) और [[रॉकवेल कॉलिन्स]] [[उन्नत वास्तुकला माइक्रोप्रोसेसर]] (AAMP, 1981 से)।<ref name="Greve-Wilding_1998"/>* [[ज़ेरॉक्स डेब्रेक]] ने 27 अप्रैल 1981 को स्मृति को बचाने के लिए एक स्टैक मशीन आर्किटेक्चर का उपयोग किया।<ref name="Xerox_Mesa"/><ref name="DigiBarn_Star"/>* [[यूसीएसडी पास्कल]] पी-मशीन ([[पास्कल माइक्रोइंजिन]] और कई अन्य के रूप में) ने वर्चुअल स्टैक मशीन को संकलित करके खराब निर्देश सेट और थोड़ी सी रैम के साथ शुरुआती 8-बिट माइक्रोप्रोसेसरों पर एक पूर्ण छात्र प्रोग्रामिंग वातावरण का समर्थन किया।
* [[अंग्रेजी इलेक्ट्रिक KDF9]] मशीन को पहली बार 1964 में वितरित, KDF9 में अंकगणितीय रजिस्टरों का 19-स्तरीय डीप पुशडाउन स्टैक था, और सबरूटीन रिटर्न पतों के लिए 17-स्तरीय गहरा स्टैक था।
* [[मैनचेस्टर कंप्यूटर]] और [[आईसीएल 2900 सीरीज]]हाइब्रिड स्टैक और संचायक मशीनें। संचायक रजिस्टर ने मेमोरी स्टैक के शीर्ष डेटा मान को बफ़र किया। लोड और स्टोर ऑपकोड के वैरिएंट नियंत्रित होते हैं जब उस रजिस्टर को मेमोरी स्टैक में डाला जाता है या वहां से फिर से लोड किया जाता है।
* [[कोलिन्स रेडियो]] [[कोलिन्स अनुकूली प्रसंस्करण प्रणाली]] मिनीकंप्यूटर (CAPS, 1969 से) और [[रॉकवेल कॉलिन्स]] [[उन्नत वास्तुकला माइक्रोप्रोसेसर]] (AAMP, 1981 से)।<ref name="Greve-Wilding_1998"/>* [[ज़ेरॉक्स डेब्रेक]] ने 27 अप्रैल 1981 को स्मृति को बचाने के लिए स्टैक मशीन संरचना का उपयोग किया।<ref name="Xerox_Mesa"/><ref name="DigiBarn_Star"/>* [[यूसीएसडी पास्कल]] पी-मशीन ([[पास्कल माइक्रोइंजिन]] और कई अन्य के रूप में) ने वर्चुअल स्टैक मशीन को संकलित करके खराब निर्देश सेट और थोड़ी सी रैम के साथ प्रारंभिक 8-बिट माइक्रोप्रोसेसरों पर पूर्ण छात्र प्रोग्रामिंग वातावरण का समर्थन किया था।
* [[मैनचेस्टर कंप्यूटर]] और [[आईसीएल 2900 सीरीज]] के रूप में हाइब्रिड स्टैक और संचायक मशीनों का उपयोग किया गया था। इस प्रकार संचायक रजिस्टर ने मेमोरी स्टैक के शीर्ष डेटा मान को बफ़र किया गया हैं। लोड और स्टोर ऑपकोड के वैरिएंट नियंत्रित होते हैं जब उस रजिस्टर को मेमोरी स्टैक में डाला जाता है या वहां से फिर से लोड किया जाता है।
* [[एचपी 3000]] (क्लासिक, पीए-आरआईएससी नहीं)
* [[एचपी 3000]] (क्लासिक, पीए-आरआईएससी नहीं)
* मिलकर कंप्यूटर टी/16। एचपी 3000 की तरह, सिवाय इसके कि कंपाइलर्स, माइक्रोकोड नहीं, जब रजिस्टर स्टैक को मेमोरी स्टैक में फैलाया जाता है या मेमोरी स्टैक से रिफिल किया जाता है।
* मिलकर कंप्यूटर टी/16। एचपी 3000 की तरह, इसके अतिरिक्त कंपाइलर्स, माइक्रोकोड नहीं, जब रजिस्टर स्टैक को मेमोरी स्टैक में फैलाया जाता है या मेमोरी स्टैक से रिफिल किया जाता है।
* [[Atmel]] [[MARC4]] [[microcontroller]]<ref name="MARC4"/>* कई फोर्थ चिप्स<ref name="Colorforth"/>जैसे RTX2000, [[RTX2010]], F21<ref name="UT_F21"/>और [[प्रज्वलित (माइक्रोप्रोसेसर)]]<ref name="ForthHub_2017"/><ref name="Java_1999"/>* [[सेतुन]] [[टर्नरी कंप्यूटर]] ने स्टैक का उपयोग करके [[संतुलित टर्नरी]] का प्रदर्शन किया।
* [[Atmel|ऐटमेल]] [[MARC4|मार्क4]] [[माइक्रोकंट्रोलर]]<ref name="MARC4"/>* कई फोर्थ चिप्स<ref name="Colorforth"/>जैसे आरटीएक्स2000, [[RTX2010|आरटीएक्स2010]], एफ21<ref name="UT_F21"/>और [[प्रज्वलित (माइक्रोप्रोसेसर)]]<ref name="ForthHub_2017"/><ref name="Java_1999"/>* [[सेतुन]] [[टर्नरी कंप्यूटर]] ने स्टैक का उपयोग करके [[संतुलित टर्नरी]] का प्रदर्शन किया था।
* बर्न्ड पैसन के 4स्टैक प्रोसेसर में चार स्टैक हैं।<ref name="Paysan_4Stack"/>* चार्ल्स एच. मूर द्वारा डिजाइन की गई पैट्रियट साइंटिफिक की इग्नाइट (माइक्रोप्रोसेसर) स्टैक मशीन एक प्रमुख कार्यात्मक घनत्व बेंचमार्क रखती है।
* बर्न्ड पैसन के 4स्टैक प्रोसेसर में चार स्टैक हैं।<ref name="Paysan_4Stack"/>* चार्ल्स एच. मूर द्वारा डिजाइन की गई पैट्रियट साइंटिफिक की इग्नाइट (माइक्रोप्रोसेसर) स्टैक मशीन प्रमुख कार्यात्मक घनत्व बेंचमार्क रखती है।
* [[साब एरिक्सन स्पेस]] थोर [[विकिरण कठोर]] माइक्रोप्रोसेसर<ref name="Lundqvist_1995"/>* [[इनमोस]] [[transputer]]्स।
* [[साब एरिक्सन स्पेस]] थोर [[विकिरण कठोर]] माइक्रोप्रोसेसर<ref name="Lundqvist_1995"/>* [[इनमोस]] [[transputer|ट्रांसप्यूटर्स]] के रूप में उपयोग किया गया है।
* [[ZPU (माइक्रोप्रोसेसर)]] भौतिक रूप से छोटा CPU जिसे [[FPGA]] सिस्टम की देखरेख के लिए डिज़ाइन किया गया है।<ref name="ZPU"/>* GreenArrays, Inc. से 144-प्रोसेसर GA144 चिप का F18A आर्किटेक्चर।<ref name="GreenArrays_1"/><ref name="Colorforth_F18A"/><ref name="GreenArrays_2"/>*कुछ तकनीकी हैंडहेल्ड कैलकुलेटर अपने कीबोर्ड इंटरफ़ेस में कोष्ठक कुंजियों के बजाय रिवर्स पोलिश नोटेशन का उपयोग करते हैं। यह स्टैक मशीन का एक रूप है। प्लस कुंजी इसके दो ऑपरेंड पर निर्भर करती है जो पहले से ही उपयोगकर्ता-दृश्यमान स्टैक के सही शीर्ष स्थान पर हैं।
* [[ZPU (माइक्रोप्रोसेसर)|जेडपीयू (माइक्रोप्रोसेसर)]] भौतिक रूप से छोटा सीपीयू जिसे [[FPGA|एफपीजीए (FPGA)]] सिस्टम की देखरेख के लिए डिज़ाइन किया गया है।<ref name="ZPU"/>* ग्रीन ऐरेज इंक से 144-प्रोसेसर जीए144 चिप का एफ18ए संरचना में किया जाता हैं।<ref name="GreenArrays_1"/><ref name="Colorforth_F18A"/><ref name="GreenArrays_2"/>*कुछ तकनीकी हैंडहेल्ड कैलकुलेटर अपने कीबोर्ड इंटरफ़ेस में कोष्ठक कुंजियों के अतिरिक्त रिवर्स पोलिश नोटेशन का उपयोग करते हैं। यह स्टैक मशीन का रूप है। प्लस कुंजी इसके दो ऑपरेंड पर निर्भर करती है जो पहले से ही उपयोगकर्ता-दृश्यमान स्टैक के सही शीर्ष स्थान पर हैं।


=== वर्चुअल स्टैक मशीनें ===
=== वर्चुअल स्टैक मशीनें ===
सॉफ़्टवेयर में व्याख्या की गई वर्चुअल मशीन स्टैक मशीनों के उदाहरण:
सॉफ़्टवेयर में व्याख्या की गई वर्चुअल मशीन स्टैक मशीनों के उदाहरण:
* द [[वेटस्टोन (बेंचमार्क)]] [[ALGOL 60]] व्याख्यात्मक कोड,<ref name="Randell-Russell_1964"/>जिस पर बरोज़ B6500 की कुछ विशेषताएँ आधारित थीं
* द [[वेटस्टोन (बेंचमार्क)]] [[ALGOL 60]] व्याख्यात्मक कोड,<ref name="Randell-Russell_1964"/>जिस पर बरोज़ B6500 की कुछ विशेषताएँ आधारित थीं
* यूसीएसडी पास्कल पी-मशीन; जो काफी हद तक बरोज़ से मिलता जुलता था
* यूसीएसडी पास्कल पी-मशीन. जो अधिक सीमा तक बरोज़ से मिलता जुलता था
* पी-कोड मशीन#उदाहरण मशीन|निकलॉस विर्थ पी-कोड मशीन
* पी-कोड मशीन उदाहरण मशीन|निकलॉस विर्थ पी-कोड मशीन
* [[गपशप]]
* [[गपशप]]
* [[जावा वर्चुअल मशीन]] इंस्ट्रक्शन सेट (ध्यान दें कि केवल अमूर्त निर्देश सेट स्टैक आधारित है, उदाहरण के लिए हॉटस्पॉट, सन जावा वर्चुअल मशीन, सॉफ्टवेयर में वास्तविक दुभाषिया को लागू नहीं करता है, लेकिन हस्तलिखित असेंबली स्टब्स के रूप में)
* [[जावा वर्चुअल मशीन]] इंस्ट्रक्शन सेट (ध्यान दें कि केवल अमूर्त निर्देश सेट स्टैक आधारित है, उदाहरण के लिए हॉटस्पॉट, सन जावा वर्चुअल मशीन, सॉफ्टवेयर में वास्तविक दुभाषिया को लागू नहीं करता है, किन्तु हस्तलिखित असेंबली स्टब्स के रूप में)
* [[Webविधानसभा]] बायटेकोड
* [[Webविधानसभा|वेब असेम्बली]] बायटेकोड
* .NET फ्रेमवर्क (ECMA 335) के [[सामान्य मध्यवर्ती भाषा]] (CIL) इंस्ट्रक्शन सेट के लिए [[आभासी निष्पादन प्रणाली]] (VES)
* .नेट फ्रेमवर्क (ईसीएमए 335) के [[सामान्य मध्यवर्ती भाषा]] (सीआईएल) इंस्ट्रक्शन सेट के लिए [[आभासी निष्पादन प्रणाली|वर्चुअल निष्पादन प्रणाली]] (वीईएस)
* द [[फोर्थ (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग लैंग्वेज, विशेष रूप से इंटीग्रल वर्चुअल मशीन
* द [[फोर्थ (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग लैंग्वेज, विशेष रूप से इंटीग्रल वर्चुअल मशीन
* एडोब की [[परिशिष्ट भाग]]
* एडोब की [[परिशिष्ट भाग]]
* तोता प्रोग्रामिंग भाषा
* पैरेट प्रोग्रामिंग भाषा
* [[सूर्य किरण]] [[स्मार्ट कार्ड]] पहचान के लिए [[सन माइक्रोसिस्टम्स]] की स्वैपड्रॉप प्रोग्रामिंग भाषा
* [[सूर्य किरण]] [[स्मार्ट कार्ड]] पहचान के लिए [[सन माइक्रोसिस्टम्स]] की स्वैपड्रॉप प्रोग्रामिंग भाषा
* एडोब की [[ActionScript]] वर्चुअल मशीन 2 (एवीएम2)
* एडोब की [[ActionScript|एक्शन स्क्रिप्ट]] वर्चुअल मशीन 2 (एवीएम2)
* [[Ethereum]] की ईवीएम
* [[Ethereum|ईथीरियम]] की ईवीएम
* [[CPython]] [[bytecode]] दुभाषिया
* [[CPython|सी पायथन]] [[bytecode|बाइटकोड]] द्विभाषिया
* [[रूबी (प्रोग्रामिंग भाषा)]] [[YARV]] बायटेकोड दुभाषिया
* [[रूबी (प्रोग्रामिंग भाषा)]] [[YARV|यार्व]] बायटेकोड दुभाषिया
* [[माणिक]] वर्चुअल मशीन
* [[माणिक]] वर्चुअल मशीन
* [[यूनिक्स]] में bs (प्रोग्रामिंग लैंग्वेज) कमांड को प्रोसेस करने के लिए एक वर्चुअल स्टैक मशीन का उपयोग करता है, पहले दिए गए इनपुट लैंग्वेज फॉर्म को रिवर्स-पॉलिश नोटेशन में ट्रांसपोज़ करने के बाद
* [[यूनिक्स]] में बीएस (प्रोग्रामिंग लैंग्वेज) कमांड को प्रोसेस करने के लिए वर्चुअल स्टैक मशीन का उपयोग करता है, पहले दिए गए इनपुट लैंग्वेज फॉर्म को रिवर्स-पॉलिश नोटेशन में ट्रांसपोज़ करने के बाद
* [[लुआ (प्रोग्रामिंग भाषा)]] सी एपीआई
* [[लुआ (प्रोग्रामिंग भाषा)]] सी एपीआई


=== हाइब्रिड मशीनें ===
=== हाइब्रिड मशीनें ===
{{distinguish|text=[[hybrid computer]]s that combine both digital and analogue features}}
प्योर स्टैक मशीनें ही वस्तु से कई क्षेत्रों तक पहुँचने वाली प्रक्रियाओं के लिए अधिक अक्षम हैं। इस प्रकार स्टैक मशीन कोड को प्रत्येक पॉइंटर + ऑफ़सेट गणना के लिए ऑब्जेक्ट पॉइंटर को पुनः लोड किया जाता हैं। इसके लिए सामान्य फिक्स स्टैक मशीन में कुछ रजिस्टर-मशीन सुविधाओं को जोड़ना है: पतों को रखने के लिए समर्पित दृश्य रजिस्टर फ़ाइल, और इस प्रकार भार और सरल पता की गणना करने के लिए रजिस्टर-शैली के निर्देशन के लिए किया जाता है। इस प्रकार रजिस्टरों का पूर्ण रूप से सामान्य उद्देश्य होना असामान्य है, क्योंकि तब एक्सप्रेशन स्टैक और पोस्टफिक्स निर्देशों का कोई मजबूत कारण नहीं है।
प्योर स्टैक मशीनें एक ही वस्तु से कई क्षेत्रों तक पहुँचने वाली प्रक्रियाओं के लिए काफी अक्षम हैं। स्टैक मशीन कोड को प्रत्येक पॉइंटर + ऑफ़सेट गणना के लिए ऑब्जेक्ट पॉइंटर को पुनः लोड करना होगा। इसके लिए एक सामान्य फिक्स स्टैक मशीन में कुछ रजिस्टर-मशीन सुविधाओं को जोड़ना है: पतों को रखने के लिए समर्पित एक दृश्य रजिस्टर फ़ाइल, और भार और सरल पता गणना करने के लिए रजिस्टर-शैली के निर्देश। रजिस्टरों का पूरी तरह से सामान्य उद्देश्य होना असामान्य है, क्योंकि तब एक्सप्रेशन स्टैक और पोस्टफिक्स निर्देशों का कोई मजबूत कारण नहीं है।


एक अन्य आम हाइब्रिड एक रजिस्टर मशीन आर्किटेक्चर के साथ शुरू करना है, और एक अन्य मेमोरी एड्रेस मोड जोड़ना है जो स्टैक मशीनों के पुश या पॉप संचालन का अनुकरण करता है: 'memaddress = reg; रेग + = instr.displ'। इसे सबसे पहले [[डिजिटल उपकरण निगम]] के [[PDP-11]] मिनीकंप्यूटर में इस्तेमाल किया गया था। इस सुविधा को [[वैक्स]] कंप्यूटर और [[मोटोरोला 6800]] और [[मोटोरोला 68000]] माइक्रोप्रोसेसरों में आगे बढ़ाया गया था। इसने शुरुआती कंपाइलरों में सरल स्टैक विधियों के उपयोग की अनुमति दी। यह स्टैक दुभाषियों या [[थ्रेडेड कोड]] का उपयोग करके आभासी मशीनों का भी कुशलता से समर्थन करता है। हालाँकि, इस सुविधा ने रजिस्टर मशीन के अपने कोड को शुद्ध स्टैक मशीन कोड के रूप में कॉम्पैक्ट बनने में मदद नहीं की। साथ ही, रजिस्टर आर्किटेक्चर के लिए अच्छी तरह से संकलित करते समय निष्पादन की गति कम थी। टॉप-ऑफ़-स्टैक पॉइंटर को केवल कभी-कभी (कॉल या रिटर्न के अनुसार एक बार) बदलने के बजाय प्रत्येक प्रोग्राम स्टेटमेंट में इसे लगातार ऊपर और नीचे करना तेज़ होता है, और मेमोरी संदर्भों से पूरी तरह से बचने के लिए यह और भी तेज़ है।
एक अन्य सरल हाइब्रिड रजिस्टर मशीन संरचना के साथ प्रारंभ करना है, और इस प्रकार अन्य मेमोरी एड्रेस मोड जोड़ना है जो स्टैक मशीनों के पुश या पॉप संचालन का अनुकरण करता है: 'मेमा एड्रेस = reg. रेग + = instr.displ'। इसे सबसे पहले [[डिजिटल उपकरण निगम]] के [[PDP-11]] मिनीकंप्यूटर में उपयोग किया गया था। इस सुविधा को [[वैक्स]] कंप्यूटर और [[मोटोरोला 6800]] और [[मोटोरोला 68000]] माइक्रोप्रोसेसरों में आगे बढ़ाया गया था। इसने प्रारंभिक कंपाइलरों में सरल स्टैक विधियों के उपयोग की अनुमति दी गई थी। इस प्रकार यह स्टैक दुभाषियों या [[थ्रेडेड कोड]] का उपयोग करके वर्चुअल मशीनों का भी कुशलता से समर्थन करता है। चूंकि, इस सुविधा ने रजिस्टर मशीन के अपने कोड को शुद्ध स्टैक मशीन कोड के रूप में कॉम्पैक्ट बनने में सहायता नहीं की थी। साथ ही, रजिस्टर संरचना के लिए अच्छी तरह से संकलित करते समय निष्पादन की गति कम थी। टॉप-ऑफ़-स्टैक पॉइंटर को केवल कभी-कभी (कॉल या रिटर्न के अनुसार बार) परिवर्तन के अतिरिक्त प्रत्येक प्रोग्राम स्टेटमेंट में इसे निरंतर ऊपर और नीचे करना तेज़ होता है, और मेमोरी संदर्भों से पूर्ण रूप से बचने के लिए यह और भी तेज़ है।


हाल ही में, तथाकथित दूसरी पीढ़ी की स्टैक मशीनों ने पता रजिस्टरों के रूप में काम करने के लिए रजिस्टरों के एक समर्पित संग्रह को अपनाया है, जो डेटा स्टैक से मेमोरी एड्रेसिंग के कार्य को ऑफ-लोड कर रहा है। उदाहरण के लिए, एमयूपी21 ए नामक एक रजिस्टर पर निर्भर करता है, जबकि हाल ही में ग्रीनअरे प्रोसेसर दो रजिस्टरों पर निर्भर करता है: ए और बी।<ref name="Colorforth_F18A"/>
वर्तमान में, तथाकथित दूसरी पीढ़ी की स्टैक मशीनों ने पता रजिस्टरों के रूप में कार्य करने के लिए रजिस्टरों के समर्पित संग्रह को अपनाया है, जो डेटा स्टैक से मेमोरी एड्रेसिंग के कार्य को ऑफ-लोड कर रहा है। उदाहरण के लिए, एमयूपी21 ए नामक रजिस्टर पर निर्भर करता है, जबकि हाल ही में ग्रीनअरे प्रोसेसर दो रजिस्टरों पर निर्भर करता है: ए और बी।<ref name="Colorforth_F18A"/>


माइक्रोप्रोसेसरों के इंटेल x86 परिवार में अधिकांश कार्यों के लिए एक रजिस्टर-शैली (संचायक) निर्देश सेट है, लेकिन इसके [[x87]], [[इंटेल 8087]] फ्लोटिंग पॉइंट अंकगणित के लिए स्टैक निर्देशों का उपयोग करते हैं, जो 8086 और 8088 के लिए iAPX87 (8087) कोप्रोसेसर के लिए वापस डेटिंग करते हैं। है, कोई प्रोग्रामर-सुलभ फ़्लोटिंग पॉइंट रजिस्टर नहीं हैं, लेकिन केवल 80-बिट चौड़ा, 8-स्तरीय गहरा स्टैक है। x87 अपने कार्यों को करने में सहायता के लिए x86 CPU पर बहुत अधिक निर्भर करता है।
माइक्रोप्रोसेसरों के इंटेल x86 परिवार में अधिकांश कार्यों के लिए रजिस्टर-शैली (संचायक) निर्देश सेट है, किन्तु इसके [[x87]], [[इंटेल 8087]] फ्लोटिंग पॉइंट अंकगणित के लिए स्टैक निर्देशों का उपयोग करते हैं, जो 8086 और 8088 के लिए iAPX87 (8087) कोप्रोसेसर के लिए वापस डेटिंग करते हैं। है, इस प्रकार कोई प्रोग्रामर-सुलभ फ़्लोटिंग पॉइंट रजिस्टर नहीं हैं, किन्तु केवल 80-बिट चौड़ा, 8-स्तरीय गहरा स्टैक है। x87 अपने कार्यों को करने में सहायता के लिए x86 सीपीयू पर बहुत अधिक निर्भर करता है।


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


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


कंप्यूटर आमतौर पर कार्यक्रम के [[वैश्विक चर]] और केवल वर्तमान अंतरतम प्रक्रिया या फ़ंक्शन के स्थानीय चर के लिए प्रत्यक्ष, कुशल पहुंच प्रदान करते हैं, सबसे ऊपरी ढेर फ्रेम। कॉलर्स के स्टैक फ्रेम की सामग्री के 'ऊपरी स्तर' को संबोधित करने की आमतौर पर आवश्यकता नहीं होती है और सीधे हार्डवेयर द्वारा समर्थित नहीं होती है। यदि आवश्यक हो, तो कंपाइलर फ्रेम पॉइंटर्स को अतिरिक्त, छिपे हुए पैरामीटर के रूप में पास करके इसका समर्थन करते हैं।
कंप्यूटर सामान्यतः कार्यक्रम के [[वैश्विक चर]] और केवल वर्तमान अंतरतम प्रक्रिया या फ़ंक्शन के स्थानीय चर के लिए प्रत्यक्ष, कुशल पहुंच प्रदान करते हैं, सबसे ऊपरी फ्रेम में संग्रहित किया जाता हैं। कॉलर्स के स्टैक फ्रेम की सामग्री के 'ऊपरी स्तर' को संबोधित करने की सामान्यतः आवश्यकता नहीं होती है और इस प्रकार सीधे हार्डवेयर द्वारा समर्थित नहीं होती है। यदि आवश्यक हो, तो कंपाइलर फ्रेम पॉइंटर्स को अतिरिक्त, छिपे हुए पैरामीटर के रूप में पास करके इसका समर्थन करते हैं।


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


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


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


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


== [[रजिस्टर मशीन]]ों के साथ तुलना ==
== [[रजिस्टर मशीन|रजिस्टर मशीनों]] के साथ तुलना ==
स्टैक मशीनों की तुलना अक्सर रजिस्टर मशीनों से की जाती है, जो प्रोसेसर रजिस्टरों की एक सरणी में मान रखती हैं। रजिस्टर मशीनें इस सरणी में स्टैक जैसी संरचनाओं को संग्रहीत कर सकती हैं, लेकिन एक रजिस्टर मशीन में ऐसे निर्देश होते हैं जो स्टैक इंटरफ़ेस को बाधित करते हैं। रजिस्टर मशीनें नियमित रूप से स्टैक मशीनों से बेहतर प्रदर्शन करती हैं,<ref name="Shi-Gregg-Beatty-Ertl_2005"/>और स्टैक मशीनें हार्डवेयर सिस्टम में एक आला खिलाड़ी बनी हुई हैं। लेकिन स्टैक मशीनों का उपयोग अक्सर आभासी मशीनों को लागू करने में उनकी सादगी और कार्यान्वयन में आसानी के कारण किया जाता है।<ref name="Randall_2004"/>
स्टैक मशीनों की तुलना अधिकांशतः रजिस्टर मशीनों से की जाती है, जो प्रोसेसर रजिस्टरों की सरणी में मान रखती हैं। इस प्रकार रजिस्टर मशीनें इस सरणी में स्टैक जैसी संरचनाओं को संग्रहीत कर सकती हैं, किन्तु रजिस्टर मशीन में ऐसे निर्देश होते हैं जो स्टैक इंटरफ़ेस को बाधित करते हैं। रजिस्टर मशीनें नियमित रूप से स्टैक मशीनों से उत्तम प्रदर्शन करती हैं,<ref name="Shi-Gregg-Beatty-Ertl_2005"/> और स्टैक मशीनें हार्डवेयर सिस्टम में सबसे उत्तम हैं। किन्तु स्टैक मशीनों का उपयोग अधिकांशतः वर्चुअल मशीनों को लागू करने में उनकी सादगी और कार्यान्वयन में सरलता के कारण किया जाता है।<ref name="Randall_2004"/>
=== निर्देश ===
=== निर्देश ===
स्टैक मशीनों में उच्च निर्देश सेट आर्किटेक्चर # कोड घनत्व होता है। सामान्य स्टैक मशीन निर्देशों के विपरीत, जो आसानी से 6 बिट या उससे कम में फिट हो सकते हैं, रजिस्टर मशीनों को ऑपरेंड का चयन करने के लिए प्रति ALU निर्देश में दो या तीन रजिस्टर-नंबर फ़ील्ड की आवश्यकता होती है; सबसे सघन रजिस्टर मशीन का औसत लगभग 16 बिट्स प्रति निर्देश और ऑपरेंड है। रजिस्टर मशीनें लोड-स्टोर ऑपकोड के लिए व्यापक ऑफ़सेट फ़ील्ड का भी उपयोग करती हैं। एक स्टैक मशीन का कॉम्पैक्ट कोड स्वाभाविक रूप से कैश में अधिक निर्देशों को फिट करता है, और इसलिए बेहतर [[CPU]] कैश दक्षता प्राप्त कर सकता है, स्मृति लागत को कम कर सकता है या दी गई लागत के लिए तेज मेमोरी सिस्टम की अनुमति दे सकता है। इसके अलावा, अधिकांश स्टैक-मशीन निर्देश बहुत सरल होते हैं, केवल एक ओपकोड फ़ील्ड या एक ऑपरेंड फ़ील्ड से बने होते हैं। इस प्रकार, स्टैक-मशीनों को प्रत्येक निर्देश को डिकोड करने के लिए बहुत कम इलेक्ट्रॉनिक संसाधनों की आवश्यकता होती है।
स्टैक मशीनों में उच्च निर्देश सेट संरचना कोड घनत्व होता है। सामान्य स्टैक मशीन निर्देशों के विपरीत, जो सरलता से 6 बिट या उससे कम में फिट हो सकते हैं, रजिस्टर मशीनों को ऑपरेंड का चयन करने के लिए प्रति एएलयू निर्देश में दो या तीन रजिस्टर-नंबर फ़ील्ड की आवश्यकता होती है. सबसे सघन रजिस्टर मशीन का औसत लगभग 16 बिट्स प्रति निर्देश और ऑपरेंड होते हैं। इस प्रकार रजिस्टर मशीनें लोड-स्टोर ऑपकोड के लिए व्यापक ऑफ़सेट फ़ील्ड का भी उपयोग करती हैं। स्टैक मशीन का कॉम्पैक्ट कोड स्वाभाविक रूप से कैश में अधिक निर्देशों को फिट करता है, और इसलिए उत्तम [[CPU|सीपीयू]] कैश दक्षता प्राप्त कर सकता है, स्मृति लागत को कम कर सकता है या दी गई लागत के लिए तेज मेमोरी सिस्टम की अनुमति दे सकता है। इसके अतिरिक्त, अधिकांश स्टैक-मशीन निर्देश बहुत सरल होते हैं, केवल ओपकोड फ़ील्ड या ऑपरेंड फ़ील्ड से बने होते हैं। इस प्रकार, स्टैक-मशीनों को प्रत्येक निर्देश को डिकोड करने के लिए बहुत कम इलेक्ट्रॉनिक संसाधनों की आवश्यकता होती है।


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


अधिकांश रजिस्टर दुभाषिए अपने रजिस्टरों को संख्या द्वारा निर्दिष्ट करते हैं। लेकिन एक मेजबान मशीन के रजिस्टरों को अनुक्रमित सरणी में एक्सेस नहीं किया जा सकता है, इसलिए वर्चुअल रजिस्टरों के लिए मेमोरी सरणी आवंटित की जाती है। इसलिए, एक रजिस्टर दुभाषिया के निर्देशों को उत्पन्न डेटा को अगले निर्देश में पास करने के लिए मेमोरी का उपयोग करना चाहिए। यह दुभाषियों को ठीक प्रक्रिया नियम (यानी सर्किट गति में सुधार के बिना तेज ट्रांजिस्टर, जैसे हैसवेल x86) के साथ बनाए गए माइक्रोप्रोसेसरों पर बहुत धीमा होने के लिए पंजीकृत करता है। मेमोरी एक्सेस के लिए इन्हें कई घड़ियों की आवश्यकता होती है, लेकिन रजिस्टर एक्सेस के लिए केवल एक घड़ी। रजिस्टर फ़ाइल के बजाय डेटा फ़ॉरवर्डिंग सर्किट वाली स्टैक मशीन के मामले में, स्टैक दुभाषिए होस्ट मशीन की मेमोरी के बजाय स्टैक के शीर्ष कई ऑपरेंड के लिए होस्ट मशीन के रजिस्टरों को आवंटित कर सकते हैं।
अधिकांश रजिस्टर द्विभाषिया अपने रजिस्टरों को संख्या द्वारा निर्दिष्ट करते हैं। किन्तु इसकी मशीन के रजिस्टरों को अनुक्रमित सरणी में एक्सेस नहीं किया जा सकता है, इसलिए वर्चुअल रजिस्टरों के लिए मेमोरी सरणी आवंटित की जाती है। इसलिए, रजिस्टर दुभाषिया के निर्देशों को उत्पन्न डेटा को अगले निर्देश में पास करने के लिए मेमोरी का उपयोग करना चाहिए। इस प्रकार यह दुभाषियों को ठीक प्रक्रिया नियम (अर्ताथ परिपथ गति में सुधार के बिना तेज ट्रांजिस्टर, जैसे हैसवेल x86) के साथ बनाए गए माइक्रोप्रोसेसरों पर बहुत धीमा होने के लिए पंजीकृत करता है। मेमोरी एक्सेस के लिए इन्हें कई घड़ियों की आवश्यकता होती है, किन्तु रजिस्टर एक्सेस के लिए केवल घड़ी की सहायता ली जाती हैं। रजिस्टर फ़ाइल के अतिरिक्त डेटा फ़ॉरवर्डिंग परिपथ वाली स्टैक मशीन की स्थिति में, स्टैक दुभाषिए होस्ट मशीन की मेमोरी के अतिरिक्त स्टैक के शीर्ष कई ऑपरेंड के लिए होस्ट मशीन के रजिस्टरों को आवंटित कर सकते हैं।


एक स्टैक मशीन में, निर्देशों में प्रयुक्त ऑपरेंड हमेशा एक ज्ञात ऑफ़सेट (स्टैक पॉइंटर में सेट) पर होते हैं, एक निश्चित स्थान से (स्टैक के नीचे, जो हार्डवेयर डिज़ाइन में हमेशा स्मृति स्थान शून्य पर हो सकता है), कीमती इन-[[कैश (कंप्यूटिंग)]] या इन-सीपीयू स्टोरेज को बहुत सारे [[स्मृति पता]] या इंडेक्स नंबर स्टोर करने के लिए इस्तेमाल होने से बचाना। यह गैर-प्रवाह संगणना में उपयोग के लिए ऐसे रजिस्टरों और कैश को संरक्षित कर सकता है।
एक स्टैक मशीन में, निर्देशों में प्रयुक्त ऑपरेंड सदैव ज्ञात ऑफ़सेट (स्टैक पॉइंटर में सेट) पर होते हैं, निश्चित स्थान से (स्टैक के नीचे, जो हार्डवेयर डिज़ाइन में सदैव स्मृति स्थान शून्य पर हो सकता है), कीमती इन-[[कैश (कंप्यूटिंग)]] या इन-सीपीयू स्टोरेज को बहुत सारे [[स्मृति पता]] या इंडेक्स नंबर स्टोर करने के लिए उपयोग होने से बचाया जाता हैं। यह गैर-प्रवाह संगणना में उपयोग के लिए ऐसे रजिस्टरों और कैश को संरक्षित कर सकता है।
=== अस्थायी / स्थानीय मान ===
=== अस्थायी / स्थानीय मान ===
उद्योग में कुछ लोगों का मानना ​​है कि स्टैक मशीनें रजिस्टर मशीनों की तुलना में अस्थायी मूल्यों और स्थानीय चर के लिए अधिक [[डेटा कैश]] चक्र निष्पादित करती हैं।<ref name="Hennessy-Patterson"/>
उद्योग में कुछ लोगों का मानना ​​है कि स्टैक मशीनें रजिस्टर मशीनों की तुलना में अस्थायी मूल्यों और स्थानीय चर के लिए अधिक [[डेटा कैश]] चक्र निष्पादित करती हैं।<ref name="Hennessy-Patterson"/>


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


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


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


=== सामान्य उप-अभिव्यक्तियाँ ===
=== सामान्य उप-अभिव्यक्तियाँ ===
रजिस्टर मशीनों में, एक सामान्य उप-अभिव्यक्ति (एक उप-अभिव्यक्ति जो एक ही परिणाम मूल्य के साथ कई बार उपयोग की जाती है) का मूल्यांकन केवल एक बार किया जा सकता है और इसका परिणाम तेजी से रजिस्टर में सहेजा जाता है। बाद के पुन: उपयोग में कोई समय या कोड लागत नहीं है, बस एक रजिस्टर संदर्भ है। यह अनुकूलन सरल अभिव्यक्तियों (उदाहरण के लिए, वेरिएबल X या पॉइंटर P को लोड करना) के साथ-साथ कम-सामान्य जटिल अभिव्यक्तियों को गति देता है।
रजिस्टर मशीनों में, सामान्य उप-अभिव्यक्ति (एक उप-अभिव्यक्ति जो ही परिणाम मूल्य के साथ कई बार उपयोग की जाती है) का मूल्यांकन केवल बार किया जा सकता है और इसका परिणाम तेजी से रजिस्टर में संग्रहित किया जाता है। बाद के पुन: उपयोग में कोई समय या कोड लागत नहीं है, यहाँ पर बस रजिस्टर इसका प्रमुख संदर्भ है। यह अनुकूलन सरल अभिव्यक्तियों (उदाहरण के लिए, वेरिएबल X या पॉइंटर P को लोड करना) के साथ-साथ कम-सामान्य जटिल अभिव्यक्तियों को गति देता है।


स्टैक मशीनों के साथ, इसके विपरीत, परिणाम दो तरीकों में से एक में संग्रहीत किए जा सकते हैं। सबसे पहले, मेमोरी में एक अस्थायी चर का उपयोग करके परिणाम संग्रहीत किए जा सकते हैं। भंडारण और बाद की पुनर्प्राप्ति में अतिरिक्त निर्देश और अतिरिक्त डेटा कैश चक्र खर्च होते हैं। ऐसा करना केवल एक जीत है यदि उप-अभिव्यक्ति संगणना में मेमोरी से लाने की तुलना में अधिक समय लगता है, जो कि अधिकांश स्टैक सीपीयू में लगभग हमेशा ही होता है। सरल चर और सूचक लाने के लिए यह कभी भी सार्थक नहीं होता है, क्योंकि उनके पास पहले से ही एक डेटा कैश चक्र प्रति एक्सेस की समान लागत होती है। जैसे भावों के लिए यह केवल मामूली रूप से सार्थक है {{code|X+1}}. ये सरल अभिव्यक्तियाँ गैर-संगत भाषाओं में लिखे गए कार्यक्रमों में बहुसंख्यक निरर्थक, अनुकूलन योग्य अभिव्यक्तियाँ बनाती हैं। एक ऑप्टिमाइज़िंग कंपाइलर केवल अतिरेक पर जीत सकता है जिसे प्रोग्रामर स्रोत कोड में टाल सकता था।
स्टैक मशीनों के साथ, इसके विपरीत, परिणाम दो तरीकों में से में संग्रहीत किए जा सकते हैं। सबसे पहले, मेमोरी में अस्थायी चर का उपयोग करके परिणाम संग्रहीत किए जा सकते हैं। भंडारण और बाद की पुनर्प्राप्ति में अतिरिक्त निर्देश और अतिरिक्त डेटा कैश चक्र खर्च होते हैं। ऐसा करना केवल जीत है यदि उप-अभिव्यक्ति संगणना में मेमोरी से लाने की तुलना में अधिक समय लगता है, जो कि अधिकांश स्टैक सीपीयू में लगभग सदैव ही होता है। सरल चर और सूचक लाने के लिए यह कभी भी सार्थक नहीं होता है, क्योंकि उनके पास पहले से ही डेटा कैश चक्र प्रति एक्सेस की समान लागत होती है। {{code|X+1}} जैसे समीकरण के लिए यह केवल सरलता से सार्थक है, ये सरल अभिव्यक्तियाँ गैर-संगत भाषाओं में लिखे गए कार्यक्रमों में बहुसंख्यक निरर्थक, अनुकूलन योग्य अभिव्यक्तियाँ बनाती हैं। ऑप्टिमाइज़िंग कंपाइलर केवल अतिरेक पर जीत सकता है जिसे प्रोग्रामर स्रोत कोड में टाल सकता था।


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


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


शेड्यूलिंग मेमोरी एक्सेस के लिए स्पष्ट, अतिरिक्त रजिस्टरों की आवश्यकता होती है। प्रोग्रामर को माइक्रो-आर्किटेक्चर के कुछ पहलू को उजागर किए बिना स्टैक मशीनों पर यह संभव नहीं है। अभिव्यक्ति ए बी - के लिए, बी का मूल्यांकन किया जाना चाहिए और माइनस कदम से तुरंत पहले धकेल दिया जाना चाहिए। स्टैक क्रमपरिवर्तन या हार्डवेयर मल्टीथ्रेडिंग के बिना, लोड बी के समाप्त होने की प्रतीक्षा करते समय अपेक्षाकृत कम उपयोगी कोड डाला जा सकता है। स्टैक मशीनें मेमोरी विलंब के आसपास काम कर सकती हैं या तो एक ही समय में कई निर्देशों को कवर करने वाली एक गहरी आउट-ऑफ-ऑर्डर निष्पादन पाइपलाइन हो सकती है, या अधिक संभावना है, वे स्टैक को अनुमति दे सकते हैं जैसे लोड पूरा होने पर वे अन्य वर्कलोड पर काम कर सकते हैं, या वे विभिन्न प्रोग्राम थ्रेड्स के निष्पादन को इंटरलेस कर सकता है, जैसा कि यूनिसिस ए 9 सिस्टम में है।<ref name="Burroughs_1986"/>आज के तेजी से समानांतर कम्प्यूटेशनल भार से पता चलता है, हालांकि, यह अतीत में होने वाला नुकसान नहीं हो सकता है।
शेड्यूलिंग मेमोरी एक्सेस के लिए स्पष्ट, अतिरिक्त रजिस्टरों की आवश्यकता होती है। प्रोग्रामर को माइक्रो-संरचना के कुछ पहलू को उजागर किए बिना स्टैक मशीनों पर यह संभव नहीं है। अभिव्यक्ति ए बी - के लिए, बी का मूल्यांकन किया जाना चाहिए और माइनस कदम से तुरंत पहले धकेल दिया जाना चाहिए। स्टैक क्रमपरिवर्तन या हार्डवेयर मल्टीथ्रेडिंग के बिना, लोड बी के समाप्त होने की प्रतीक्षा करते समय अपेक्षाकृत कम उपयोगी कोड डाला जा सकता है। स्टैक मशीनें मेमोरी विलंब के आसपास कार्य कर सकती हैं या तो ही समय में कई निर्देशों को कवर करने वाली गहरी आउट-ऑफ-ऑर्डर निष्पादन पाइपलाइन हो सकती है, या अधिक संभावना है, वे स्टैक को अनुमति दे सकते हैं जैसे लोड पूरा होने पर वे अन्य वर्कलोड पर कार्य कर सकते हैं, या वे विभिन्न प्रोग्राम थ्रेड्स के निष्पादन को इंटरलेस कर सकता है, जैसा कि यूनिसिस ए 9 सिस्टम में है।<ref name="Burroughs_1986"/>आज के तेजी से समानांतर कम्प्यूटेशनल भार से पता चलता है, चूंकि, यह अतीत में होने वाली हानि नहीं हो सकता है।


स्टैक मशीनें एक रजिस्टर मशीन के ऑपरेंड फ़ेचिंग चरण को छोड़ सकती हैं।<ref name="Koopman_1989"/>उदाहरण के लिए, [[Java Optimized Processor]] (JOP) माइक्रोप्रोसेसर में स्टैक के शीर्ष 2 ऑपरेंड सीधे डेटा फ़ॉरवर्डिंग सर्किट में प्रवेश करते हैं जो रजिस्टर फ़ाइल से तेज़ है।<ref name="Jopdesign"/>
स्टैक मशीनें रजिस्टर मशीन के ऑपरेंड फ़ेचिंग चरण को छोड़ सकती हैं।<ref name="Koopman_1989"/>उदाहरण के लिए, [[Java Optimized Processor|जावा आप्टिमाइज्ड प्रोसेसर]] (JOP) माइक्रोप्रोसेसर में स्टैक के शीर्ष 2 ऑपरेंड सीधे डेटा फ़ॉरवर्डिंग परिपथ में प्रवेश करते हैं जो रजिस्टर फ़ाइल से तेज़ है।<ref name="Jopdesign"/>
=== [[आउट-ऑफ-ऑर्डर निष्पादन]] ===
=== [[आउट-ऑफ-ऑर्डर निष्पादन]] ===
जैसे ही उनका डेटा उपलब्ध हो जाता है, निर्देश जारी करके [[टोमासुलो एल्गोरिथम]] [[निर्देश-स्तर समानता]] पाता है। वैचारिक रूप से, एक स्टैक में पदों के पते एक रजिस्टर फ़ाइल के रजिस्टर इंडेक्स से अलग नहीं होते हैं। यह दृश्य स्टैक मशीनों के साथ उपयोग किए जाने वाले टोमासुलो एल्गोरिथम के आउट-ऑफ-ऑर्डर निष्पादन की अनुमति देता है।
जैसे ही उनका डेटा उपलब्ध हो जाता है, निर्देश जारी करके [[टोमासुलो एल्गोरिथम]] [[निर्देश-स्तर समानता]] पाता है। वैचारिक रूप से, स्टैक में पदों के पते रजिस्टर फ़ाइल के रजिस्टर इंडेक्स से अलग नहीं होते हैं। यह दृश्य स्टैक मशीनों के साथ उपयोग किए जाने वाले टोमासुलो एल्गोरिथम के आउट-ऑफ-ऑर्डर निष्पादन की अनुमति देता है।


स्टैक मशीनों में आउट-ऑफ-ऑर्डर निष्पादन कई सैद्धांतिक और व्यावहारिक कठिनाइयों को कम या टालने लगता है।<ref name="Chatterji-Ravindran"/>उद्धृत शोध से पता चलता है कि ऐसी स्टैक मशीन निर्देश-स्तर समानता का फायदा उठा सकती है, और परिणामी हार्डवेयर को निर्देशों के लिए डेटा कैश करना चाहिए। ऐसी मशीनें प्रभावी ढंग से अधिकांश मेमोरी एक्सेस को स्टैक तक बायपास करती हैं। परिणाम बहुत अधिक कोड घनत्व के साथ [[जोखिम]] रजिस्टर मशीनों की तुलना में थ्रूपुट (प्रति घड़ी दर निर्देश) प्राप्त करता है (क्योंकि ऑपरेंड पते निहित हैं)।
स्टैक मशीनों में आउट-ऑफ-ऑर्डर निष्पादन कई सैद्धांतिक और व्यावहारिक कठिनाइयों को कम या टालने लगता है।<ref name="Chatterji-Ravindran"/>उद्धृत शोध से पता चलता है कि ऐसी स्टैक मशीन निर्देश-स्तर समानता का फायदा उठा सकती है, और परिणामी हार्डवेयर को निर्देशों के लिए डेटा कैश करना चाहिए। ऐसी मशीनें प्रभावी ढंग से अधिकांश मेमोरी एक्सेस को स्टैक तक बायपास करती हैं। परिणाम बहुत अधिक कोड घनत्व के साथ [[जोखिम|खतरे]] रजिस्टर मशीनों की तुलना में थ्रूपुट (प्रति घड़ी दर निर्देश) प्राप्त करता है (क्योंकि ऑपरेंड पते निहित हैं)।


शोध में सामने आया एक मुद्दा यह था कि रजिस्टर मशीन के आरआईएससी निर्देश का काम करने के लिए लगभग 1.88 स्टैक-मशीन निर्देशों की आवश्यकता होती है। प्रतिस्पर्धी आउट-ऑफ-ऑर्डर स्टैक मशीनों को इसलिए निर्देशों को ट्रैक करने के लिए लगभग दोगुने इलेक्ट्रॉनिक संसाधनों की आवश्यकता होती है (स्टेशन जारी करें)। इसकी भरपाई इंस्ट्रक्शन कैश और मेमोरी और इंस्ट्रक्शन डिकोडिंग सर्किट में बचत से की जा सकती है।
शोध में सामने आया विवाद यह था कि रजिस्टर मशीन के आरआईएससी निर्देश का कार्य करने के लिए लगभग 1.88 स्टैक-मशीन निर्देशों की आवश्यकता होती है। प्रतिस्पर्धी आउट-ऑफ-ऑर्डर स्टैक मशीनों को इसलिए निर्देशों को ट्रैक करने के लिए लगभग दोगुने इलेक्ट्रॉनिक संसाधनों की आवश्यकता होती है। इसकी भरपाई इंस्ट्रक्शन कैश और मेमोरी और इंस्ट्रक्शन डिकोडिंग परिपथ में बचत से की जा सकती है।


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


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


[[माइक्रोकोड]] स्टैक मशीन इसका एक उदाहरण है। आंतरिक माइक्रोकोड इंजन किसी प्रकार की आरआईएससी-जैसी रजिस्टर मशीन या [[वीएलआईडब्ल्यू]] जैसी मशीन है जो कई रजिस्टर फाइलों का उपयोग करती है। जब कार्य-विशिष्ट माइक्रोकोड द्वारा सीधे नियंत्रित किया जाता है, तो उसी कार्य के लिए समान स्टैक कोड द्वारा अप्रत्यक्ष रूप से नियंत्रित किए जाने की तुलना में उस इंजन को प्रति चक्र बहुत अधिक कार्य पूरा होता है।
[[माइक्रोकोड]] स्टैक मशीन इसका उदाहरण है। आंतरिक माइक्रोकोड इंजन किसी प्रकार की आरआईएससी-जैसी रजिस्टर मशीन या [[वीएलआईडब्ल्यू]] जैसी मशीन है जो कई रजिस्टर फाइलों का उपयोग करती है। जब कार्य-विशिष्ट माइक्रोकोड द्वारा सीधे नियंत्रित किया जाता है, तो उसी कार्य के लिए समान स्टैक कोड द्वारा अप्रत्यक्ष रूप से नियंत्रित किए जाने की तुलना में उस इंजन को प्रति चक्र बहुत अधिक कार्य पूरा होता है।


HP 3000 और Tandem Computers T/16 के लिए ऑब्जेक्ट कोड अनुवादक एक अन्य उदाहरण हैं।<ref name="Bergh-Keilman-Magenheimer-Miller_1987"/><ref name="Andrews-Sand_1992"/>उन्होंने स्टैक कोड अनुक्रमों को आरआईएससी कोड के समकक्ष अनुक्रमों में अनुवादित किया। मामूली 'स्थानीय' अनुकूलन ने स्टैक आर्किटेक्चर के अधिकांश ओवरहेड को हटा दिया। स्पेयर रजिस्टरों का उपयोग बार-बार पता गणनाओं को कारक बनाने के लिए किया गया था। मूल और लक्षित मशीनों के बीच बेमेल से अनुवादित कोड ने अभी भी बहुत सारे अनुकरण ओवरहेड को बरकरार रखा है। उस बोझ के बावजूद, अनुवादित कोड की चक्र दक्षता मूल स्टैक कोड की चक्र दक्षता से मेल खाती है। और जब स्रोत कोड को सीधे रजिस्टर मशीन पर संकलक के अनुकूलन के माध्यम से पुन: संकलित किया गया, तो दक्षता दोगुनी हो गई। इससे पता चलता है कि स्टैक आर्किटेक्चर और इसके गैर-अनुकूलन कंपाइलर अंतर्निहित हार्डवेयर की आधी से अधिक शक्ति बर्बाद कर रहे थे।
एचपी 3000 और टैंडम कंप्यूटर्स T/16 के लिए ऑब्जेक्ट कोड अनुवादक अन्य उदाहरण हैं।<ref name="Bergh-Keilman-Magenheimer-Miller_1987" /><ref name="Andrews-Sand_1992" /> उन्होंने स्टैक कोड अनुक्रमों को आरआईएससी कोड के समकक्ष अनुक्रमों में अनुवादित किया गया हैं। इस प्रकार सरलता से 'स्थानीय' अनुकूलन ने स्टैक संरचना के अधिकांश ओवरहेड को हटा दिया जाता हैं। इस प्रकार स्पेयर रजिस्टरों का उपयोग बार-बार पता गणनाओं को कारक बनाने के लिए किया गया था। मूल और लक्षित मशीनों के बीच बेमेल से अनुवादित कोड ने अभी भी बहुत सारे अनुकरण ओवरहेड को निरंतर रखा है। इसके अतिरिक्त, अनुवादित कोड की चक्र दक्षता मूल स्टैक कोड की चक्र दक्षता से मेल खाती है। और जब स्रोत कोड को सीधे रजिस्टर मशीन पर संकलक के अनुकूलन के माध्यम से पुन: संकलित किया गया, तो दक्षता दोगुनी हो जाती हैं। इससे पता चलता है कि स्टैक संरचना और इसके गैर-अनुकूलन कंपाइलर अंतर्निहित हार्डवेयर की आधी से अधिक शक्ति बर्बाद कर रहे थे।


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


चूँकि स्टैक अधिकांश सॉफ़्टवेयर प्रोग्रामों का एक घटक है, तब भी जब उपयोग किया जाने वाला सॉफ़्टवेयर कड़ाई से स्टैक मशीन नहीं है, एक हार्डवेयर स्टैक मशीन अपने प्रोग्रामों के आंतरिक कामकाज की अधिक बारीकी से नकल कर सकती है। प्रोसेसर रजिस्टरों की उच्च तापीय लागत होती है, और एक स्टैक मशीन उच्च ऊर्जा दक्षता का दावा कर सकती है।<ref name="GreenArrays_1"/>
चूँकि स्टैक अधिकांश सॉफ़्टवेयर प्रोग्रामों का घटक है, तब भी जब उपयोग किया जाने वाला सॉफ़्टवेयर कड़ाई से स्टैक मशीन नहीं है, हार्डवेयर स्टैक मशीन अपने प्रोग्रामों के आंतरिक कामकाज की अधिक बारीकी से नकल कर सकती है। प्रोसेसर रजिस्टरों की उच्च तापीय लागत होती है, और स्टैक मशीन उच्च ऊर्जा दक्षता का दावा कर सकती है।<ref name="GreenArrays_1" />
=== व्यवधान ===
=== व्यवधान ===
एक रुकावट के जवाब में रजिस्टरों को एक स्टैक में सहेजना और फिर इंटरप्ट हैंडलर कोड को ब्रांच करना शामिल है। अक्सर स्टैक मशीनें इंटरप्ट्स के लिए अधिक तेज़ी से प्रतिक्रिया करती हैं, क्योंकि अधिकांश पैरामीटर पहले से ही स्टैक पर हैं और उन्हें वहां धकेलने की कोई आवश्यकता नहीं है। कुछ रजिस्टर मशीनें इससे निपटने के लिए कई रजिस्टर फाइलें रखती हैं जिन्हें तुरंत स्वैप किया जा सकता है<ref name="Intel_1980"/>लेकिन इससे लागत बढ़ जाती है और रजिस्टर फ़ाइल धीमी हो जाती है।
एक रुकावट के जवाब में रजिस्टरों को स्टैक में सहेजना और फिर इंटरप्ट हैंडलर कोड को ब्रांच करना सम्मलित है। अधिकांशतः स्टैक मशीनें इंटरप्ट्स के लिए अधिक तेज़ी से प्रतिक्रिया करती हैं, क्योंकि अधिकांश पैरामीटर पहले से ही स्टैक पर हैं और उन्हें वहां धकेलने की कोई आवश्यकता नहीं है। कुछ रजिस्टर मशीनें इससे निपटने के लिए कई रजिस्टर फाइलें रखती हैं जिन्हें तुरंत स्वैप किया जा सकता है<ref name="Intel_1980"/>किन्तु इससे लागत बढ़ जाती है और रजिस्टर फ़ाइल धीमी हो जाती है।


=== दुभाषिया ===
=== दुभाषिया ===
रजिस्टर मशीनों के दुभाषियों की तुलना में वर्चुअल स्टैक मशीनों के लिए दुभाषियों का निर्माण आसान है; कई निर्देशों में दोहराए जाने के बजाय मेमोरी एड्रेस मोड को संभालने का तर्क सिर्फ एक ही स्थान पर है। स्टैक मशीनों में ओपकोड की कम विविधताएं होती हैं; एक सामान्यीकृत ऑपकोड स्मृति संदर्भ या फ़ंक्शन कॉल सेटअप के बारंबार केस और अस्पष्ट कॉर्नर केस दोनों को हैंडल करेगा। (लेकिन एक ही ऑपरेशन के लिए छोटे और लंबे रूपों को जोड़कर अक्सर कोड घनत्व में सुधार किया जाता है।)
रजिस्टर मशीनों के दुभाषियों की तुलना में वर्चुअल स्टैक मशीनों के लिए दुभाषियों का निर्माण सरल है. कई निर्देशों में दोहराए जाने के अतिरिक्त मेमोरी एड्रेस मोड को संभालने का तर्क सिर्फ ही स्थान पर है। स्टैक मशीनों में ओपकोड की कम विविधताएं होती हैं. सामान्यीकृत ऑपकोड स्मृति संदर्भ या फ़ंक्शन कॉल सेटअप के बारंबार केस और अस्पष्ट कॉर्नर केस दोनों को हैंडल करेगा। (किन्तु ही ऑपरेशन के लिए छोटे और लंबे रूपों को जोड़कर अधिकांशतः कोड घनत्व में सुधार किया जाता है।)


वर्चुअल स्टैक मशीनों के लिए दुभाषिए अक्सर वर्चुअल मशीन की अन्य शैलियों के दुभाषियों की तुलना में धीमे होते हैं।<ref name="Shi-Gregg-Beatty-Ertle_2"/>गहरी निष्पादन पाइपलाइनों, जैसे वर्तमान x86 चिप्स के साथ होस्ट मशीनों पर चलते समय यह मंदी सबसे खराब है।
वर्चुअल स्टैक मशीनों के लिए दुभाषिए अधिकांशतः वर्चुअल मशीन की अन्य शैलियों के दुभाषियों की तुलना में धीमे होते हैं।<ref name="Shi-Gregg-Beatty-Ertle_2"/>गहरी निष्पादन पाइपलाइनों, जैसे वर्तमान x86 चिप्स के साथ होस्ट मशीनों पर चलते समय यह मंदी सबसे खराब है।


कुछ दुभाषियों में, दुभाषिया को अगले ओपोड को डीकोड करने के लिए एन-वे स्विच कूदना चाहिए और उस विशेष ओपकोड के लिए अपने कदमों को शाखा देना चाहिए। ऑपकोड चुनने का दूसरा तरीका थ्रेडेड कोड है। मेजबान मशीन के प्रीफैच तंत्र उस अनुक्रमित या अप्रत्यक्ष छलांग के लक्ष्य की भविष्यवाणी करने और प्राप्त करने में असमर्थ हैं। इसलिए होस्ट मशीन के निष्पादन पाइपलाइन को हर बार पुनरारंभ करना होगा जब होस्ट दुभाषिया किसी अन्य वर्चुअल निर्देश को डीकोड करता है। वर्चुअल मशीन की अन्य शैलियों की तुलना में यह वर्चुअल स्टैक मशीनों के लिए अधिक बार होता है।<ref name="Davis-Beatty-Casey-Gregg-Waldron_2005"/>
कुछ दुभाषियों में, दुभाषिया को अगले ओपोड को डीकोड करने के लिए एन-वे स्विच कूदना चाहिए और उस विशेष ओपकोड के लिए अपने कदमों को शाखा देना चाहिए। ऑपकोड चुनने का दूसरी विधि थ्रेडेड कोड है। मेजबान मशीन के प्रीफैच तंत्र उस अनुक्रमित या अप्रत्यक्ष जम्प के लक्ष्य की भविष्यवाणी करने और प्राप्त करने में असमर्थ हैं। इसलिए होस्ट मशीन के निष्पादन पाइपलाइन को क्रमशः पुनरारंभ करना होगा जब होस्ट दुभाषिया किसी अन्य वर्चुअल निर्देश को डीकोड करता है। वर्चुअल मशीन की अन्य शैलियों की तुलना में यह वर्चुअल स्टैक मशीनों के लिए अधिक बार होता है।<ref name="Davis-Beatty-Casey-Gregg-Waldron_2005"/>


एक उदाहरण [[जावा (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा है।
एक उदाहरण [[जावा (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा है।
इसकी विहित वर्चुअल मशीन को 8-बिट स्टैक मशीन के रूप में निर्दिष्ट किया गया है। हालाँकि, [[Android (ऑपरेटिंग सिस्टम)]] [[स्मार्टफोन्स]] पर उपयोग की जाने वाली Java के लिए Dalvik (सॉफ़्टवेयर) वर्चुअल मशीन एक 16-बिट वर्चुअल-रजिस्टर मशीन है - दक्षता कारणों से बनाई गई पसंद। अंकगणितीय निर्देश सीधे 4-बिट (या बड़े) निर्देश क्षेत्रों के माध्यम से स्थानीय चरों को प्राप्त या संग्रहीत करते हैं।<ref name="Bornstein_2008"/>इसी तरह लुआ के संस्करण 5.0 ने अपनी वर्चुअल स्टैक मशीन को एक तेज़ वर्चुअल रजिस्टर मशीन से बदल दिया।<ref name="Lua5"/><ref name="Lua5_VM"/>


चूंकि जावा वर्चुअल मशीन लोकप्रिय हो गई है, माइक्रोप्रोसेसरों ने अप्रत्यक्ष छलांग के लिए उन्नत शाखा भविष्यवाणियों को नियोजित किया है।<ref name="inria"/>यह अग्रिम अधिकांश पाइपलाइन को एन-वे जंप से फिर से शुरू होने से बचाता है और ढेर दुभाषियों को प्रभावित करने वाली अधिकांश निर्देश गणना लागतों को समाप्त करता है।
इसकी विहित वर्चुअल मशीन को 8-बिट स्टैक मशीन के रूप में निर्दिष्ट किया गया है। चूंकि, [[Android (ऑपरेटिंग सिस्टम)|एंड्राॅयड (ऑपरेटिंग सिस्टम)]] [[स्मार्टफोन्स]] पर उपयोग की जाने वाली जावा के लिए डाल्विक (सॉफ़्टवेयर) वर्चुअल मशीन 16-बिट वर्चुअल-रजिस्टर मशीन है - दक्षता कारणों से बनाई गई पसंद के अनुरूप होता हैं। अंकगणितीय निर्देश सीधे 4-बिट (या बड़े) निर्देश क्षेत्रों के माध्यम से स्थानीय चरों को प्राप्त या संग्रहीत करते हैं।<ref name="Bornstein_2008" />इसी तरह लुआ के संस्करण 5.0 ने अपनी वर्चुअल स्टैक मशीन को तेज़ वर्चुअल रजिस्टर मशीन से परिवर्तन कर दिया जाता हैं।<ref name="Lua5" /><ref name="Lua5_VM" />
 
चूंकि जावा वर्चुअल मशीन लोकप्रिय हो गई है, माइक्रोप्रोसेसरों ने अप्रत्यक्ष जम्प के लिए उन्नत शाखा में की गई भविष्यवाणियों को नियोजित किया गया है।<ref name="inria" /> इस प्रकार यह अग्रिम अधिकांश पाइपलाइन को एन-वे जंप से फिर से प्रारंभ होने से बचाता है और ढेर दुभाषियों को प्रभावित करने वाली अधिकांश निर्देश गणना लागतों को समाप्त करता है।


== यह भी देखें ==
== यह भी देखें ==
* [[स्टैक-उन्मुख प्रोग्रामिंग भाषा]]
* [[स्टैक-उन्मुख प्रोग्रामिंग भाषा]]
* [[समसामयिक प्रोग्रामिंग भाषा]]
* [[समसामयिक प्रोग्रामिंग भाषा]]
* आवेदन आभासी मशीनों की तुलना
* आवेदन वर्चुअल मशीनों की तुलना
* [[एसईसीडी मशीन]]
* [[एसईसीडी मशीन]]
* [[संचायक मशीन]]
* [[संचायक मशीन]]
Line 225: Line 225:
}}
}}
==बाहरी संबंध==
==बाहरी संबंध==
* [http://www.excamera.com/sphinx/fpga-j1.html Homebrew CPU in an FPGA] &mdash; homebrew stack machine using FPGA
* [http://www.excamera.com/sphinx/fpga-j1.html Homebrew सीपीयू in an FPGA] &mdash; homebrew stack machine using FPGA
* [http://www.holmea.demon.co.uk/Mk1/Architecture.htm Mark 1 FORTH Computer] &mdash; homebrew stack machine using discrete logical circuits
* [http://www.holmea.demon.co.uk/Mk1/Architecture.htm Mark 1 FORTH Computer] &mdash; homebrew stack machine using discrete logical circuits
* [http://www.holmea.demon.co.uk/Mk2/Architecture.htm Mark 2 FORTH Computer] &mdash; homebrew stack machine using bitslice/PLD
* [http://www.holmea.demon.co.uk/Mk2/Architecture.htm Mark 2 FORTH Computer] &mdash; homebrew stack machine using bitslice/PLD
* [http://fpgacpu.ca/stack/Second-Generation_Stack_Computer_Architecture.pdf Second-Generation Stack Computer Architecture] &mdash; Thesis about the history and design of stack machines.
* [http://fpgacpu.ca/stack/Second-Generation_Stack_Computer_Architecture.pdf Second-Generation Stack Computer Architecture] &mdash; Thesis about the history and design of stack machines.
[[Category: गणना के मॉडल]] [[Category: स्टैक मशीनें]] [[Category: माइक्रोप्रोसेसरों]]


[[Category: Machine Translated Page]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Citation Style 1 templates|M]]
[[Category:Collapse templates]]
[[Category:Created On 17/02/2023]]
[[Category:Created On 17/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates based on the Citation/CS1 Lua module]]
[[Category:Templates generating COinS|Cite magazine]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Wikipedia fully protected templates|Cite magazine]]
[[Category:Wikipedia metatemplates]]
[[Category:गणना के मॉडल]]
[[Category:माइक्रोप्रोसेसरों]]
[[Category:स्टैक मशीनें]]

Latest revision as of 16:13, 2 March 2023

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

डिजाइन

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

पूर्णांक स्थिरांक ऑपरेंड Push या Load Immediate निर्देश द्वारा धकेले जाते हैं। इस प्रकार मेमोरी को अधिकांशतः अलग से Load या Store स्मृति पता युक्त निर्देश या ढेर में मानों से पते की गणना करने के लिए एक्सेस किया जाता है । इस प्रकार सभी व्यावहारिक स्टैक मशीनों में स्पष्ट पते की गणना के बिना स्थानीय चर और औपचारिक मापदंडों तक पहुँचने के लिए लोड-स्टोर ऑपकोड के वेरिएंट होते हैं। यह वर्तमान टॉप-ऑफ़-स्टैक पते से ऑफ़सेट द्वारा या स्थिर फ़्रेम-बेस रजिस्टर से ऑफ़सेट द्वारा हो सकता है।

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

व्यंजक A*(B-C) + (D+E) के लिए बाइनरी सिंटैक्स ट्री

उदाहरण के लिए, अभिव्यक्ति A*(B-C)+(D+E) पर विचार करें, जिसे रिवर्स पोलिश नोटेशन में A B C - * D E + + के रूप में लिखा गया है। इस प्रकार साधारण काल्पनिक स्टैक मशीन पर इसे संकलित करना और रन करने के लिए इसका रूप ले लेगा जो इस प्रकार होगा:

     # stack contents (leftmost = top = most recent):
 push A   #   A
 push B   #  B  A
 push C   # C B  A
 subtract  #  B-C A
 multiply  #   A*(B-C)
 push D   #  D  A*(B-C)
 push E   # E D  A*(B-C)
 add    #  D+E A*(B-C)

स्टैक के दो सबसे ऊपरी ऑपरेंड पर अंकगणितीय ऑपरेशन 'घटाना', 'गुणा' और 'जोड़ना' कार्य करते हैं। कंप्यूटर स्टैक के सबसे ऊपरी (वर्तमान के) मानों से दोनों ऑपरेंड लेता है। कंप्यूटर उन दो मानों को परिकलित अंतर, योग या उत्पाद से परिवर्तित कर देता हैं। दूसरे शब्दों में निर्देश के ऑपरेंड को स्टैक से पॉपअप किया जाता है, और इस प्रकार इसके परिणाम (ओं) को पुनः स्टैक करके वापस धकेल देता हैं, जो अगले निर्देश के लिए तैयार होता है।

स्टैक मशीनों में उनके एक्सप्रेशन स्टैक और उनके कॉल स्टैक या कॉल-रिटर्न स्टैक अलग या एकीकृत संरचना के रूप में संलग्न हो सकते हैं। यदि उन्हें अलग किया जाता है, तो स्टैक मशीन के निर्देश कम अंतःक्रियाओं और कम डिज़ाइन जटिलता के साथ निर्देश पाइपलाइनिंग हो सकते हैं, इसलिए यह सामान्यतः तेज़ी से रन करने लगता हैं।

संकलित स्टैक कोड का अनुकूलन अधिक संभव है। इस प्रकार कंपाइलर आउटपुट के बैक-एंड ऑप्टिमाइज़ेशन को कोड में महत्वपूर्ण सुधार करने के लिए प्रदर्शित किया गया है,[2][3]और संभावित प्रदर्शन, जबकि संकलक के भीतर वैश्विक अनुकूलन आगे लाभ प्राप्त करता है।[4]

भंडारण

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

इस पर विचार करे- X+1 यह संकलित करता है कि Load X. Load 1. Add रैम में पूर्ण रूप से संग्रहीत स्टैक के साथ, यह इन-मेमोरी स्टैक को लिखता और पढ़ता है:

  • एक्स लोड करें, मेमोरी को पुश किया जाता हैं
  • लोड 1, मेमोरी में पुश करते हैं
  • मेमोरी से 2 मान पॉप करके प्राप्त परिणाम को जोड़कर बाद में मेमोरी में पुश कर देते हैं।

कुल 5 डेटा कैश संदर्भों के लिए इसका उपयोग किया जाता हैं।

इस प्रकार इससे अगला कदम स्टैक मशीन या इंटरप्रेटर है जिसमें सिंगल टॉप-ऑफ-स्टैक रजिस्टर होता है। उपरोक्त कोड तब करता है:

  • एक्स को ओपेन टीओएस रजिस्टर (यदि हार्डवेयर मशीन है) में लोड करें या टीओएस रजिस्टर को मेमोरी में पुश करें, एक्स को टीओएस रजिस्टर में लोड करते हैं। (यदि दुभाषिया है)
  • TOS रजिस्टर को मेमोरी में पुश करें, 1 को TOS रजिस्टर में लोड करते हैं।
  • मेमोरी से लेफ्ट ऑपरेंड पॉप करें, टीओएस रजिस्टर में जोड़ें और इसे वहीं छोड़ देते हैं।

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

यदि हार्डवेयर्ड स्टैक मशीन में 2 या अधिक टॉप-स्टैक रजिस्टर या रजिस्टर फ़ाइल है, इस प्रकार इस उदाहरण में सभी मेमोरी एक्सेस से बचा जाता है और केवल 1 डेटा कैश चक्र होता है।

इतिहास और कार्यान्वयन

इस तरह की विधि का विवरण जिसमें रजिस्टरों में समय में केवल दो मानों की आवश्यकता होती है, इस प्रकार पूर्व-निर्धारित ऑपरेंडों के सीमित सेट के साथ, जो आगे ऑपरेंड, फ़ंक्शंस और सबरूटीन्स की परिभाषा द्वारा विस्तारित करने में सक्षम थे, पहले रॉबर्ट ने 1961 में एस बार्टन द्वारा सम्मेलन में प्रदान किया गया था।[5][6]

वाणिज्यिक संग्रहित मशीनें

हार्डवेयर में सीधे क्रियान्वित स्टैक निर्देश सेट के उदाहरणों में सम्मलित हैं

वर्चुअल स्टैक मशीनें

सॉफ़्टवेयर में व्याख्या की गई वर्चुअल मशीन स्टैक मशीनों के उदाहरण:

हाइब्रिड मशीनें

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

एक अन्य सरल हाइब्रिड रजिस्टर मशीन संरचना के साथ प्रारंभ करना है, और इस प्रकार अन्य मेमोरी एड्रेस मोड जोड़ना है जो स्टैक मशीनों के पुश या पॉप संचालन का अनुकरण करता है: 'मेमा एड्रेस = reg. रेग + = instr.displ'। इसे सबसे पहले डिजिटल उपकरण निगम के PDP-11 मिनीकंप्यूटर में उपयोग किया गया था। इस सुविधा को वैक्स कंप्यूटर और मोटोरोला 6800 और मोटोरोला 68000 माइक्रोप्रोसेसरों में आगे बढ़ाया गया था। इसने प्रारंभिक कंपाइलरों में सरल स्टैक विधियों के उपयोग की अनुमति दी गई थी। इस प्रकार यह स्टैक दुभाषियों या थ्रेडेड कोड का उपयोग करके वर्चुअल मशीनों का भी कुशलता से समर्थन करता है। चूंकि, इस सुविधा ने रजिस्टर मशीन के अपने कोड को शुद्ध स्टैक मशीन कोड के रूप में कॉम्पैक्ट बनने में सहायता नहीं की थी। साथ ही, रजिस्टर संरचना के लिए अच्छी तरह से संकलित करते समय निष्पादन की गति कम थी। टॉप-ऑफ़-स्टैक पॉइंटर को केवल कभी-कभी (कॉल या रिटर्न के अनुसार बार) परिवर्तन के अतिरिक्त प्रत्येक प्रोग्राम स्टेटमेंट में इसे निरंतर ऊपर और नीचे करना तेज़ होता है, और मेमोरी संदर्भों से पूर्ण रूप से बचने के लिए यह और भी तेज़ है।

वर्तमान में, तथाकथित दूसरी पीढ़ी की स्टैक मशीनों ने पता रजिस्टरों के रूप में कार्य करने के लिए रजिस्टरों के समर्पित संग्रह को अपनाया है, जो डेटा स्टैक से मेमोरी एड्रेसिंग के कार्य को ऑफ-लोड कर रहा है। उदाहरण के लिए, एमयूपी21 ए नामक रजिस्टर पर निर्भर करता है, जबकि हाल ही में ग्रीनअरे प्रोसेसर दो रजिस्टरों पर निर्भर करता है: ए और बी।[21]

माइक्रोप्रोसेसरों के इंटेल x86 परिवार में अधिकांश कार्यों के लिए रजिस्टर-शैली (संचायक) निर्देश सेट है, किन्तु इसके x87, इंटेल 8087 फ्लोटिंग पॉइंट अंकगणित के लिए स्टैक निर्देशों का उपयोग करते हैं, जो 8086 और 8088 के लिए iAPX87 (8087) कोप्रोसेसर के लिए वापस डेटिंग करते हैं। है, इस प्रकार कोई प्रोग्रामर-सुलभ फ़्लोटिंग पॉइंट रजिस्टर नहीं हैं, किन्तु केवल 80-बिट चौड़ा, 8-स्तरीय गहरा स्टैक है। x87 अपने कार्यों को करने में सहायता के लिए x86 सीपीयू पर बहुत अधिक निर्भर करता है।

कॉल स्टैक और स्टैक फ़्रेम का उपयोग करने वाले कंप्यूटर

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

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

कंप्यूटर सामान्यतः कार्यक्रम के वैश्विक चर और केवल वर्तमान अंतरतम प्रक्रिया या फ़ंक्शन के स्थानीय चर के लिए प्रत्यक्ष, कुशल पहुंच प्रदान करते हैं, सबसे ऊपरी फ्रेम में संग्रहित किया जाता हैं। कॉलर्स के स्टैक फ्रेम की सामग्री के 'ऊपरी स्तर' को संबोधित करने की सामान्यतः आवश्यकता नहीं होती है और इस प्रकार सीधे हार्डवेयर द्वारा समर्थित नहीं होती है। यदि आवश्यक हो, तो कंपाइलर फ्रेम पॉइंटर्स को अतिरिक्त, छिपे हुए पैरामीटर के रूप में पास करके इसका समर्थन करते हैं।

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

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

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

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

रजिस्टर मशीनों के साथ तुलना

स्टैक मशीनों की तुलना अधिकांशतः रजिस्टर मशीनों से की जाती है, जो प्रोसेसर रजिस्टरों की सरणी में मान रखती हैं। इस प्रकार रजिस्टर मशीनें इस सरणी में स्टैक जैसी संरचनाओं को संग्रहीत कर सकती हैं, किन्तु रजिस्टर मशीन में ऐसे निर्देश होते हैं जो स्टैक इंटरफ़ेस को बाधित करते हैं। रजिस्टर मशीनें नियमित रूप से स्टैक मशीनों से उत्तम प्रदर्शन करती हैं,[24] और स्टैक मशीनें हार्डवेयर सिस्टम में सबसे उत्तम हैं। किन्तु स्टैक मशीनों का उपयोग अधिकांशतः वर्चुअल मशीनों को लागू करने में उनकी सादगी और कार्यान्वयन में सरलता के कारण किया जाता है।[25]

निर्देश

स्टैक मशीनों में उच्च निर्देश सेट संरचना कोड घनत्व होता है। सामान्य स्टैक मशीन निर्देशों के विपरीत, जो सरलता से 6 बिट या उससे कम में फिट हो सकते हैं, रजिस्टर मशीनों को ऑपरेंड का चयन करने के लिए प्रति एएलयू निर्देश में दो या तीन रजिस्टर-नंबर फ़ील्ड की आवश्यकता होती है. सबसे सघन रजिस्टर मशीन का औसत लगभग 16 बिट्स प्रति निर्देश और ऑपरेंड होते हैं। इस प्रकार रजिस्टर मशीनें लोड-स्टोर ऑपकोड के लिए व्यापक ऑफ़सेट फ़ील्ड का भी उपयोग करती हैं। स्टैक मशीन का कॉम्पैक्ट कोड स्वाभाविक रूप से कैश में अधिक निर्देशों को फिट करता है, और इसलिए उत्तम सीपीयू कैश दक्षता प्राप्त कर सकता है, स्मृति लागत को कम कर सकता है या दी गई लागत के लिए तेज मेमोरी सिस्टम की अनुमति दे सकता है। इसके अतिरिक्त, अधिकांश स्टैक-मशीन निर्देश बहुत सरल होते हैं, केवल ओपकोड फ़ील्ड या ऑपरेंड फ़ील्ड से बने होते हैं। इस प्रकार, स्टैक-मशीनों को प्रत्येक निर्देश को डिकोड करने के लिए बहुत कम इलेक्ट्रॉनिक संसाधनों की आवश्यकता होती है।

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

अधिकांश रजिस्टर द्विभाषिया अपने रजिस्टरों को संख्या द्वारा निर्दिष्ट करते हैं। किन्तु इसकी मशीन के रजिस्टरों को अनुक्रमित सरणी में एक्सेस नहीं किया जा सकता है, इसलिए वर्चुअल रजिस्टरों के लिए मेमोरी सरणी आवंटित की जाती है। इसलिए, रजिस्टर दुभाषिया के निर्देशों को उत्पन्न डेटा को अगले निर्देश में पास करने के लिए मेमोरी का उपयोग करना चाहिए। इस प्रकार यह दुभाषियों को ठीक प्रक्रिया नियम (अर्ताथ परिपथ गति में सुधार के बिना तेज ट्रांजिस्टर, जैसे हैसवेल x86) के साथ बनाए गए माइक्रोप्रोसेसरों पर बहुत धीमा होने के लिए पंजीकृत करता है। मेमोरी एक्सेस के लिए इन्हें कई घड़ियों की आवश्यकता होती है, किन्तु रजिस्टर एक्सेस के लिए केवल घड़ी की सहायता ली जाती हैं। रजिस्टर फ़ाइल के अतिरिक्त डेटा फ़ॉरवर्डिंग परिपथ वाली स्टैक मशीन की स्थिति में, स्टैक दुभाषिए होस्ट मशीन की मेमोरी के अतिरिक्त स्टैक के शीर्ष कई ऑपरेंड के लिए होस्ट मशीन के रजिस्टरों को आवंटित कर सकते हैं।

एक स्टैक मशीन में, निर्देशों में प्रयुक्त ऑपरेंड सदैव ज्ञात ऑफ़सेट (स्टैक पॉइंटर में सेट) पर होते हैं, निश्चित स्थान से (स्टैक के नीचे, जो हार्डवेयर डिज़ाइन में सदैव स्मृति स्थान शून्य पर हो सकता है), कीमती इन-कैश (कंप्यूटिंग) या इन-सीपीयू स्टोरेज को बहुत सारे स्मृति पता या इंडेक्स नंबर स्टोर करने के लिए उपयोग होने से बचाया जाता हैं। यह गैर-प्रवाह संगणना में उपयोग के लिए ऐसे रजिस्टरों और कैश को संरक्षित कर सकता है।

अस्थायी / स्थानीय मान

उद्योग में कुछ लोगों का मानना ​​है कि स्टैक मशीनें रजिस्टर मशीनों की तुलना में अस्थायी मूल्यों और स्थानीय चर के लिए अधिक डेटा कैश चक्र निष्पादित करती हैं।[26]

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

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

दूसरी ओर, रजिस्टर मशीनों को अपने कई रजिस्टरों को नेस्टेड प्रक्रिया कॉल में मेमोरी में प्रसारित होना चाहिए। इस प्रकार कॉल की गतिशीलता के अतिरिक्त कंपाइल के समय क्या निर्णय लेना है, और इसे स्थिर रूप से किया जाता है। इससे उन्नत स्टैक मशीन कार्यान्वयन की तुलना में अधिक डेटा कैश ट्रैफ़िक हो सकता है।

सामान्य उप-अभिव्यक्तियाँ

रजिस्टर मशीनों में, सामान्य उप-अभिव्यक्ति (एक उप-अभिव्यक्ति जो ही परिणाम मूल्य के साथ कई बार उपयोग की जाती है) का मूल्यांकन केवल बार किया जा सकता है और इसका परिणाम तेजी से रजिस्टर में संग्रहित किया जाता है। बाद के पुन: उपयोग में कोई समय या कोड लागत नहीं है, यहाँ पर बस रजिस्टर इसका प्रमुख संदर्भ है। यह अनुकूलन सरल अभिव्यक्तियों (उदाहरण के लिए, वेरिएबल X या पॉइंटर P को लोड करना) के साथ-साथ कम-सामान्य जटिल अभिव्यक्तियों को गति देता है।

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

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

पाइपलाइनिंग

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

शेड्यूलिंग मेमोरी एक्सेस के लिए स्पष्ट, अतिरिक्त रजिस्टरों की आवश्यकता होती है। प्रोग्रामर को माइक्रो-संरचना के कुछ पहलू को उजागर किए बिना स्टैक मशीनों पर यह संभव नहीं है। अभिव्यक्ति ए बी - के लिए, बी का मूल्यांकन किया जाना चाहिए और माइनस कदम से तुरंत पहले धकेल दिया जाना चाहिए। स्टैक क्रमपरिवर्तन या हार्डवेयर मल्टीथ्रेडिंग के बिना, लोड बी के समाप्त होने की प्रतीक्षा करते समय अपेक्षाकृत कम उपयोगी कोड डाला जा सकता है। स्टैक मशीनें मेमोरी विलंब के आसपास कार्य कर सकती हैं या तो ही समय में कई निर्देशों को कवर करने वाली गहरी आउट-ऑफ-ऑर्डर निष्पादन पाइपलाइन हो सकती है, या अधिक संभावना है, वे स्टैक को अनुमति दे सकते हैं जैसे लोड पूरा होने पर वे अन्य वर्कलोड पर कार्य कर सकते हैं, या वे विभिन्न प्रोग्राम थ्रेड्स के निष्पादन को इंटरलेस कर सकता है, जैसा कि यूनिसिस ए 9 सिस्टम में है।[28]आज के तेजी से समानांतर कम्प्यूटेशनल भार से पता चलता है, चूंकि, यह अतीत में होने वाली हानि नहीं हो सकता है।

स्टैक मशीनें रजिस्टर मशीन के ऑपरेंड फ़ेचिंग चरण को छोड़ सकती हैं।[27]उदाहरण के लिए, जावा आप्टिमाइज्ड प्रोसेसर (JOP) माइक्रोप्रोसेसर में स्टैक के शीर्ष 2 ऑपरेंड सीधे डेटा फ़ॉरवर्डिंग परिपथ में प्रवेश करते हैं जो रजिस्टर फ़ाइल से तेज़ है।[29]

आउट-ऑफ-ऑर्डर निष्पादन

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

स्टैक मशीनों में आउट-ऑफ-ऑर्डर निष्पादन कई सैद्धांतिक और व्यावहारिक कठिनाइयों को कम या टालने लगता है।[30]उद्धृत शोध से पता चलता है कि ऐसी स्टैक मशीन निर्देश-स्तर समानता का फायदा उठा सकती है, और परिणामी हार्डवेयर को निर्देशों के लिए डेटा कैश करना चाहिए। ऐसी मशीनें प्रभावी ढंग से अधिकांश मेमोरी एक्सेस को स्टैक तक बायपास करती हैं। परिणाम बहुत अधिक कोड घनत्व के साथ खतरे रजिस्टर मशीनों की तुलना में थ्रूपुट (प्रति घड़ी दर निर्देश) प्राप्त करता है (क्योंकि ऑपरेंड पते निहित हैं)।

शोध में सामने आया विवाद यह था कि रजिस्टर मशीन के आरआईएससी निर्देश का कार्य करने के लिए लगभग 1.88 स्टैक-मशीन निर्देशों की आवश्यकता होती है। प्रतिस्पर्धी आउट-ऑफ-ऑर्डर स्टैक मशीनों को इसलिए निर्देशों को ट्रैक करने के लिए लगभग दोगुने इलेक्ट्रॉनिक संसाधनों की आवश्यकता होती है। इसकी भरपाई इंस्ट्रक्शन कैश और मेमोरी और इंस्ट्रक्शन डिकोडिंग परिपथ में बचत से की जा सकती है।

रजिस्टर मशीन

कुछ सरल स्टैक मशीनों में चिप डिज़ाइन होता है जो व्यक्तिगत रजिस्टरों के स्तर तक पूर्ण रूप से अनुकूलित होता है। स्टैक एड्रेस रजिस्टर का शीर्ष और स्टैक डेटा बफ़र्स का एन शीर्ष अलग-अलग रजिस्टर परिपथ से अलग-अलग योजक और तदर्थ कनेक्शन के साथ बनाया गया है।

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

माइक्रोकोड स्टैक मशीन इसका उदाहरण है। आंतरिक माइक्रोकोड इंजन किसी प्रकार की आरआईएससी-जैसी रजिस्टर मशीन या वीएलआईडब्ल्यू जैसी मशीन है जो कई रजिस्टर फाइलों का उपयोग करती है। जब कार्य-विशिष्ट माइक्रोकोड द्वारा सीधे नियंत्रित किया जाता है, तो उसी कार्य के लिए समान स्टैक कोड द्वारा अप्रत्यक्ष रूप से नियंत्रित किए जाने की तुलना में उस इंजन को प्रति चक्र बहुत अधिक कार्य पूरा होता है।

एचपी 3000 और टैंडम कंप्यूटर्स T/16 के लिए ऑब्जेक्ट कोड अनुवादक अन्य उदाहरण हैं।[31][32] उन्होंने स्टैक कोड अनुक्रमों को आरआईएससी कोड के समकक्ष अनुक्रमों में अनुवादित किया गया हैं। इस प्रकार सरलता से 'स्थानीय' अनुकूलन ने स्टैक संरचना के अधिकांश ओवरहेड को हटा दिया जाता हैं। इस प्रकार स्पेयर रजिस्टरों का उपयोग बार-बार पता गणनाओं को कारक बनाने के लिए किया गया था। मूल और लक्षित मशीनों के बीच बेमेल से अनुवादित कोड ने अभी भी बहुत सारे अनुकरण ओवरहेड को निरंतर रखा है। इसके अतिरिक्त, अनुवादित कोड की चक्र दक्षता मूल स्टैक कोड की चक्र दक्षता से मेल खाती है। और जब स्रोत कोड को सीधे रजिस्टर मशीन पर संकलक के अनुकूलन के माध्यम से पुन: संकलित किया गया, तो दक्षता दोगुनी हो जाती हैं। इससे पता चलता है कि स्टैक संरचना और इसके गैर-अनुकूलन कंपाइलर अंतर्निहित हार्डवेयर की आधी से अधिक शक्ति बर्बाद कर रहे थे।

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

चूँकि स्टैक अधिकांश सॉफ़्टवेयर प्रोग्रामों का घटक है, तब भी जब उपयोग किया जाने वाला सॉफ़्टवेयर कड़ाई से स्टैक मशीन नहीं है, हार्डवेयर स्टैक मशीन अपने प्रोग्रामों के आंतरिक कामकाज की अधिक बारीकी से नकल कर सकती है। प्रोसेसर रजिस्टरों की उच्च तापीय लागत होती है, और स्टैक मशीन उच्च ऊर्जा दक्षता का दावा कर सकती है।[20]

व्यवधान

एक रुकावट के जवाब में रजिस्टरों को स्टैक में सहेजना और फिर इंटरप्ट हैंडलर कोड को ब्रांच करना सम्मलित है। अधिकांशतः स्टैक मशीनें इंटरप्ट्स के लिए अधिक तेज़ी से प्रतिक्रिया करती हैं, क्योंकि अधिकांश पैरामीटर पहले से ही स्टैक पर हैं और उन्हें वहां धकेलने की कोई आवश्यकता नहीं है। कुछ रजिस्टर मशीनें इससे निपटने के लिए कई रजिस्टर फाइलें रखती हैं जिन्हें तुरंत स्वैप किया जा सकता है[33]किन्तु इससे लागत बढ़ जाती है और रजिस्टर फ़ाइल धीमी हो जाती है।

दुभाषिया

रजिस्टर मशीनों के दुभाषियों की तुलना में वर्चुअल स्टैक मशीनों के लिए दुभाषियों का निर्माण सरल है. कई निर्देशों में दोहराए जाने के अतिरिक्त मेमोरी एड्रेस मोड को संभालने का तर्क सिर्फ ही स्थान पर है। स्टैक मशीनों में ओपकोड की कम विविधताएं होती हैं. सामान्यीकृत ऑपकोड स्मृति संदर्भ या फ़ंक्शन कॉल सेटअप के बारंबार केस और अस्पष्ट कॉर्नर केस दोनों को हैंडल करेगा। (किन्तु ही ऑपरेशन के लिए छोटे और लंबे रूपों को जोड़कर अधिकांशतः कोड घनत्व में सुधार किया जाता है।)

वर्चुअल स्टैक मशीनों के लिए दुभाषिए अधिकांशतः वर्चुअल मशीन की अन्य शैलियों के दुभाषियों की तुलना में धीमे होते हैं।[34]गहरी निष्पादन पाइपलाइनों, जैसे वर्तमान x86 चिप्स के साथ होस्ट मशीनों पर चलते समय यह मंदी सबसे खराब है।

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

एक उदाहरण जावा (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा है।

इसकी विहित वर्चुअल मशीन को 8-बिट स्टैक मशीन के रूप में निर्दिष्ट किया गया है। चूंकि, एंड्राॅयड (ऑपरेटिंग सिस्टम) स्मार्टफोन्स पर उपयोग की जाने वाली जावा के लिए डाल्विक (सॉफ़्टवेयर) वर्चुअल मशीन 16-बिट वर्चुअल-रजिस्टर मशीन है - दक्षता कारणों से बनाई गई पसंद के अनुरूप होता हैं। अंकगणितीय निर्देश सीधे 4-बिट (या बड़े) निर्देश क्षेत्रों के माध्यम से स्थानीय चरों को प्राप्त या संग्रहीत करते हैं।[36]इसी तरह लुआ के संस्करण 5.0 ने अपनी वर्चुअल स्टैक मशीन को तेज़ वर्चुअल रजिस्टर मशीन से परिवर्तन कर दिया जाता हैं।[37][38]

चूंकि जावा वर्चुअल मशीन लोकप्रिय हो गई है, माइक्रोप्रोसेसरों ने अप्रत्यक्ष जम्प के लिए उन्नत शाखा में की गई भविष्यवाणियों को नियोजित किया गया है।[39] इस प्रकार यह अग्रिम अधिकांश पाइपलाइन को एन-वे जंप से फिर से प्रारंभ होने से बचाता है और ढेर दुभाषियों को प्रभावित करने वाली अधिकांश निर्देश गणना लागतों को समाप्त करता है।

यह भी देखें

संदर्भ

  1. Beard, Bob (Autumn 1997). "The KDF9 Computer - 30 Years On". Computer RESURRECTION.
  2. Koopman, Jr., Philip John (1994). "A Preliminary Exploration of Optimized Stack Code Generation" (PDF). Journal of Forth Applications and Research. 6 (3).
  3. Bailey, Chris (2000). "Inter-Boundary Scheduling of Stack Operands: A preliminary Study" (PDF). Proceedings of Euroforth 2000 Conference.
  4. Shannon, Mark; Bailey, Chris (2006). "Global Stack Allocation: Register Allocation for Stack Machines" (PDF). Proceedings of Euroforth Conference 2006.
  5. Barton, Robert S. (1961). "A new approach to the functional design of a digital computer". Papers Presented at the May 9-11, 1961, Western Joint IRE-AIEE-ACM Computer Conference. 1961 Western Joint IRE-AIEE-ACM Computer Conference. pp. 393–396. doi:10.1145/1460690.1460736. ISBN 978-1-45037872-7. S2CID 29044652.
  6. Barton, Robert S. (1987). "A new approach to the functional design of a digital computer". IEEE Annals of the History of Computing. 9: 11–15. doi:10.1109/MAHC.1987.10002.
  7. Blaauw, Gerrit Anne; Brooks, Jr., Frederick Phillips (1997). Computer architecture: Concepts and evolution. Boston, Massachusetts, USA: Addison-Wesley Longman Publishing Co., Inc.
  8. 8.0 8.1 LaForest, Charles Eric (April 2007). "2.1 Lukasiewicz and the First Generation: 2.1.2 Germany: Konrad Zuse (1910–1995); 2.2 The First Generation of Stack Computers: 2.2.1 Zuse Z4". Second-Generation Stack Computer Architecture (PDF) (thesis). Waterloo, Canada: University of Waterloo. p. 8, 11, etc. Archived (PDF) from the original on 2022-01-20. Retrieved 2022-07-02. (178 pages) [1]
  9. Greve, David A.; Wilding, Matthew M. (1998-01-12). "The World's First Java Processor". Electronic Engineering Times.
  10. "Mesa Processor Principles of Operation". DigiBarn Computer Museum. Xerox. Retrieved 2019-12-23.
  11. "DigiBarn: The Xerox Star 8010 "Dandelion"". DigiBarn Computer Museum. Retrieved 2019-12-23.
  12. MARC4 4-bit Microcontrollers Programmer's Guide (PDF). Atmel.
  13. "Forth chips". Colorforth.com. Archived from the original on 2006-02-15. Retrieved 2017-10-08.
  14. "F21 Microprocessor Overview". Ultratechnology.com. Retrieved 2017-10-08.
  15. "ForthFreak wiki". GitHub.com. 2017-08-25. Retrieved 2017-10-08.
  16. "A Java chip available -- now!". Developer.com. 1999-04-08. Retrieved 2022-07-07.
  17. "4stack Processor". bernd-paysan.de. Retrieved 2017-10-08.
  18. "Porting the GNU C Compiler to the Thor Microprocessor" (PDF). 1995-12-04. Archived from the original (PDF) on 2011-08-20. Retrieved 2011-03-30.
  19. "ZPU - the world's smallest 32-bit CPU with a GCC tool-chain: Overview". opencores.org. Retrieved 2015-02-07.
  20. 20.0 20.1 "Documents". GreenArrays, Inc. F18A Technology. Retrieved 2022-07-07.
  21. 21.0 21.1 "colorForth Instructions". Colorforth.com. Archived from the original on 2016-03-10. Retrieved 2017-10-08. (Instruction set of the F18A cores, named colorForth for historical reasons.)
  22. "GreenArrays, Inc". Greenarraychips.com. Retrieved 2017-10-08.
  23. Randell, Brian; Russell, Lawford John (1964). Algol 60 Implementation (PDF). London, UK: Academic Press. ISBN 0-12-578150-4.
  24. Shi, Yunhe; Gregg, David; Beatty, Andrew; Ertl, M. Anton (2005). "Virtual machine showdown: stack versus registers". Proceedings of the 1st ACM/USENIX International Conference on Virtual Execution Environments - VEE '05: 153. doi:10.1145/1064979.1065001. S2CID 811512.
  25. Hyde, Randall (2004). Write Great Code, Vol. 2: Thinking Low-Level, Writing High-Level (in English). Vol. 2. No Starch Press. p. 391. ISBN 978-1-59327-065-0. Retrieved 2021-06-30.
  26. "Computer Architecture: A Quantitative Approach", John L. Hennessy, David Andrew Patterson; See the discussion of stack machines.
  27. 27.0 27.1 Koopman, Jr., Philip John. "Stack Computers: the new wave". Ece.cmu.edu. Retrieved 2017-10-08.
  28. Introduction to A Series Systems (PDF). Burroughs Corporation. April 1986. Retrieved 2022-07-07.
  29. "Design and Implementation of an Efficient Stack Machine" (PDF). Jopdesign.com. Retrieved 2017-10-08.
  30. Chatterji, Satrajit; Ravindran, Kaushik. "BOOST: Berkeley's Out of Order Stack Thingie". Research Gate. Kaushik Ravindran. Retrieved 2016-02-16.
  31. Bergh, Arndt; Keilman, Keith; Magenheimer, Daniel; Miller, James (December 1987). "HP3000 Emulation on HP Precision Architecture Computers" (PDF). Hewlett-Packard Journal. Hewlett Packard: 87–89. Retrieved 2017-10-08.
  32. Migrating a CISC Computer Family onto RISC via Object Code Translation. Kristy Andrews, Duane Sand: Proceedings of ASPLOS-V, October 1992
  33. 8051 CPU Manual, Intel, 1980
  34. Shi, Yunhe; Gregg, David; Beatty, Andrew; Ertle, M. Anton. "Virtual Machine Showdown: Stack vs. Register Machine" (PDF). Usenix.org. Retrieved 2017-10-08.
  35. Davis, Brian; Beatty, Andrew; Casey, Kevin; Gregg, David; Waldron, John. "The Case for Virtual Register Machines" (PDF). Scss.tcd.ie. Retrieved 2017-10-08.
  36. Bornstein, Dan (2008-05-29). "Presentation of Dalvik VM Internals" (PDF). p. 22. Retrieved 2010-08-16.
  37. "The Implementation of Lua 5.0" (PDF). Lua.org. Retrieved 2017-10-08.
  38. "The Virtual Machine of Lua 5.0" (PDF). Inf.puc-rio.br. Retrieved 2017-10-08.
  39. "Branch Prediction and the Performance of Interpreters - Don't Trust Folklore". Hal.inria.fr. Retrieved 2017-10-08.

बाहरी संबंध