मैं एक वर्चुअल मशीन बनाना चाहता हूं, क्या कोई अच्छा संदर्भ हैं? [बन्द है]


22

मैं कुछ गेम कोड (अनिवार्य रूप से स्क्रिप्टिंग) को चलाने के लिए एक मंच के रूप में एक वर्चुअल मशीन का निर्माण करना चाहता हूं।

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

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

मेरी एकमात्र संदर्भ पुस्तक (जेड-मशीन सामान के अलावा) सीएलआई एनोटेट मानक है , लेकिन मुझे आश्चर्य है कि क्या वीएम के लिए एक बेहतर, अधिक सामान्य / मौलिक व्याख्यान है? मूल रूप से ड्रैगन बुक की तरह कुछ है , लेकिन वीएम के लिए? मुझे कंप्यूटर प्रोग्रामिंग के डोनाल्ड नुथ के आर्ट के बारे में पता है जो एक रजिस्टर-आधारित वीएम का उपयोग करता है, लेकिन मुझे यकीन नहीं है कि यह श्रृंखला अभी भी लागू है, खासकर जब से यह अभी भी अधूरा है?

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


Modern मुझे पता है, आधुनिक तकनीक मुझे मक्खी पर उच्च स्तरीय स्क्रिप्टिंग भाषा की व्याख्या करने की अनुमति देगी। लेकिन इसमें मज़ा कहाँ है? :) यह Google के लिए थोड़ा कठिन है क्योंकि आजकल वर्चुअल मशीनें अक्सर VMWare-टाइप OS वर्चुअलाइजेशन से जुड़ी हैं ...


6
ध्यान दें कि एक स्टैक आधारित मशीन ट्यूरिंग-पूर्ण होने के लिए इसे स्टैक के बाहर मेमोरी की आवश्यकता होती है अन्यथा यह सिर्फ एक पीडीए है
शाफ़्ट फ्रीक

1
पहला सवाल है: आप कितनी दूर जाना चाहते हैं? मैंने कभी भी SCUMM / SCUMMVM को नहीं देखा, लेकिन यह मान लीजिए कि ग्राफ़िकल चीजों के बारे में जानने के लिए उच्च स्तर है आदि। जबकि CIL है ... इसलिए आपको अपने मेमोरी मॉडल (स्टैक्डबेड रजिस्टर आधारित, मिश्रण, मेस, ..) और opcodes को परिभाषित करना होगा। यानी कोडांतरक निर्देश) और फिर VM का पहला संस्करण एक लूप है, do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);फिर शायद एक कंपाइलर ... और फिर मज़ा शुरू होता है - अनुकूलन इसे वास्तव में काम करने के लिए
johannes

3
एक सरल फोर्थ क्रम को लागू करने के साथ शुरू करने की कोशिश करें।
SK-तर्क

1
Quake 3वर्चुअल मशीन कितनी सही है ?
रामहुंड

3
@ राम आईडी आईडी इंजन लंबे समय तक आंतरिक वर्चुअलाइजेशन के किसी न किसी रूप का उपयोग करते हैं, यह लेख या विकिपीडिया की जानकारी बेहतर समझा सकती है।
डैनियल बी

जवाबों:


18

मैं लुआ की जाँच करके शुरू करूँगा । दोनों एक नमूना कार्यान्वयन के रूप में, और एक बहुत ही उपयोगी वीएम / भाषा के रूप में बॉक्स से बाहर निकलते हैं यदि आप अंत में अपना खुद का रोल नहीं करने का निर्णय लेते हैं।

स्रोत कोड बहुत पठनीय है, और एनोटेट स्रोत कोड भी है । और मुख्य लेखक, रॉबर्टो Ierusalimschy द्वारा लिखित कुछ डिज़ाइन दस्तावेज़

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

स्टैक के बारे में- बनाम रजिस्टर-आधारित, मुझे लगता है कि स्टैक-आधारित वीएम डिजाइन करना आसान है, लेकिन कंपाइलर अधिक जटिल हो सकता है। Iesualimschy पेपर नोट्स के रूप में, Lua पहले रजिस्टर-आधारित भाषा VMs में से एक था, लेकिन बाद में कई अन्य अंकुरित हुए, सबसे विशेष रूप से, LLVM, Dalvik, और कुछ आधुनिक जावास्क्रिप्ट VMs।


2
स्टैक बनाम रजिस्टर मशीनों के बारे में: मुझे तोता / पर्ल 6 देवों का एक उद्धरण याद है: "एक रजिस्टर आधारित मशीन का निर्माण कठिन है, लेकिन हम अपने संकलक पक्ष के लिए मौजूदा अनुसंधान के टन से लाभान्वित होते हैं" (शाब्दिक नहीं)
जोहान्स

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

अभी भी इससे गुजर रहा है। : वी एम के बारे में डेवलपर की ओर से एक और महान दस्तावेज़ inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
माइकल Stum

