जेवैक और एक्लिप्स कंपाइलर में क्या अंतर है?


201

क्या एक्लिप्स का जावा कंपाइलर केवल उसी कोर के चारों ओर एक आवरण है जिसे javacप्रोग्राम के चारों ओर लपेटा जाता है, या यह पूरी तरह से एक अलग कंपाइलर है? यदि उत्तरार्द्ध, वे पहिया को क्यों मजबूत करेंगे?

जवाबों:


209

ग्रहण ने अपने स्वयं के संकलक को जावा (ECJ) के लिए ग्रहण संकलक के रूप में लागू किया है ।

यह javac से अलग है, संकलक जिसे Sun JDK के साथ शिप किया गया है। एक उल्लेखनीय अंतर यह है कि एक्लिप्स कंपाइलर आपको कोड चलाने देता है जो वास्तव में ठीक से संकलित नहीं हुआ था। यदि त्रुटि वाला कोड ब्लॉक नहीं किया गया है, तो आपका प्रोग्राम ठीक चलेगा। अन्यथा, यह एक अपवाद को दर्शाता है कि आपने कोड चलाने की कोशिश की है जो संकलन नहीं करता है।

एक और अंतर यह है कि ग्रहण संकलक ग्रहण आईडीई के भीतर से वृद्धिशील बनाता है, अर्थात, जैसे ही आप टाइप करते हैं, सभी कोड संकलित हो जाते हैं।

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

कुछ उदाहरण जहां ECJ को javac पर पसंद किया जाता है:

  • Apache Tomcat ने JSP को संकलित करने के लिए ECJ का उपयोग किया,
  • IntelliJ IDEA का ECJ के लिए समर्थन है, जैसा कि Java (GCJ) 4.3 के लिए GNU कंपाइलर के रूप में है ,
  • जीसीजे ईसीजे के साथ एकीकृत करता है,
  • लिफ्टर ECJ के साथ बनाता है।

3
@Bart, एंटरप्राइज़ रिलीज़ बिल्ड के लिए एक्लिप्स कंपाइलर पर्याप्त रूप से काम करता है।
jjnguy

7
@ झिंगुय मैं असहमत हूं कि आपको रिलीज के लिए एक्लिप्स कंपाइलर का इस्तेमाल करना चाहिए। जैसा कि आपने उत्तर में कहा था, यह त्रुटियों के साथ कोड संकलित कर सकता है, आप सार्वजनिक शून्य फ़ू () {थ्रो नई त्रुटि ("अनसुनी संकलित समस्या: \ n \ tFOOBAR को हल नहीं किया जा सकता है \ n") जैसे सामान नहीं चाहते हैं; } मेरे उत्पादन कोड में प्रदर्शित करने के लिए।
मैथ्यू फ़रवेल

10
@ मैथ्यू फ़रवेल उन्होंने कहा कि आपको चाहिए, लेकिन आप कर सकते हैं। और यदि आप कभी भी इसमें त्रुटियों के साथ एक बिल्ड बनाते हैं, तो पहली बार में आपकी निर्माण प्रक्रिया में कुछ गड़बड़ है।
स्टीफन

4
ध्यान दें कि आपके आवेदन में ECJ को एम्बेड करना आपके प्रोग्राम को JDK की आवश्यकता के बजाय एक JRE के तहत चलाने की अनुमति देता है।
थोरबजोरन राव एंडरसन

6
@MatthewFarwell यहाँ एक लूप बंद करने के लिए: रिलीज़ बिल्ड के लिए आपको सलाह दी जाती है कि आप केवल कंपाइलर तर्क को निर्दिष्ट करें -proceedOnErrorऔर यह त्रुटियों के साथ स्रोत से .class फ़ाइलों का उत्पादन नहीं करेगा।
स्टेपहान हेरमैन

36

सभी ने पहले ही समझाया कि वे अलग हैं। यहां उन व्यवहारों में कुछ अंतर है जो मैंने दो संकलक के बीच देखे हैं। वे सभी कार्यान्वयन में से एक (कम से कम) में एक बग को उबालते हैं।

संकलन-समय अनुकूलन संबंधित

जेनरिक टाइप इनफ़ॉर्मेंस से संबंधित है


1
वास्तव में मैं एक रात के बाद इस अंतर के बारे में जानता था: एक्लिप्स किसी चीज के बारे में एक त्रुटि की रिपोर्ट कर रहा था जो मुझे कानूनी लग रहा था (मुझे याद नहीं है), मेरे हताशा में (मैं मुश्किल से जाग सकता था) मैं सिर्फ कोड को जावा को खिलाता हूं और तब इसने आसानी से काम किया! मैंने Google में पाया कि मुझे उस मुद्दे को ठीक करने के लिए JDT को अपग्रेड करना पड़ा।
हाबिल मोरेलोस

5
मुझे मुश्किल मामलों में जेनरिक को संभालने वाले कंपाइलरों के बीच कई अंतर मिले हैं। यहां दो दो प्रश्न किए गए हैं
जिनके

