5

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

-edit-

प्रणाली बीच में आता है और कैसे करने के लिए (री) डेटा संकलन क्या मैं सबसे में दिलचस्पी है। और अधिक शोध करने पर मैं एक व्यक्ति (कोई स्रोत उपलब्ध) का इस्तेमाल किया js के बारे में सुना, मशीन कोड को पढ़ने के लिए , जेएस स्रोत आउटपुट और जेएस स्रोत 'compile' करने के लिए eval का उपयोग करें। दिलचस्प।

उत्तर

1

ऐसा लगता है चाहिए की तरह मैं लक्ष्य प्लेटफॉर्म मशीन कोड के ज्ञान के गतिशील पुनः संकलित करने के लिए

हाँ, बिल्कुल है। यही कारण है कि जावा वर्चुअल मशीन के कुछ हिस्सों को प्रत्येक वास्तुकला के लिए फिर से लिखा जाना चाहिए (अर्थात्, जेआईटी)।

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

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

-1

आईआईएस छाया प्रतिलिपि द्वारा ऐसा करता है: संकलन के बाद यह कुछ अस्थायी जगहों पर विधानसभाओं की प्रतिलिपि बनाता है और उन्हें अस्थायी रूप से चलाता है।

कल्पना कीजिए कि उपयोगकर्ता कुछ फ़ाइलों को बदलता है। (सभी अनुरोधों को पुराने कोड के द्वारा नियंत्रित)

  • प्रतियां नई विधानसभाओं (सभी अनुरोधों को पुराने कोड के द्वारा नियंत्रित)

    1. पुन: संयोजित
    2. सभी नए अनुरोधों नए कोड द्वारा नियंत्रित किया जाएगा: तब आईआईएस अगले चरणों में asseblies पुनः संकलित होगा , सभी अनुरोध - पुराने द्वारा।

    मुझे आशा है कि यह सहायक होगा।

  • +0

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

    1

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

    बेशक, अनुकरणकर्ताओं और वीएम को पुनः लिखना नहीं है, वे लोड-टाइम पर ऐसा कर सकते हैं।

    +0

    मुझे नहीं लगता कि आईई प्रोसेसर विशिष्ट पर प्रोसेसर को जानने के बिना मेमोरी पॉइंटर से कोड को अलग करना संभव है। –

    +0

    @acidzombie: आप जिस चीज के बारे में बात कर रहे हैं वह प्रोसेसर विशिष्ट है। –

    +0

    @acidzombie: सही - यह बहुत मंच विशिष्ट होगा। क्या कुछ खासकर है कि आप पूरा करने की कोशिश कर रहे हैं? –

    -2

    एक आभासी मशीन "बाइट कोड" या "इंटरमीडिएट भाषा" लोड करती है और इसलिए मशीन कोड नहीं, मुझे लगता है कि यह अधिक रनटाइम डेटा होने के बाद बाइट कोड को अधिक कुशलतापूर्वक पुन: संकलित करता है।

    http://en.wikipedia.org/wiki/Just-in-time_compilation

    +0

    चुनने का इंतजार कर रहा हूं? मैंने मशीन कोड के बजाए बाइटकोड का उपयोग करके वीएम के बारे में कभी नहीं सुना। क्या आप आशावादी हैं? मैं जेआईटी लागू करने से पहले वीएम में विंडोज एक्सपी/7/सर्वर को बाइटकोड के रूप में कैसे सोच सकता हूं। –

    +4

    @ एसिडज़ॉम्बी: आह, आप वीएम शब्द के दो संबंधित अर्थों को भ्रमित कर रहे हैं। जावा वर्चुअल मशीन वीएमवेयर वर्चुअल मशीन से एक पूरी तरह से अलग जानवर है। पहला वर्चुअल जावा आर्किटेक्चर, दूसरा वास्तविक (x86) आर्किटेक्चर अनुकरण करता है। "बाइट कोड" केवल वर्चुअल आर्किटेक्चर का असेंबलर है। – MSalters

    +0

    @MSalters: ओह, मैं देखता हूं कि आपका क्या मतलब है। अब मैं जानना चाहता हूं कि एक कैसे पुन: संकलित करता है। ऐसा लगता है कि मुझे गतिशील रूप से पुन: संकलित करने के लिए लक्ष्य प्लेटफ़ॉर्म मशीन कोड का ज्ञान होना चाहिए। मुझे अभी भी दिलचस्पी है कि इंटरप्ट कैसे प्रबंधित किए जाते हैं –

    0

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

    लेकिन एक ओपेकोड कैसे पढ़ता है और इसके लिए कोड कैसे उत्पन्न करता है?

    ऑपकोड की योजना वीएम के विनिर्देशन द्वारा परिभाषित की गई है, इसलिए वीएम प्रोग्राम फ़ाइल खोलता है, और इसे spec के अनुसार व्याख्या करता है।

    क्या व्यक्ति को प्रीडेड असेंबली भाग और प्रतिलिपि/बैच उन्हें एक साथ रखने की आवश्यकता है? सी में लिखी विधानसभा है?

    इस प्रक्रिया वी एम के एक कार्यान्वयन विस्तार है, आम तौर पर वहाँ एक संकलक एम्बेडेड है, जो मशीन कोड में वी एम opcode धारा को बदलने के लिए सक्षम है।

    सिस्टम इंटरप्ट के लिए आप कैसे खाते हैं?

    बहुत आसान: कोई नहीं। वीएम में कोड असली हार्डवेयर के साथ बातचीत नहीं कर सकता है। वीएम ओएस के साथ बातचीत करता है, और व्याख्या कोड के अंदर विशिष्ट भागों को कूद/कॉल करके ओएस घटनाओं को कोड में स्थानांतरित करता है। कोड या ओएस से प्रत्येक घटना को वीएम पास करना होगा।

    हार्डवेयर वर्चुअलाइजेशन उत्पाद कुछ प्रकार के जेआईटी का उपयोग कर सकते हैं। X86 दुनिया में एक सामान्य उपयोग के मामले 16 बिट वास्तविक मोड कोड का अनुवाद 32 या 64 बिट संरक्षित मोड कोड का अनुवाद है ताकि वास्तविक मोड में एक सीपीयू अनुकरण करने के लिए मजबूर नहीं किया जा सके। इसके अलावा एक सॉफ्टवेयर-केवल वीएम निष्पादन कोड में वीएम नियंत्रण सॉफ्टवेयर में कूदकर कूदने के निर्देशों को प्रतिस्थापित करता है, जो कि प्रत्येक शाखा में कूद नियंत्रण स्कैन के लिए निम्न कोड पथ और उन्हें प्रतिस्थापित करता है, इससे पहले कि यह वास्तविक कोड गंतव्य पर कूद जाए। लेकिन मुझे संदेह है कि कूद प्रतिस्थापन जेआईटी संकलन के रूप में योग्यता प्राप्त करता है।

    1

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

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

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

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

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

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