2009-05-29 16 views
18

मैं देख रहा हूं कि प्रोग्रामिंग भाषाएं कैसे काम करती हैं, और उनमें से कुछ में तथाकथित आभासी मशीनें हैं। मैं समझता हूं कि यह प्रोग्रामिंग भाषा के किसी अन्य प्रोग्रामिंग भाषा के अनुकरण का कुछ रूप है, और यह काम करता है कि एक ढेर भाषा के साथ एक संकलित भाषा कैसे निष्पादित की जाएगी। क्या मैने इसे सही समझा?वर्चुअल मशीन कैसे काम करती है?

मेरे द्वारा किए गए प्रावधान के साथ, मुझे कौन सा बांसोज़ल है कि कई गैर-संकलित भाषाएं "उदार" प्रकार प्रणालियों के साथ चर की अनुमति देती हैं। उदाहरण के लिए पायथन में, मैं यह लिख सकते हैं:

x = "Hello world!" 
x = 2**1000 

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

+4

महान पहला सवाल! – samoz

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/688803/how-does-a-register-based-virtual-machine-work – lothar

उत्तर

7

शायद, आपके प्रश्न का शीर्षक "गतिशील भाषाओं काम कैसे करें?"

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

+0

आह, मैं देखता हूं। लेकिन पुनर्मूल्यांकन के दौरान क्या होता है? यदि नया डेटा पुराने से बड़ा है, तो यह कहां रखा गया है और पुराने डेटा का क्या हो रहा है? – Martin

+2

ऑब्जेक्ट की वास्तविक सामग्री कहीं और संग्रहीत की जा सकती है और केवल एक संदर्भ स्थान पर संग्रहीत किया जाएगा। एक गतिशील भाषा को लागू करने के लिए बहुत सारी तकनीकें हैं। क्या होता है वास्तव में आपकी भाषा के विशेष कार्यान्वयन पर निर्भर करता है। –

+0

http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing –

2

अधिकांश वीएम भाषाओं में, चर को ढेर में स्मृति के लिए पॉइंटर्स (या संदर्भ) के रूप में अवधारणाबद्ध किया जा सकता है, भले ही चर स्वयं ढेर पर हो। उन भाषाओं के लिए जिनके पास आदिम प्रकार हैं (जावा में int और bool, उदाहरण के लिए) जिन्हें स्टैक पर भी संग्रहीत किया जा सकता है, लेकिन उन्हें गतिशील रूप से नए प्रकार असाइन नहीं किए जा सकते हैं।

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

+0

स्टैक का उपयोग क्यों किया जाता है यदि इसमें केवल ढेर के पॉइंटर्स होते हैं? क्या आंतरिक रूप से पॉइंटर्स को स्टोर करना और स्मार्ट स्टैक दृष्टिकोण को छोड़ना बेहतर नहीं होगा? – Martin

+0

रिकर्सिव कॉल के लिए स्टैक की आवश्यकता है। जब कोई फ़ंक्शन स्वयं कॉल करता है, तो उसे चर के एक नए सेट की आवश्यकता होती है, या आप उसी कॉल पर बाहरी कॉल के चर को ओवरराइट कर देंगे। आपको किसी प्रकार का ढेर चाहिए ताकि आप जान सकें कि वर्तमान ऑपरेशन के अंतिम चर हैं। अभिव्यक्ति से अस्थायी परिणाम रखने के लिए यह "स्क्रैच स्पेस" के रूप में भी उपयोगी है। – uliwitness

1

'वीएम इस तरह के वैरिएबल को कैसे संभालते हैं या' वास्तव में मेटाडेटा पर आते हैं ... की मेटा जानकारी संग्रहीत और फिर अपडेट की गई वीएम को आवंटित करने के तरीके पर एक बेहतर संभाल देता है और फिर करता है चर के साथ सही बात है।

कई मामलों में यह ओवरहेड का प्रकार है जो वास्तव में प्रदर्शन के तरीके में हो सकता है। हालांकि, आधुनिक दिन के कार्यान्वयन आदि सही काम करने में काफी लंबा सफर तय कर चुके हैं।

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

1

अपने सवालों के एक हिस्से का जवाब देने के लिए, मैं google tech talk about python की सिफारिश करता हूं, जहां गतिशील भाषाओं से संबंधित आपके कुछ प्रश्नों का उत्तर दिया जाता है; उदाहरण के लिए एक चर क्या है (यह एक सूचक नहीं है, न ही एक संदर्भ है, लेकिन पाइथन के मामले में एक लेबल)।

2

वीएम के पास भाषा के साथ कुछ लेना देना नहीं है। कोई भी भाषा वीएम के शीर्ष पर चल सकती है (जावा वीएम में पहले से ही सैकड़ों भाषाएं हैं)।

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

यह बहुत कम स्तर है, और कई मामलों में रजिस्टरों के बजाए भारी ढेर पर आधारित है, मशीन-स्तरीय गणित वर्तमान स्टैक पॉइंटर से संबंधित स्थानों से संबंधित है।

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

वीएम यह सब एक एकल, लघु निर्देश, संभवतः एक या दो बाइट्स के बजाय मशीन भाषा में प्रति निर्देश 4 या 8 बाइट्स के बजाय करता है (32 या 64 बिट आर्किटेक्चर के आधार पर) जो (अनुमान लगाने) का मतलब x86 के 16 या 32 बाइट्स के लिए होना चाहिए मशीन कोड के 1-2 बाइट्स। (मैं गलत हो सकता है, मेरा आखिरी 86 कोडिंग 80286 युग में था।)

माइक्रोसॉफ्ट इस्तेमाल किया (शायद अभी भी उपयोग करता है) VMs उनके कार्यालय उत्पादों में कोड की मात्रा को कम करने के लिए।

सीआर की प्रक्रिया वीएम कोड खाने के लिए मशीन भाषा बनाने के समान ही है, केवल एक अलग प्रोसेसर प्रकार अनिवार्य रूप से।

वीएम अपनी स्वयं की सुरक्षा, त्रुटि वसूली और स्मृति तंत्र को भी लागू कर सकते हैं जो भाषा से बहुत कड़े से जुड़े हुए हैं।

यहां मेरा कुछ विवरण सारांश और स्मृति से है। आप बाईटकोड परिभाषा अपने आप को पता लगाने के लिए चाहते हैं, यह थोड़े मजेदार है:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html

संबंधित मुद्दे