वीएम को "स्टैक मशीन" या "रजिस्टर मशीन" आदि होने की आवश्यकता क्यों है?


48

(यह एक अत्यंत नौसिखिया-ईश प्रश्न है)।

मैं वर्चुअल मशीन के बारे में थोड़ा अध्ययन कर रहा हूं।

उनमें से बहुत सारे मोड़ भौतिक या सैद्धांतिक कंप्यूटर के समान डिज़ाइन किए गए हैं।

मैंने पढ़ा कि उदाहरण के लिए, JVM एक 'स्टैक मशीन' है। इसका क्या मतलब है (और अगर मैं गलत हूं तो मुझे सुधारें) यह है कि यह सभी को एक स्टैक पर 'अस्थायी मेमोरी' संग्रहीत करता है, और इस स्टैक पर सभी ऑपकोड के लिए संचालन करता है।

उदाहरण के लिए, स्रोत कोड 2 + 3को बाइटकोड के समान अनुवाद किया जाएगा:

push 2
push 3
add

मेरा सवाल यह है:

JVM को संभवतः C / C ++ और ऐसे का उपयोग करके लिखा गया है। यदि हां, तो जेवीएम निम्नलिखित सी कोड को निष्पादित क्यों नहीं करता है: 2 + 3..? मेरा मतलब है, एक भौतिक कंप्यूटर की तरह, इसे या अन्य वीएम के 'रजिस्टरों' में स्टैक की आवश्यकता क्यों है?

अंतर्निहित भौतिक सीपीयू इस सब का ध्यान रखता है। वीएम लेखकों को केवल भाषा में 'सामान्य' निर्देशों के साथ व्याख्या किए गए बायटेकोड को निष्पादित क्यों नहीं किया जाता है, जिसे वीएम के साथ प्रोग्राम किया जाता है?

VM को हार्डवेयर का अनुकरण करने की आवश्यकता क्यों है, जब वास्तविक हार्डवेयर हमारे लिए पहले से ही ऐसा करता है?

फिर, बहुत नौसिखिया-ईश प्रश्न। आपकी सहायता के लिए धन्यवाद


5
क्या आपने माना है कि गैर- आभासी मशीनें किस पर आधारित हैं?

5
@MichaelT आप भौतिक मशीनों का मतलब है?
अवीव कोहन

बेशक, ज्यादातर जावास्क्रिप्ट वीएमएस स्टैक मशीन या रजिस्टर मशीन नहीं हैं - V8 / IonMonkey / चक्र / आदि वे VM हैं जो जावास्क्रिप्ट को लागू करते हैं। एक "वीएम" सिर्फ एक दुभाषिया या जेआईटी कंपाइलर है जो किसी भी भाषा को डिजाइनर की इच्छाओं को लागू कर सकता है।
बिली ओनली

@Billyoneal तो उदाहरण के लिए अगर मैं किसी भाषा के लिए VM लिख रहा हूँ और मैं इसे C में लिख रहा हूँ: VM बाईटकोड लाइन को "hi" प्रिंट करता है, और निष्पादित करता है printf("hi");: क्या इसे VM माना जाता है? इसका कोई 'स्टैक' या 'रजिस्टर' और या कुछ भी नहीं है।
अवीव कोहन

@ प्रोग: हां, यह सही है।
बिली ओनली

जवाबों:


51

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

वास्तव में, आभासी मशीनें हैं जो आपके द्वारा वर्णित उच्च-स्तरीय हैं। उन्हें प्रोग्रामिंग लैंग्वेज कहा जाता है । उदाहरण के लिए C मानक तथाकथित "C सार मशीन" के लिए एक मॉडल को परिभाषित करने के लिए अपने पृष्ठों के थोक को समर्पित करता है, जो बताता है कि C प्रोग्राम कैसे व्यवहार करते हैं, और विस्तार के रूप में (यदि-नियम) कैसे एक अनुरूप C संकलक (या दुभाषिया) अच्छे से पेश आएँ।

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

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

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

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


तो आप क्या कह रहे हैं कि स्टैक पर निर्देशों के लिए सब कुछ System.out.println("hi");संकलित करना (यानी स्टैक पर कुछ निर्देश के int a = 7लिए संकलित किया जाता है, स्टैक पर एक निर्देश के लिए संकलित किया जाता है) कार्यक्रम को सरल और अधिक कुशल निष्पादित करता है?
अवीव कोहन

2
@ प्रोग मूल रूप से, हाँ। लेकिन सिर्फ निष्पादन नहीं, विश्लेषण भी। सब कुछ जो प्रोग्रामेटिक रूप से किया जाता है।

