Javac ve Eclipse derleyicisi arasındaki fark nedir?


203

Eclipse'nin Java derleyicisi, javacprogramın sarıldığı aynı çekirdek etrafındaki bir sarıcı mı yoksa tamamen ayrı bir derleyici mi? İkincisi, tekerleği neden yeniden icat edesinler?

Yanıtlar:


211

Eclipse, Java için Eclipse Compiler (ECJ) adlı kendi derleyicisini uygulamıştır .

Sun JDK ile birlikte gelen derleyici olan javac'tan farklıdır. Göze çarpan bir fark, Eclipse derleyicisinin gerçekten düzgün derlenmemiş kodu çalıştırmanıza izin vermesidir. Hatalı kod bloğu hiç çalıştırılmazsa, programınız iyi çalışır. Aksi takdirde, derlenmeyen kodu çalıştırmayı denediğinizi belirten bir istisna atar.

Başka bir fark, Eclipse derleyicisinin Eclipse IDE içinden artımlı yapılara izin vermesidir, yani yazmayı bitirir bitirmez tüm kodlar derlenir.

Eclipse'nin kendi derleyicisi ile birlikte gelmesi de açıktır, çünkü Java SDK'sını yüklemeden bile Eclipse'de Java kodu yazabilir, derleyebilir ve çalıştırabilirsiniz.

ECJ'nin javac yerine tercih edildiği birkaç örnek:


3
@Bart, Eclipse derleyicisi, kurumsal sürüm derlemeleri için yeterince iyi çalışır.
jjnguy

7
@jinguy Yayınlar için Eclipse derleyicisini kullanmanız gerektiğini kabul etmiyorum. Yanıtta belirttiğiniz gibi, kodu hatalarla derleyebilir, public void foo () {new Error ("Çözülmemiş derleme sorunu: \ n \ tFOOBAR çözülemez \ n") gibi şeyler istemezsiniz; } üretim kodumda görünecek.
Matthew Farwell

10
@Matthew Farwell Yapman gerektiğini söylemedi, ama yapabilirsin. Ve içinde hatalar olan bir yapı oluşturursanız, ilk önce oluşturma işleminizle ilgili bir sorun vardır.
Stefan

4
ECJ'yi uygulamanıza gömmek, programınızın JDK yerine JRE altında çalışmasına izin verdiğini unutmayın.
Thorbjørn Ravn Andersen

6
@MatthewFarwell burada bir döngü kapatmak için: sürüm sadece tavsiye ediyoruz kurar için değil derleyici argüman belirtmek -proceedOnErrorve basitçe hatalarla kaynağından .class dosyaları üretmez.
Stephan Herrmann

36

Herkes zaten farklı olduğunu açıkladı. İki derleyici arasında fark ettiğim davranışlar arasında bazı farklar var. Hepsi uygulamalardan birinde (en azından) bir böceğe kaynar.

Derleme zamanı optimizasyonu ile ilgili

Jenerik tip çıkarımına bağlı


1
Aslında bu farkı uzun bir geceden sonra biliyordum: Eclipse bana yasal görünen bir şey hakkında bir hata bildiriyordu (ne olduğunu hatırlamıyorum), çaresizliğimde (zar zor uyanık kalabilirim) sadece javac kodunu besliyorum ve sonra sorunsuz çalıştı! Google'da, bu sorunun düzeltmesini almak için JDT'yi yükseltmem gerektiğini buldum.
Abel Morelos

5
Zor durumlarda jeneriklerin derleyici kullanımı arasında bir takım farklılıklar buldum. Bunları cevabınıza eklemek istemeniz durumunda burada hakkında iki soru sordum: stackoverflow.com/questions/13501836/… stackoverflow.com/questions/13980552/…
Elias Vasylenko 18:13

