2010-12-12 12 views
36

सी ++ में एकाधिक विरासत है। असेंबली स्तर पर एकाधिक विरासत का कार्यान्वयन काफी जटिल हो सकता है, लेकिन यह सामान्य रूप से कैसे किया जाता है (vtables, सूचक फिक्सअप, थंक्स इत्यादि) पर descriptions अच्छा है।जावा इंटरफेस आंतरिक रूप से कैसे कार्यान्वित किए जाते हैं? (vtables?)

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

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

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

(संदर्भ के लिए: this question CLR के बारे में कुछ इसी तरह पूछता है, और वहाँ this msdn article में एक अच्छा विवरण होने के लिए यह है कि अब तक पुरानी हो सकती है मैं जावा के लिए इसी तरह की कुछ भी खोजने के लिए नहीं कर पाए हैं प्रकट होता है।।)

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

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

आप इंटरफ़ेस विरासत और कार्यान्वयन विरासत का उल्लेख करते हैं। कार्यान्वयन विरासत मुश्किल है क्योंकि आपको परिभाषित खोज आदेश होना चाहिए। इंटरफेस विरासत रास्ता आसान है। आपके पास बस सभी विधि हस्ताक्षर वाले मानचित्र हैं जिन्हें कार्यान्वित करने की आवश्यकता है। कोई खोज आदेश आवश्यक नहीं है (क्योंकि इसमें कोई कार्यान्वयन नहीं है)। वहां कोई आदेश नहीं है। – extraneon

उत्तर

25

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

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

+0

वर्चुअल कॉल और इंटरफेस कॉल पर उन हॉटस्पॉट विकी पेज जो मैं ढूंढ रहा हूं वह प्रतीत होता है। हालांकि इसे अभी भी पढ़ने के लिए चारों ओर घूमना है। – JanKanis

+1

विकी को https://wikis.oracle.com/display/HotSpotInternals/Home –

+0

पर ले जाया गया है ऑरैक विकी जमे हुए हैं, मुझे लगता है कि https://wiki.openjdk.java.net/display/HotSpot/Main है जहां अद्यतन करने योग्य जानकारी समाप्त हो गई। – JanKanis

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