क्या जावा 8 में जावा 7 संकलित कोड को अपग्रेड करने का कोई लाभ है?


127

मेरे पास जावा 7 का उपयोग करके लिखा गया एक पुराना एप्लिकेशन है। यह जावा 8 जेआरई में ठीक चलता है। मैं जावा 8 सुविधाओं का उपयोग करने के लिए किसी भी कोड को फिर से लिखने की योजना नहीं बनाता हूं। क्या नवीनतम जावा 8 JDK में संकलित कोड को अपग्रेड करने का कोई तकनीकी लाभ है?

स्पष्ट होने के लिए, कोड वर्तमान में जावा 7 के साथ संकलित है और पहले से ही नवीनतम जावा 8 जेआरई के साथ चल रहा है। यह पहले से ही जावा 8 रनटाइम सुधार से लाभान्वित होना चाहिए। यह सवाल है कि संस्करण 8 के संकलन और जावा 8 संकलित बाइट कोड के साथ चलने से कोई लाभ प्राप्त होगा या नहीं।


इसके अलावा, मैं डेवलपर उत्पादकता जैसे गैर-तकनीकी लाभों से चिंतित नहीं हूं। मुझे लगता है कि वे महत्वपूर्ण हैं लेकिन इस सवाल का मुद्दा नहीं है। मैं उत्पादन कोड के लिए कह रहा हूं जिसमें कोई विकास टीम नहीं है। यह पूरी तरह से रखरखाव मोड में है।


2
केवल स्पष्ट करने के लिए। कोड पहले से ही नवीनतम 1.8 JRE के साथ चलता है और इसलिए सभी नवीनतम जावा 8 बग फिक्स और रनटाइम प्रदर्शन सुधार (मेरी जानकारी के लिए) हैं।
g8torPaul

4
यह एक प्रश्न है कि शायद बायटेकोड द्वारा संकलक द्वारा आउटपुट किया जा रहा है। हो सकता है कि आपके प्रश्न में यह थोड़ा और स्पष्ट हो।
एम प्लैवोवेट

2
तो बेहतर डेवलपर उत्पादकता यहां प्रासंगिक नहीं है?
मिक मेनेमोनिक

7
"मैं किसी भी कोड को फिर से लिखने पर योजना नहीं बना सकता हूं" स्पष्ट नहीं है कि मैं विश्वास नहीं कर सकता।
Eldo

3
यह कुछ हद तक संबंधित हो सकता है: stackoverflow.com/questions/21732290/…
अरनौद

जवाबों:


82

यदि मैं प्रश्न को सही ढंग से समझता हूं, तो आप यह जानना चाहते हैं कि javacजावा 7 की तुलना में जावा 8 में निर्मित बायटेकोड "बेहतर" होगा या नहीं।

जवाब शायद नहीं है, वे लगातार संकलक में बग को ठीक करते हैं और कभी-कभी अधिक कुशल बायोटेक की ओर जाता है। लेकिन आप जावा 8 के लिए इन सुधारों से कोई महत्वपूर्ण गति नहीं देखेंगे जहां तक ​​मैं देख सकता हूं, चैंज केवल संस्करणों के साथ 2 बड़े बदलावों को सूचीबद्ध करता है।

ओरेकल वेबसाइट भयानक है और मुझे javacसंस्करणों के बीच से संबंधित बगफिक्स की एक सूची नहीं मिल सकती है , लेकिन यहां ओपनजेडीके से एक गैर निकास है । मैं जिन लोगों को खोजने का प्रबंधन कर सकता हूं उनमें से अधिकांश त्रुटियां ठीक कर रहे हैं। इसलिए जावा 8 को अपडेट करके, यह मौका है कि यह javacJLS के अधिक सही ढंग से अनुसरण करने के कारण किसी भी अधिक संकलन नहीं करेगा और बायोटेक के लिए "सुधार" करने के लिए बहुत कम होगा।


4
धन्यवाद, मैंने OpenJDK पर सूची में से कुछ की समीक्षा की है और वास्तव में वहां कुछ भी नहीं है सिवाय इसके कि ऐसा प्रतीत होता है कि उन्होंने jacac के प्रदर्शन में सुधार किया है। मैं मानता हूं कि Oracles वेबसाइट पर जावा के संस्करण के बीच फिक्स / सुविधाओं की एक उचित खोज करना असंभव है। प्रत्येक संस्करण के लिए रिलीज़ नोट्स का प्रारूप भी सुसंगत नहीं है। मेरा पेट मुझसे कहता है कि JDK 8 बनाम JDK 7. के साथ संकलन करने का कोई तकनीकी लाभ नहीं है
g8torPaul