5
बेनामी कक्षाएं जेएलएस के अनुसार कभी भी स्थिर नहीं होती हैं, लेकिन उन्हें स्थिर दायरे में घोषित किया जा सकता है। यह पूछने के लिए कि क्या इस तरह का एक वर्ग स्थिर है प्रतिबिंब का उपयोग करते हुए, ECJ का उत्पन्न कोड javac के हां कहते समय नहीं कहता है । संबंधित पोस्ट यहाँ
पॉल बेलोरा

2
उत्सर्जित बाइटेकोड में कोई भी शब्दार्थ अंतर या तो कार्यान्वयन में बग है। मेरी राय में यह बहुत दिलचस्प नहीं है। मैं आसानी से javac और ecj से खुली बग को सूचीबद्ध करके इस तरह के "अंतर" की एक लंबी सूची तैयार कर सकता हूं।
aioobe

FYI करें, Netbeans ऐसे किसी भी "मतभेद" से पीड़ित नहीं है क्योंकि यह JJac के आंतरिक API का उपयोग वह सब कुछ करने के लिए करता है जो EJC करता है।
1916

17

एक्लिप्स का बिल्ट-इन कंपाइलर IBM के Jikes java कंपाइलर पर आधारित है । (ध्यान दें कि आईबीएम में भी ग्रहण ने अपना जीवन शुरू किया)। यह जेडीके में सन के जावा कंपाइलर से पूरी तरह से स्वतंत्र है; यह सूर्य के चारों ओर एक आवरण नहीं है javac

लंबे समय से Jikes का अस्तित्व है, यह मानक JDK जावा संकलक की तुलना में बहुत तेज हुआ करता था (लेकिन मुझे नहीं पता कि यह अभी भी सच है)। क्यों आईबीएम अपने स्वयं के जावा कंपाइलर लिखना चाहता था: शायद लाइसेंसिंग कारणों के कारण (उनका अपना जावा कार्यान्वयन भी है)।


31
वे वास्तव में अपने स्वयं के जावा कंपाइलर नहीं लिखते थे। ग्रहण की स्मालटाक के लिए विजुअल एज में एक लंबा वंश है, इससे पहले कि जावा भी अस्तित्व में था। चूँकि दोनों भाषाएँ वास्तव में कुछ समान हैं, इसलिए उन्होंने अपनी मौजूदा तकनीक को आसानी से अपना लिया। सूर्य का संकलक एक IDE में उपयोग के लिए भी पूरी तरह से अनुपयुक्त है, विशेष रूप से जावा के लिए मूल दृश्य आयु की तरह एक वृद्धिशील लघु-शैली IDE में क्योंकि यह हमेशा संपूर्ण फ़ाइलों को संकलित करना चाहता है। आईबीएम के संकलक केवल उन टुकड़ों को संकलित कर सकते हैं जो बदल गए हैं। यह उन स्निपेट को भी संकलित कर सकता है, जो कानूनी जावा भी नहीं हैं, जिसका उपयोग किया जाता है
Jörg W Mittag

2
ग्रहण स्क्रैपबुक जहां आप बस कोड के स्निपेट्स लिख सकते हैं, उन्हें हाइलाइट कर सकते हैं और उन्हें चला सकते हैं, बिना उन्हें कक्षा में, एक मुख्य विधि, या यहां तक ​​कि एक विधि में डाल सकते हैं
जॉर्ज डब्ल्यू मित्तग

1
@ JörgWMittag वास्तव में, javac का आंतरिक API (जैसा कि नेटबीन्स द्वारा उपयोग किया जाता है) का उपयोग सभी समान लक्ष्यों को प्राप्त करने के लिए किया जा सकता है।
Aleksandr Dubinsky

1
@AleksandrDubinsky: वास्तव में 1997 में जावा के लिए विजुअल एज कब जारी हुआ, कितना अच्छा रहा?
जोर्ग डब्ल्यू मित्तग

15

यह पूरी तरह से एक अलग संकलक है। यह आवश्यक है क्योंकि जेवैक से थोड़ा टूटे हुए कोड के संकलन की अनुमति नहीं है ग्रहण साइट

एक वृद्धिशील जावा संकलक। एक्लिप्स बिल्डर के रूप में कार्यान्वित, यह जावा कंपाइलर के लिए विजुअलएज से विकसित तकनीक पर आधारित है। विशेष रूप से, यह कोड को चलाने और डिबग करने की अनुमति देता है जिसमें अभी भी अनसुलझे त्रुटियां हैं।


आप "थोड़ा" टूटे हुए कोड का संकलन क्यों चाहेंगे?
स्टीव कोहेन

5
@SteveCohen: क्योंकि आप चाहते हैं कि संकलक हाइलाइटिंग, सिमेंटिक हाइलाइटिंग, रीफैक्टरिंग सपोर्ट, टाइप चेकिंग, कोड पूरा करने, संकेत देने के लिए कंपाइलर और अन्य सभी चीजें जो कंपाइलर आपके कोड लिखते समय करता है, और जब आप अपना कोड लिख रहे हों, यह अधूरा है या कम से कम परिभाषा के अनुसार (अन्यथा, आप अभी भी इसे क्यों लिख रहे हैं?) एक आईडीई जो केवल परियोजना के बहुत अंत में काम करता है, जब सब कुछ पहले ही लागू हो चुका होता है, तो यह काफी बेकार होगा।
जोर्ग डब्ल्यू मित्तग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.