स्टैक मशीन

From Vigyanwiki

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

डिजाइन

अधिकांश या सभी स्टैक मशीन निर्देश मानते हैं कि ऑपरेंड स्टैक से होंगे और परिणाम स्टैक में रखे जाते हैं। इस प्रकार स्टैक सरलता से दो से अधिक इनपुट या से अधिक परिणाम देता है, इसलिए संचालन के समृद्ध सेट की गणना की जा सकती है। इस प्रकार स्टैक मशीन कोड (कभी-कभी पी-कोड कहा जाता है) में, निर्देशों में अधिकांशतः केवल ओपी कोड होता है जो होने वाले विभिन्न ऑपरेशन को कमांड करता है, इस प्रकार बिना किसी अतिरिक्त फ़ील्ड के स्थिर, रजिस्टर या मेमोरी सेल की पहचान करता है, जिसे शून्य पता प्रारूप के रूप में जाना जाता है।[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.

बाहरी संबंध