2016-04-16 9 views
19

मैं मार्च 1 99 7 की कक्षाओं के पुराने सेट में आया था। यह उस समय था जब मैंने जावा सीखने की कोशिश की थी, और यह जेडीके 1.0.2जावा बाइनरी संगतता के साथ क्या हुआ?

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

Exception in thread "main" java.lang.ClassFormatError: Invalid start_pc 65535 in LocalVariableTable in class file bali/core/Application 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:455) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
    : 
    [snip many ClassLoader calls] 
    : 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495) 

अपमानजनक वर्ग उस वर्ग का सुपरक्लास है जिसे मैं कमांड लाइन से कॉल करता हूं।

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

वैसे भी, मेरा सवाल है; क्या जावा के प्रारंभिक संस्करणों में संगतता प्रतिबद्धता के बारे में ज्ञान रखने वाले किसी के पास कोई है? क्या यह एक बड़ा सौदा था, या इसे उद्देश्य पर त्याग दिया गया था? या बाद में कोई निर्णय था, जावा 1.4 या जावा 5 को बस जेडीके 1.0 समर्थन ड्रॉप करने के लिए कहें ??

+1

मैं कुछ टिप्पणी नहीं ऑनलाइन है कि पुराने javac कि पता चलता पाया टूटा हुआ था, गलत बाइट कोड उत्पन्न हुआ और बाद के संस्करण के वेरिफ़ियर ने उन गलतियों में से कुछ पकड़ा। ऐसा लगता है कि जावा 6 में एक विशेष बदलाव हुआ है, जहां इसे पकड़ा जाना शुरू हो सकता था। –

+6

खैर, कक्षा फ़ाइल मान्य नहीं है। जावा बाइनरी संगतता केवल वैध वर्ग फ़ाइलों के लिए है। सिर्फ इसलिए कि कुछ पहले जेवीएम कमजोर था, वह नहीं बदलता है। – Andreas

+0

यह हमेशा एक बड़ी दुविधा है कि क्या एक निश्चित बग को ठीक करना है यदि फिक्स आपके द्वारा पहले किए गए संगतता वादे को तोड़ देता है। लेकिन इस मामले में सवाल में बग शायद इतना गंभीर था कि इसे बग compatiblity तोड़ने के लिए सार्थक समझा गया था। – biziclop

उत्तर

3

जैसा कि आपने बताया था कि समस्या तब शुरू हुई जब संकलक माइक्रोसॉफ्ट कंपाइलर से सन कंपाइलर में स्विच हो गया। सूर्य ने कहा कि माइक्रोसॉफ्ट कंपाइलर द्वारा उत्पन्न कक्षा फाइलों ने जावा विनिर्देश का पालन नहीं किया और इस प्रकार मान्य नहीं थे।

यह त्रुटि पुराने JDK 1.0.2 या 1.1 compilers से उत्पन्न बाईटकोड के कारण होता है:

आप अधिक विवरण here पा सकते हैं। अतीत में, इनमें से बहुत से कंपाइलर बाइटकोड उत्पन्न करते हैं जो जावा वीएम विशिष्टता के अनुरूप नहीं है। चूंकि हालिया जे 2 एसई रिलीज में सत्यापनकर्ता खराब वर्ग प्रारूप के बारे में बहुत कठोर हैं, इसलिए क्लासफॉर्मेट एरर वीएम द्वारा फेंक दिया जाता है जब इन खराब वर्ग फ़ाइलों को लोड किया जाता है।

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

  • Java 8 (जावा 7 के साथ पूरी तरह से बाइनरी संगत)
  • Java 7
  • Java 6 (ज्यादातर द्विआधारी के साथ संगत (ज्यादातर जावा 6 के साथ द्विआधारी संगत) जावा 5, प्लस एक टिप्पणी है कि कुछ obfuscators spec के बाहर कक्षा फ़ाइलों को उत्पन्न करता है और इस प्रकार उन वर्ग फ़ाइलों को नहीं चलाया जा सकता है)
  • Java 5 (ज्यादातर जावा 1.4 के साथ बाइनरी संगत।2, प्लस ऑबफस्केटर के बारे में एक ही टिप्पणी)
  • Java 1.0 - 1.4.2 (ज्यादातर द्विआधारी पिछले संस्करणों के साथ संगत, कुछ टिप्पणी है कि आगे संगतता भी काम कर सकते हैं, लेकिन परीक्षण नहीं किया गया है)
+0

एक शानदार उत्तर के लिए धन्यवाद। –

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