फिर भी, मुझे समझ में नहीं आता कि क्यों 2 + 3संकलित किया जाता है push 2 push 3 addaddअंत में कदम सी कोड चलाकर वैसे भी JVM द्वारा निष्पादित किया जाता है 2 + 3। जेवीएम के प्रोग्रामर्स के लिए ऐसा करने का कोई और तरीका नहीं है। क्यों नहीं इसे संकलित करें 2 + 3, और जेवीएम ने अभी सी कोड निष्पादित किया है 2 + 3(यह मानते हुए कि यह सी में लिखा गया है) अभी तुरंत?
अवीव कोहन

@Prog जेवीएम लेखक सिर्फ 2 + 3जेवीएम स्रोत कोड में नहीं लिख सकता है क्योंकि जेवीएम को किसी भी क्रम में किसी भी ऑपरेशन को करने वाले किसी भी कार्यक्रम के साथ काम करना पड़ता है। C स्रोत कोड का निर्माण करना और C क्रियान्वयन के लिए डीफ़ॉर्म करना C समस्या को समान रूप से C कार्यान्वयन में धकेलता है (इसे आसानी से नहीं किया जा सकता, अकेले कुशलतापूर्वक लागू करें)। कुछ डेटा संरचना होनी चाहिए जो प्रोग्राम का वर्णन करती है, ताकि इसकी व्याख्या की जा सके और जेआईटी संकलित हो, और "मानव पठनीय स्रोत कोड" ऊपर उल्लिखित कारणों के लिए डेटा संरचना का एक भयानक विकल्प है।

7
@ प्रश्न आप 2 + 3 के विशिष्ट मामले पर भी ध्यान केंद्रित कर रहे हैं a + b। फिर जोड़ने के मूल्यों से नहीं आते हैं i.argument{1,2}, वे स्थानीय चर से भरी हुई हैं। किस बारे में frobnicate(x[i]) + (Foo.bar() * 2)? इस डिजाइन का उपयोग करते हुए, केवल एक ही addऑपरेशन (के लिए int) होता है और यह स्वतंत्र रूप से काम करता है कि जोड़ कैसे गणना किए गए थे। साथ ही, एक निर्देश जो केवल पूर्णांक शाब्दिक जोड़ता है, निरर्थक होगा: इसका परिणाम सिर्फ पूर्व-संगणित किया जा सकता है (अर्थात इसके बजाय add(2,3)यह होना चाहिए push(5))।

20

यह उत्तर JVM पर केंद्रित है, लेकिन वास्तव में यह किसी भी वीएम पर लागू होता है।

VM को हार्डवेयर का अनुकरण करने की आवश्यकता क्यों है, जब वास्तविक हार्डवेयर हमारे लिए पहले से ही ऐसा करता है?

वे नहीं करते हैं, लेकिन यह VM को बहुत सरल और पोर्टेबल बनाता है: एक VM जो हार्डवेयर का अनुकरण करता है वह किसी भी हार्डवेयर CPU की तुलना में एक ही कम्प्यूटेशनल मॉडल का उपयोग कर सकता है।

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

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

मेरा मतलब है, एक भौतिक कंप्यूटर की तरह, इसे या अन्य वीएम के 'रजिस्टरों' में स्टैक की आवश्यकता क्यों है?

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

अंतर्निहित भौतिक सीपीयू इस सब का ध्यान रखता है। वीएम लेखकों को केवल भाषा में 'सामान्य' निर्देशों के साथ व्याख्या किए गए बायटेकोड को निष्पादित क्यों नहीं किया जाता है, जिसे वीएम के साथ प्रोग्राम किया जाता है?

खैर, यह है कि इस तरह के वीएम क्या करते हैं, वे बायटेकोड की व्याख्या करते हैं। यहां तक ​​कि जेवीएम वास्तव में ऐसा करता है, कम से कम जेआईटी (सिर्फ-इन-टाइम) में किक करने से पहले: यह बाइट कोड की व्याख्या करता है और जिस भाषा में जेवीएम लिखा गया था, उसमें बयानों को निष्पादित करता है (आमतौर पर सी या सी ++, लेकिन वहाँ भी एक लिखा है। जावास्क्रिप्ट में, डोपियो )। ध्यान दें, हालांकि, इस तरह के बयान भी एक संकलक द्वारा मशीन कोड के लिए अनुवादित किए गए थे और वास्तव में जावा कंपाइलर के उत्पादन के लिए बहुत समान दिखते हैं - अर्थात्, वे अपने काम को करने के लिए रजिस्टरों और स्टैक का उपयोग करते हैं। ध्यान दें कि "व्याख्या की गई" बनाम "संकलित" भाषाओं का उपयोग इस बिंदु पर कुछ धुंधला हो जाता है ।


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