2

मेरे पास इस समय आपको लिंक करने के लिए कोई विशेष संसाधन नहीं हैं, लेकिन मैंने अतीत में इसी तरह के विषय पर शोध किया है और स्मॉलटाक वीएम को एक अच्छी शिक्षा सहायता के रूप में पाया है । स्मॉलटाकल द्वारा उपयोग किए जाने वाले बाइट कोड के बारे में कई अकादमिक पेपर और लेख लिखे गए हैं, साथ ही साथ व्याख्याकारों और वीएम को उस बायोटेक का उपयोग करने के लिए लिखा गया है। Google को बहुत सी पठन सामग्री मिलनी चाहिए smalltalk vm implementationया smalltalk bytecode interpreterमिलनी चाहिए।

यदि आप कुछ स्रोत कोड देखना चाहते हैं या कार्यान्वयन की कोशिश कर रहे हैं, तो मैं स्क्वीक या फेरो संस्करणों की सिफारिश करूंगा।

संबंधित भाषा / वीएम सेल्फ भी आपको रुचि दे सकती है, क्योंकि स्वयं मूल रूप से प्रोटोटाइप आधारित वस्तुओं (जावास्क्रिप्ट के समान) के साथ स्मॉलटॉक है।


0

मैं कैसे [स्क्रिप्ट] स्रोत कोड अपने मशीन या रनटाइम वातावरण में हो जाता है के विश्लेषण से शुरू होगा।

यदि आपके पास HTML दस्तावेज़ों में कुछ ऐसा है, <a onclick="dosomething();">तो आपको बहुत तेज़ संकलक की आवश्यकता होगी, बाईटेकोड निष्पादन की गति वास्तव में इस मामले में बहुत मायने नहीं रखती है। यदि आपके उपयोग के मामले जावा / .NET के करीब हैं, जहां आप पूर्ण विकसित संकलन का खर्च उठा सकते हैं, तो वीएम आर्किटेक्चर और बायटेकोड संरचना जावा बाइटकोड या आईएल के करीब होगी।

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

और मेरे द्वारा उपयोग किए जाने वाले अंतिम प्रमुख मानदंड आपकी भाषा की व्यापकता है। यदि आपके पास भाषा रनटाइम को जोड़ने की योजना है, तो C ++ के साथ एकीकरण के लिए कई मूल वस्तुओं / कार्यों को लागू किया जाता है, कहते हैं, C ++ तो आपका VM आर्किटेक्चर "सुविधाजनक" होना चाहिए। उदाहरण के लिए: यदि आप C ++ ऑब्जेक्ट्स को स्क्रिप्ट में उजागर करने की योजना बनाते हैं, तो वे आपके लिए एकमात्र विकल्प हैं, जो ढेर प्रबंधन (जैसे पायथन, बढ़ावा देखें :: एकीकरण के उदाहरण के रूप में अजगर) के रूप में संदर्भ की गिनती होगी। यदि आप चलती / कॉम्पैक्टिंग हीप / जीसी का उपयोग करने की योजना बनाते हैं तो यह अलग कहानी होगी। देशी सामान को रनटाइम में जोड़ने का लूआ का तरीका थोड़ा मुश्किल है [सी ++ डेवलपर्स के लिए]।

दूसरे शब्दों में, पहले अपने विशिष्ट उपयोग के मामले को परिभाषित करने का प्रयास करें और यह सुझाव देना आसान होगा कि आपके लिए क्या पढ़ना है।


1
आधुनिक जावास्क्रिप्ट कंपाइलर काफी जटिल हैं, और अच्छी तरह से सवाल है कि आपके द्वारा लगाए गए कोड का कितना अनुकूलन है?
johannes

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

@ डायलेन: जेएस उपयोग मामला, अजगर से काफी अलग है। पायथन में जब आपको किरण-अनुरेखण एल्गोरिथ्म कार्यान्वयन जैसी कुछ चीज़ों की आवश्यकता होती है, तो आप मूल पुस्तकालय करेंगे और इसे स्क्रिप्ट से कॉल करेंगे। यह हमेशा किसी भी JIT समाधान की तुलना में तेज़ (या कम से कम धीमा नहीं) होना चाहिए। जेएस दायरे में आपके पास देशी कोड के रूप में ऐसा लक्जरी नहीं है, इसलिए आपके लिए एकमात्र विकल्प यह है कि आप अपने जेएस वीएम को जितनी जल्दी हो सके बनाने की कोशिश करें। लेकिन फिर, कीमत के साथ। HTML में "dosomethingnative ()" का मूल्यांकन "<बटन onclick =" dosomethingnative () "> सरल दुभाषिया में V8 की तुलना में तेज़ी के क्रम में हो सकता है।
सी-स्माइल

@ c- मुस्कान मेरी बात बिल्कुल।

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