1
@ g8torPaul जब तक आप केवल जावा 8 में उपलब्ध सुविधाओं का उपयोग करने जा रहे हैं, उदाहरण के लिए lamdbas / धाराएँ
पीटर लॉरी

21

मुख्य लाभ यह है कि जावा 8 में नवीनतम बग फिक्स हैं जहां जावा 7 को सार्वजनिक रूप से अपडेट नहीं किया जा रहा है।

यदि आप जावा 8 जेवीएम पर कोड चलाने जा रहे हैं, तो आपके पास जावा का केवल एक संस्करण स्थापित हो सकता है।

जावा 8 तेज हो सकता है, और इसमें जी 1 जैसी नई सुविधाओं के लिए बेहतर समर्थन है। हालांकि, यह आपके उपयोग के मामले के लिए धीमा हो सकता है इसलिए इसे जानने का एकमात्र तरीका परीक्षण करना है।

क्या नवीनतम जावा 8 JDK में संकलित कोड को अपग्रेड करने का कोई तकनीकी लाभ है?

यदि आप पूछ रहे हैं कि जावा 8 कंपाइलर में जावा 7 कोड को फिर से संकलित करने में कोई लाभ है या नहीं, तो उत्तर है; लगभग कुछ नहीं।

केवल सूक्ष्म अंतर यह है कि जावा एपीआई में मामूली अंतर रहे हैं, इसलिए बहुत सूक्ष्म अंतर हो सकते हैं जावा 8 कंपाइलर को लग सकता है कि जावा 7

अन्य मामूली अंतर फ़ाइल की शुरुआत में जादू की संख्या है, संभवतः निरंतर पूल का क्रम। बाइट कोड मूल रूप से समान है, यहां तक ​​कि invokedynamicलैंबडास के लिए जो समर्थन जोड़ा गया था वह जावा 7 में मौजूद था, लेकिन अभी इसका उपयोग नहीं किया गया था।


8
यदि मैं गलत हूं तो मुझे सुधारें, लेकिन ओपी जावा 8 के साथ कोड को फिर से स्थापित करने के बारे में पूछता है, जबकि आपका जवाब इस बारे में है कि क्या इसे क्रियान्वित करने के लिए जावा 8 का उपयोग करना है?
Tobias_k

5
मैं वर्तमान में नवीनतम जावा 1.8 JRE के तहत चल रहा हूं। बग फिक्स और आंतरिक जावा कोड के सभी JRE द्वारा प्रदान किया जाएगा। मुझे नहीं लगता कि यह मेरे सवाल का जवाब देता है।
g8torPaul

16
यह बस सवाल का जवाब नहीं है। यदि यह "लगभग कुछ भी नहीं" है तो कृपया स्पष्ट करें कि अंतर क्या है। अन्यथा यह सिर्फ अटकलें हैं
M Platvoet

1
@Peter लॉरी, आप कहते हैं कि ".. जवाब है, लगभग कुछ भी नहीं"। क्या हमारे पास इसका समर्थन करने के लिए कोई सबूत है? BTW, मैं आपसे सहमत होना चाहूंगा।
g8torPaul

2
@ g8torPaul Java 8 को Java 7 के साथ बैकवर्ड कम्पेटिबल बनाया गया है और यदि आप Java 8 के किसी भी फीचर का उपयोग नहीं कर रहे हैं, तो इसे लगभग उसी बाइट कोड का उत्पादन करना चाहिए।
पीटर लॉरी

21

यह जागरूकता पैदा करके मदद कर सकता है ।

जब आप Java8 में जाते हैं, तो आपको अतिरिक्त चेतावनी दी जा सकती है जो javac द्वारा उत्सर्जित होती है। उदाहरण: प्रकार निष्कर्ष बहुत Java8 साथ सुधार किया गया है। और यह आपके वर्तमान कोड बेस में @SuppressWarnings एनोटेशन की आवश्यकता को समाप्त कर सकता है (और जब इस तरह के एनोटेशन की आवश्यकता नहीं है, तो कंपाइलर उस बारे में चेतावनी देता है)।