2
@Billyoneal "विधि द्वारा संकलन विधि के बजाय, बस समय में, जावा हॉटस्पॉट वीएम तुरंत एक दुभाषिया का उपयोग करके कार्यक्रम चलाता है, और कोड का विश्लेषण करता है क्योंकि यह कार्यक्रम में महत्वपूर्ण गर्म स्थानों का पता लगाने के लिए चलता है। फिर यह एक जावा का ध्यान केंद्रित करता है। हॉट स्पॉट पर वैश्विक देशी-कोड अनुकूलक। " oracle.com/technetwork/java/whitepaper-135217.html#2 से उद्धृत ," हॉट स्पॉट डिटेक्शन "
चमत्कारिक

हाँ। "नेटिव कोड ऑप्टिमाइज़र" == JIT संकलन। कोड के लिए एक दुभाषिया चरण होता है जो शायद ही कभी इस्तेमाल की जाने वाली चीज़ों से बचने के लिए "गर्म" प्रतीत नहीं होता है। लेकिन इसका मतलब यह नहीं है कि कोई भी JITing नहीं की जाती है।
बिली ओनली

जवाब के लिए धन्यवाद। मैंने आपके उत्तर से जो इकट्ठा किया है, वह यह है कि वीएम में हार्डवेयर का अनुकरण करने का कारण ('ढेर' या 'रजिस्टर' आदि) है, क्योंकि इससे बाद में बायटेकोड या स्रोत कोड को वास्तविक मशीन कोड में संकलित करना आसान हो जाता है। भौतिक सीपीयू। हालांकि इसके अलावा - क्या वीएम में हार्डवेयर का अनुकरण करने से कुछ हासिल होता है? मुझे अभी भी समझ में नहीं आया है कि जब कोई वीएम डिजाइन कर रहा होता है तो वह 'स्टैक मशीन' या 'रजिस्टर मशीन' आदि के संदर्भ में क्या सोचता है, जब हम सॉफ्टवेयर के बारे में बात कर रहे होते हैं। क्या मैं कुछ भूल रहा हूँ?
अवीव कोहन

@ प्रोग ठीक है, आपके पास एक प्रोग्रामिंग भाषा है, एक्स कहें। आप इसके प्रोग्राम कैसे चलाएंगे? आप स्रोत की व्याख्या कर सकते हैं या इसे मशीन कोड में संकलित कर सकते हैं, या इसे कुछ मध्यवर्ती कोड में संकलित कर सकते हैं। अब आपके पास एक अन्य प्रोग्रामिंग भाषा है, Y, और X का उपयोग करके इसे लागू करना चाहते हैं। यदि दोनों कार्यान्वयन दुभाषिया हैं, तो आपके पास X के दुभाषिया पर चलने वाले Y की व्याख्या होगी, और यह बहुत धीमी होगी।
18446744073709551615

11

वीएम को "स्टैक मशीन" या "रजिस्टर मशीन" आदि होने की आवश्यकता क्यों है?

वे नहीं। यदि आपको वर्चुअल मशीन की आवश्यकता है, तो यह कुछ भी हो सकता है।

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

दूसरी ओर, "2 + 3" जैसी संकेतन का उपयोग संभवतः भविष्य में वीएम द्वारा उपयोग नहीं किया जाएगा क्योंकि इसका अर्थ है कि कुछ निष्पादित होने से पहले बहुत अधिक परिवर्तन करना।


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

1
रजिस्टरों को रजिस्टर आवंटन एल्गोरिदम की आवश्यकता होती है, जिसमें सिद्धांत और डीबगिंग दोनों की आवश्यकता होती है। एक स्टैक मशीन (एक शून्य-ऑपरेंड एक) केवल स्टैक पर डेटा रख सकती है। OTOH, हार्डवेयर आमतौर पर एक चर-आकार के ढेर के बजाय सीमित मात्रा में रजिस्टरों को लागू करता है। तो सॉफ्टवेयर के लिए ढेर आसान होते हैं, रजिस्टर हार्डवेयर के लिए आसान होते हैं और शायद इसलिए थोड़ा तेज होते हैं।
18446744073709551615

-2

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


क्या यह केवल आपकी राय है या आप इसे किसी तरह वापस कर सकते हैं?
gnat 5

@ क्रेलेल असत्य है। "सभी" हार्डवेयर का अनुकरण "सिस्टम" या "पूर्ण" वीएम में किया जाता है। सभी VM भरे नहीं हैं। उदाहरण के लिए, बीएसडी वीएम परत को "वर्चुअल मशीन" नाम दिया गया है, इसके बावजूद कि हार्डवेयर का अनुकरण नहीं किया जाता है।
10

मुझे नहीं लगता कि सवाल जरूरी शब्दावली के बारे में है, बल्कि यह भी है कि आभासी मशीनें कार्यक्षमता को लागू क्यों करती हैं जो कि वास्तविक हार्डवेयर द्वारा पहले से ही संभाला जाता है
रयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.