2012-01-23 14 views
6

ठीक है, मैंने जेआईटी और गैर-जेआईटी सक्षम दुभाषियों के बीच मतभेदों के बारे में कई चर्चाएं पढ़ी हैं, और जेआईटी आमतौर पर प्रदर्शन को बढ़ावा देती है।दोनों जेआईटी और गैर-जेआईटी सक्षम इंटरप्रिटर न करें मशीन कोड

लेकिन, मेरा सवाल यह है:

अंत में, एक गैर JIT दुभाषिया, मशीन/मूल कोड में बाईटकोड (लाइन द्वारा लाइन) मुड़ने के लिए निष्पादित करने के लिए नहीं है सक्षम जैसे एक JIT कम्पाइलर करना होगा ? मैंने पोस्ट और पाठ्यपुस्तकों को देखा है जो कहते हैं कि यह करता है, और पोस्ट जो कहते हैं कि यह नहीं करता है। बाद का तर्क यह है कि दुभाषिया/जेवीएम इस बाइटकोड को सीधे मशीन/मूल कोड के साथ कोई बातचीत नहीं करता है।

गैर JIT दुभाषिए मशीन कोड में प्रत्येक पंक्ति बारी करते हैं, ऐसा लगता है कि JIT के प्राथमिक लाभों रहे हैं ...

  1. कैशिंग या तो सभी (सामान्य JIT) की बुद्धि या अक्सर सामना करना पड़ा (हॉटस्पॉट/अनुकूली अनुकूलन) बाइटकोड के कुछ हिस्सों ताकि मशीन कोड संकलन चरण हर बार जरूरी नहीं है।

  2. कोई भी अनुकूलन जेआईटी कंपाइलर मशीन कोड में बाइटकोड का अनुवाद करने में प्रदर्शन कर सकता है।

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

अग्रिम धन्यवाद।

उत्तर

8

एक गैर-जेआईटी दुभाषिया बाइटकोड को मशीन कोड में परिवर्तित नहीं करता है। आप इस प्रकार का गैर JIT बाईटकोड दुभाषिया कुछ के कामकाज कल्पना कर सकते हैं (मैं एक जावा की तरह स्यूडोकोड इस्तेमाल करेंगे):

int[] bytecodes = { ... }; 
int ip  = 0; // instruction pointer 
while(true) { 
    int code = bytecodes[ip]; 
    switch(code) { 
    case 0; 
     // do something 
     ip += 1; break; 
    case 1: 
     // do something else 
     ip += 1; break; 
    // and so on... 
    } 
} 

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

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

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

+0

प्रतिक्रिया के लिए धन्यवाद! मैं "सी ++ में खेलों और ग्राफिक्स के साथ शुरू करना" पुस्तक पढ़ रहा था, और यह उल्लेख करता है "दुभाषिया प्रत्येक उच्च स्तरीय निर्देश को इसके समतुल्य मशीन भाषा निर्देश में अनुवाद करता है और तुरंत इसे निष्पादित करता है।" यही वह जगह है जहां भ्रम शुरू हुआ। हालांकि, यह सामान्य रूप से दुभाषियों के बारे में बात कर रहा था। –

+0

एक दुभाषिया मशीन भाषा के एक वर्ग में स्विच/कूदकर मशीन स्तर पर उच्च स्तरीय आदेशों का अनुवाद करता है जो उच्च स्तरीय कमांड द्वारा प्रस्तुत ऑपरेशन लागू करता है। –

0

दशकों पहले, एक व्यापक धारणा प्रतीत होती है कि कंपाइलर्स पूरे कार्यक्रम को मशीन कोड में बदल देंगे, जबकि दुभाषिया मशीन कथन में एक कथन का अनुवाद करेंगे, इसे निष्पादित करेंगे, इसे छोड़ दें, अगले का अनुवाद करें, आदि। 99% गलत था, लेकिन इसमें सत्य के दो छोटे कर्नल थे। कुछ माइक्रोप्रोसेसरों पर, कुछ निर्देशों को कोड में निर्दिष्ट पते के उपयोग की आवश्यकता होती है। उदाहरण के लिए, 8080 पर, एक निर्दिष्ट I/O पता 0x00-0xFF पढ़ने या लिखने के लिए एक निर्देश था, लेकिन पंजीकरण में निर्दिष्ट I/O पता पढ़ने या लिखने के लिए कोई निर्देश नहीं था। भाषा दुभाषियों के लिए यह आम था, अगर उपयोगकर्ता कोड ने "123,45" से कुछ किया, तो स्मृति के तीन बाइट्स में "7 बीएच/रेट" निर्देशों को संग्रहित करने के लिए, 2 डीएच के साथ संचयक लोड करें, और पहले को कॉल करें उन निर्देशों।उस स्थिति में, दुभाषिया वास्तव में व्याख्या किए गए निर्देश को निष्पादित करने के लिए मशीन कोड निर्देश तैयार करेगा। हालांकि, इस तरह की कोड पीढ़ी ज्यादातर आईएन और आउट निर्देशों जैसी चीजों तक ही सीमित थी।

6502 (और शायद 8080 के साथ) के लिए कई सामान्य माइक्रोसॉफ्ट बेसिक दुभाषियों ने रैम में संग्रहीत कोड का कुछ और व्यापक उपयोग किया है, लेकिन राम में संग्रहीत कोड महत्वपूर्ण रूप से प्रोग्राम पर निर्भर नहीं है; रैम रूटीन का बहुमत कार्यक्रम निष्पादन के दौरान नहीं बदलेगा, लेकिन अगले निर्देश का पता नियमित रूप से एक पूर्ण-मोड "एलडीए" निर्देश के उपयोग की अनुमति देने वाले दिनचर्या के हिस्से के रूप में रखा गया था, जिसने कम से कम एक चक्र को बचाया हर बाइट fetch।

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