इसलिए, जब आप अपने कोड आधार को संशोधित करने का इरादा नहीं रखते हैं, तब भी Java8 पर स्विच करना आपको ऐसी चीजों के बारे में बता सकता है। अपने ज्ञान को बढ़ाने से सूचित निर्णय लेने में मदद मिल सकती है।

दूसरी ओर:

  • मैंने यहाँ (दुर्लभ) स्थितियों के बारे में कुछ प्रश्न देखे जहाँ Java8 ने Java7 कोड संकलित करने से इनकार कर दिया। तो, Java8 पर स्विच करने से उस तरह की समस्या में चलने का जोखिम (न्यूनतम) भी हो जाता है।
  • और: यहां तक ​​कि जब आप आज अपने कोड आधार को छूने का इरादा नहीं रखते हैं , तो एक निश्चित मौका है कि आप बाद में अपना दिमाग बदल दें। और फिर, जब ध्यान नहीं दे रहे हैं, तो आप Java8 सुविधाओं का शोषण कर सकते हैं। जो "क्षेत्र अपडेट" को जटिल बना सकता है; जैसा कि अब आपके पास बनाए रखने के लिए आपके स्रोत कोड के दो संस्करण हैं!
  • फिर: यदि आपके पास java7 jre का उपयोग करके उत्पाद चलाने वाले ग्राहक हैं; आपको उन द्विआधारी सुधारों के बारे में वास्तव में सावधान रहना होगा जो आप उन्हें देते हैं। हमारे पास ऐसा सेटअप है; और मैंने एक से अधिक बार समय बर्बाद किया है क्योंकि मैंने गलती से एक जावा-चालित परीक्षण प्रणाली पर एक एकल जावा-संकलित वर्ग रखा था। यह बस तब नहीं हो सकता जब आपका देव और परीक्षण / ग्राहक सेटअप सभी Java7 हो।

लंबी कहानी छोटी: कुछ सूक्ष्म फायदे हैं, और कुछ जोखिम (जहां जोखिमों का महत्व मुख्य रूप से आपके समग्र सेटअप पर निर्भर करता है)।


2
इस तरह के एक दुर्लभ "Java8 ने जावा 7" समस्या को संकलित करने से इनकार कर दिया: stackoverflow.com/q/41590024/2513200 (ओरेकल कम्पाइलर का एक ज्ञात मुद्दा केवल जावा 8 को प्रभावित करता है, लेकिन 7 या 9 को प्रभावित नहीं करता है)
हल्क

8

मैं कम से कम इन तथ्यों के लिए करूंगा ।

1) हाशप इंटर्नल्स (यह jdk-8 के तहत तेज है)

2) बहुत सारे कीड़े तय किए गए जो आपके लिए पारदर्शी हो सकते हैं (रनटाइम ऑप्टिमाइजेशन) जो आपके कोड को वास्तव में कुछ भी किए बिना आपके कोड को तेज और बेहतर बना देगा।

3) जी 1 कचरा कलेक्टर

संपादित करें

तकनीकी दृष्टि से यह समय संकलन के आगे के साथ कुछ करने जैसा लगता है या ऐसा कुछ है जो कोड का अधिक विश्लेषण करके एक संकलक में सुधार कर सकता है। जहां तक ​​मुझे पता है कि इस तरह की चीजें जावा 8 कंपाइलर में नहीं की जाती हैं।

डेवलपर के दृष्टिकोण से - बहुत सारे हैं। उत्पादकता में वृद्धि मेरे लिए सबसे महत्वपूर्ण है।

EDIT 2

मुझे केवल दो बिंदु पता हैं जो आपकी दूसरी क्वेरी से मेल खाते हैं:

-parameters

विधि पैरामीटर नामों को संरक्षित करने के लिए।

-प्रोफ़ाइल

एक छोटे पदचिह्न के लिए कॉम्पैक्ट प्रोफाइल विकल्प कहा जाता है ।


26
अभी जावा 8 के तहत नहीं चल रहा है, हालांकि ये लाभ पहले से ही दे रहे हैं? असली सवाल यह प्रतीत होता है, "क्या मैं जावा 8 में कुछ लिख सकता हूं जो जावा 7 समकक्ष से बेहतर काम करता है"।
जोर्न वर्नी

