स्टैक मशीन

From Vigyanwiki
Revision as of 21:00, 24 February 2023 by alpha>Poonam Singh

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

डिजाइन

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

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

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

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

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

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

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

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

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

ढेर भंडारण

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

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

  • एक्स लोड करें, मेमोरी को पुश करें
  • लोड 1, मेमोरी में पुश करें
  • मेमोरी से 2 मान पॉप करें, परिणाम जोड़ें और मेमोरी में पुश करें

कुल 5 डेटा कैश संदर्भों के लिए।

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

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

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

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

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

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

वाणिज्यिक ढेर मशीनें

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

निर्देश

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

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

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

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

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

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

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

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

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

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

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

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

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

पाइपलाइनिंग

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

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

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

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

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

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

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

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

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

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

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

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

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

व्यवधान

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

दुभाषिया

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

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

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

एक उदाहरण जावा (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा है। इसकी विहित वर्चुअल मशीन को 8-बिट स्टैक मशीन के रूप में निर्दिष्ट किया गया है। हालाँकि, Android (ऑपरेटिंग सिस्टम) स्मार्टफोन्स पर उपयोग की जाने वाली Java के लिए Dalvik (सॉफ़्टवेयर) वर्चुअल मशीन एक 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.

बाहरी संबंध