5
Anonim sınıflar JLS'ye göre asla statik değildir, ancak statik kapsamda bildirilebilir. Böyle bir sınıfın statik olup olmadığını sormak için yansıma kullanırken, ECJ'nin üretilen kodu javac'ın evet olduğunu söylerken hayır diyor . İlgili yazı burada .
Paul Bellora

2
Yayılan bayt kodundaki herhangi bir anlamsal fark, her iki uygulamada da bir hatadır. Bence bu çok ilginç değil. Ben sadece javac ve ecj açık hataları listeleyerek böyle "farklılıklar" uzun bir liste üretebilir.
aioobe

FYI, Netbeans, EJC'nin yaptığı her şeyi yapmak için javac'ın dahili API'sini kullandığından böyle bir "farklılıklardan" muzdarip değildir.
Aleksandr Dubinsky

18

Eclipse'in yerleşik derleyicisi, IBM'in Jikes java derleyicisini temel alır . (Eclipse'in IBM'de de yaşamına başladığını unutmayın). JDK'daki Sun'ın Java derleyicisinden tamamen bağımsızdır; Sun'ın etrafında bir sarıcı değil javac.

Jikes uzun zamandır var, standart JDK Java derleyicisinden çok daha hızlıydı (ama bunun hala doğru olup olmadığını bilmiyorum). IBM'in neden kendi Java derleyicisini yazmak istediğine gelince: belki de lisanslama nedenlerinden dolayı (ayrıca kendi Java uygulamalarına sahiptirler).


31
Onlar vermedi gerçekten kendi Java derleyicisi yazın. Eclipse, Java bile var olmadan önce Smalltalk için Visual Age'e kadar uzun bir kökene sahiptir. İki dil aslında biraz benzer olduğundan, mevcut teknolojilerini uyarlamışlardır. Sun'ın derleyicisi, IDE'de, özellikle de her zaman tüm dosyaları derlemek istediğinden, Java için orijinal Visual Age gibi artımlı Smalltalk tarzı IDE'de kullanım için tamamen uygun değildir . IBM'in derleyicisi yalnızca değişen parçaları aşamalı olarak derleyebilir. Yasal Java bile olmayan parçacıkları bile derleyebilir, ki bu da
Jörg W Mittag

2
Eclipse sadece kod parçacıkları yazmak onları vurgulamak ve bir sınıf, bir ana yöntemle, hatta bir yöntem haline içine koymak zorunda kalmadan, onları çalıştırmak nerede Albüme hiç .
Jörg W Mittag

1
@ JörgWMittag Aslında, javac'ın dahili API'si (Netbeans tarafından kullanıldığı gibi) aynı hedeflerin tümüne ulaşmak için kullanılabilir.
Aleksandr Dubinsky

1
@AleksandrDubinsky: Bu, Java için Visual Age yayınlandığında 1997'de ne kadar iyi çalıştı?
Jörg W Mittag

15

Tamamen ayrı bir derleyicidir. Javac , tutulma sitesinden biraz kırık kodların derlenmesine izin vermediğinden bu gereklidir.

Artımlı bir Java derleyicisi. Eclipse oluşturucu olarak uygulanan Java, VisualAge for Java derleyicisinden geliştirilen teknolojiye dayanır. Özellikle, hala çözülmemiş hatalar içeren kodu çalıştırmaya ve hata ayıklamaya izin verir.


Neden "hafif" kırık kod derlenmesi istesin ki?
Steve Cohen

5
@SteveCohen: Derleyicinin sözdizimi vurgulama, anlamsal vurgulama, yeniden düzenleme desteği, tür denetimi, kod tamamlama, ipuçları ve kodunuzu yazarken ve kodunuzu yazarken yaptığı diğer tüm şeyleri sağlamasını istediğiniz için, tanım gereği eksiktir (aksi halde, neden hala yazıyorsunuz?) Sadece projenin en sonunda, her şey zaten uygulandığında çalışan bir IDE oldukça işe yaramazdı.
Jörg W Mittag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.