हमारी परियोजना कुछ जावा बाइटकोड वाद्ययंत्र करता है। और हम कुछ अजीब व्यवहार पर ठोकर खाई।ओरेकल और ग्रहण के कंपाइलर्स द्वारा उत्पादित जावा बाइटकोड में अंतर
public void a() {
new Integer(2);
}
Oracle की javac निम्नलिखित बाईटकोड में ऊपर संकलित:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
और में ग्रहण का संकलक: निम्नलिखित कोड का टुकड़ा मान लीजिए
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
आप देख सकते हैं, ओरेकल संकलक का उत्पादन "नया" के बाद "डुप्लिक", जबकि ग्रहण नहीं करता है। जो इस उपयोग के मामले में पूरी तरह से सही है, क्योंकि नए बनाए गए इंटीजर इंस्टेंस का उपयोग बिल्कुल नहीं किया जाता है, इसलिए "डुप्लिकेट" की आवश्यकता नहीं होती है।
मेरे प्रश्न हैं:
- वहाँ विभिन्न compilers के बीच मतभेद के कुछ सिंहावलोकन है? एक लेख/ब्लॉग पोस्ट?
- क्या मैं सुरक्षित रूप से निष्कर्ष निकाल सकता हूं कि यदि "नया" और "invokespecial" के बीच कोई "डुप्लिक" नहीं है तो ऑब्जेक्ट प्रारंभ करने के बाद उपयोग नहीं किया जाता है?
बाइटकोड के उपकरण के साथ आपका लक्ष्य क्या है? क्या यह अंतर आपके लिए एक समस्या का कारण बनता है? ध्यान दें कि बाइटकोड वास्तव में जावा कंपाइलर का उत्पादन करने के बारे में कोई गारंटी नहीं है।यह पूरी तरह से संभव है कि भविष्य के संस्करण में ओरेकल के 'जावैक' अब आप जो देखते हैं उससे अलग कुछ उत्पादन करेंगे - इसलिए एक ऐसा प्रोग्राम लिखना अच्छा नहीं है जो संकलक द्वारा उत्पादित सटीक बाइटकोड पर निर्भर करता है। – Jesper
क्या आप ग्रहण के लिए विभिन्न जेडीके का उपयोग करते हैं? – Nishant