java - जावा इंटरफेस को आंतरिक रूप से कैसे लागू किया जाता है?(vtables?)



interface internals (1)

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

संपादित करें : हॉटस्पॉट विकी में वाइबेट और इटेबल स्टब्स पर अधिक विवरण हैं। बहुरूपी मामले में, यह अभी भी कॉल साइट में इनलाइन कैश संस्करण डालता है। हालाँकि, कोड वास्तव में एक स्टब है जो एक दृश्य में एक प्रदर्शन, या एक itable करता है। प्रत्येक व्यवहार्य ऑफसेट (0, 1, 2, ...) के लिए एक व्यवहार्य ठूंठ है। दिए गए ऑफसेट में इटैबल (यदि पाया गया) देखने से पहले इंटरफ़ेस कॉल इटैबल्स की एक सरणी पर एक रेखीय खोज जोड़ते हैं।

C ++ में कई विरासत हैं। विधानसभा स्तर पर कई उत्तराधिकार का कार्यान्वयन काफी जटिल हो सकता है, लेकिन ऑनलाइन descriptions अच्छे हैं कि यह सामान्य रूप से कैसे किया जाता है (vtables, सूचक फ़िक्सअप, थ्रॉक्स, आदि)।

जावा में एक से अधिक कार्यान्वयन वंशानुक्रम नहीं है, लेकिन इसमें एकाधिक इंटरफ़ेस वंशानुक्रम है, इसलिए मुझे नहीं लगता कि प्रति वर्ग के साथ एक एकल व्यवहार्यता के साथ एक सीधा आगे कार्यान्वयन इसे लागू कर सकता है। जावा आंतरिक रूप से इंटरफेस कैसे लागू करता है?

मुझे लगता है कि सी ++ के विपरीत, जावा जीट संकलित है, इसलिए कोड के विभिन्न टुकड़ों को अलग-अलग रूप से अनुकूलित किया जा सकता है, और विभिन्न जेवीएम चीजों को अलग तरीके से कर सकते हैं। तो, क्या कुछ सामान्य रणनीति है जो कई जेवीएम इस पर चलते हैं, या किसी को विशिष्ट जेवीएम में कार्यान्वयन का पता है?

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

(संदर्भ के लिए: यह प्रश्न सीएलआर के बारे में कुछ ऐसा ही पूछता है, और इस एमएसडीएन लेख में एक अच्छी व्याख्या प्रतीत होती है, हालांकि यह अब तक पुराना हो सकता है। मैं जावा के लिए कुछ भी समान नहीं पा सका हूं।)

संपादित करें:

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




language-implementation