8
मैं वर्तमान में नवीनतम जावा 1.8 JRE के तहत चल रहा हूं। बग फिक्स और आंतरिक जावा कोड के सभी JRE द्वारा प्रदान किया जाएगा। गारबेज कलेक्टर भी JRE का हिस्सा है। मुझे नहीं लगता कि यह मेरे सवाल का जवाब देता है।
g8torPaul

8
@JornVernee ओपी ने स्पष्ट रूप से कहा कि वह कुछ भी फिर से लिखना नहीं चाहता है, इसलिए प्रश्न, जैसा कि मैं समझता हूं, यह अधिक पसंद है "जावा 8 कंपाइलर कोई चाल कर सकता है जावा 7 कंपाइलर नहीं कर सकता"
Tobias_3

2
@JornVernee प्रश्न है, यदि कोड जावा 7 में लिखा गया है और जावा 8 में संकलित किया गया है तो बेहतर क्रियान्वित होता है तो जावा 7 में संकलित कोड
अर्लग्रे

6
प्रश्न का उत्तर नहीं देता है और केवल अनुमान लगाता है कि इसमें सुधार नहीं हुआ है।
M प्लैटवेट

-1

यदि आपके पास अपने आवेदन को फिर से जमा करने के लिए कोई अन्य कारण नहीं है, तो संभवतः इससे बहुत अंतर नहीं पड़ता है, जैसा कि स्वीकृत उत्तर में बताया गया है।

हालाँकि, यदि आपको इसे केवल एक बार भी पुनः प्राप्त करना है, तो इस पर विचार करें:

  • आपका आवेदन स्रोत कोड जावा 7 के साथ संगत है, और सबसे अधिक संभावना 8 भी है;
  • इस स्थिति में कि कोड जावा 8 के साथ संकलित नहीं होता है, यह संभवतः जावा 7 स्रोत संगतता मोड (जावा के साथ) में जावा 8 कंपाइलर के साथ संकलित नहीं करेगा -source 7;
  • आपके डेवलपर्स और CI को उत्पादन वातावरण के लिए यथासंभव करीब होने के लिए जावा 8 रनटाइम के खिलाफ यूनिट और एकीकरण परीक्षण चलाने की आवश्यकता होगी। डेवलपर्स को स्थानीय रूप से चलाते समय उसी जावा 8 रनटाइम पर एप्लिकेशन को चलाने की आवश्यकता होगी;
  • एक जेडडीके 7 के साथ संकलन करना और एक जेआरई 8 (एक ही निर्माण प्रक्रिया में, या एक ही आईडीई में) एक ही संस्करण के साथ सब कुछ करने के बजाय चलाना मुश्किल है;
  • यदि आप JDK 8 के साथ संकलन करते हैं और आपका लक्ष्य रनटाइम Java 8 है, तो -source 7इसके बजाय उपयोग करने का कोई लाभ नहीं है -source 8;
  • -source 8गारंटी का उपयोग करना कि संकलन और रनटाइम दोनों के लिए डेवलपर जावा 8 (या बाद में) का उपयोग कर रहा है (जैसा कि यह लागू होता है -target 8)।

यदि आपको आवश्यकता नहीं है, तो निष्कर्ष में, इसे फिर से न डालें। हालाँकि, पहले अवसर पर आपको recompile (कोड परिवर्तन के कारण) करना होगा, Java 8 पर स्विच करना होगा। पर्यावरण बेमेल होने के कारण बग होने का जोखिम न लें, और बिना अच्छे कारण के डेवलपर्स को प्रतिबंधित न करें।


दूसरा बुलेट पॉइंट सही नहीं है। आपकी पोस्ट कई बिंदुओं पर स्व-विरोधाभासी है।
Lorne

@ ईजेपी दूसरा बुलेट पॉइंट मेरे अनुभव का अधिक है, लेकिन क्या आपके पास एक उदाहरण है जो जेडीके 8 में -source 7संकलन करता है, लेकिन साथ संकलन नहीं करता है -source 8? इसके अलावा, क्या आप कृपया विरोधाभासों का संकेत दे सकते हैं क्योंकि आपकी टिप्पणी बहुत रचनात्मक नहीं है ...
डिडिएर एल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.