Qual è la differenza tra javac e il compilatore Eclipse?


201

Il compilatore Java di Eclipse è solo un wrapper attorno allo stesso core su cui javacè avvolto il programma o è un compilatore separato del tutto? In quest'ultimo caso, perché dovrebbero reinventare la ruota?

Risposte:


209

Eclipse ha implementato il proprio compilatore chiamato Eclipse Compiler per Java (ECJ).

È diverso da javac, il compilatore fornito con Sun JDK. Una notevole differenza è che il compilatore Eclipse consente di eseguire codice che non è stato compilato correttamente. Se il blocco di codice con l'errore non viene mai eseguito, il programma funzionerà correttamente. Altrimenti, genererà un'eccezione che indica che hai provato a eseguire codice che non viene compilato.

Un'altra differenza è che il compilatore Eclipse consente build incrementali dall'IDE Eclipse, ovvero tutto il codice viene compilato non appena si finisce di digitare.

Il fatto che Eclipse venga fornito con il proprio compilatore è evidente anche perché è possibile scrivere, compilare ed eseguire il codice Java in Eclipse senza nemmeno installare Java SDK.

Alcuni esempi in cui ECJ è preferito rispetto a javac sono:


3
@Bart, il compilatore Eclipse funziona abbastanza bene per build di release aziendali.
jjnguy,

7
@jinguy Non sono d'accordo sul fatto che dovresti usare il compilatore Eclipse per le versioni. Come hai affermato nella risposta, può compilare il codice con errori, non vuoi cose come public void foo () {throw new Error ("Problema di compilazione irrisolto: \ n \ tFOOBAR non può essere risolto \ n"); } per apparire nel mio codice di produzione.
Matthew Farwell,

10
@Matthew Farwell Non ha detto che dovresti, ma che puoi. E se mai crei una build con errori, allora qualcosa non va nel tuo processo di build in primo luogo.
Stefan,

4
Si noti che l'incorporazione di ECJ nella propria applicazione consente al programma di essere eseguito con un JRE anziché richiedere un JDK.
Thorbjørn Ravn Andersen il

6
@MatthewFarwell per chiudere un ciclo qui: per le build di rilascio si consiglia semplicemente di non specificare l'argomento del compilatore -proceedOnErrore semplicemente non produrrà file .class dall'origine con errori.
Stephan Herrmann,

36

Tutti hanno già spiegato che sono diversi. Ecco alcune differenze nei comportamenti che ho notato tra i due compilatori. Si riducono tutti a un bug in (almeno) una delle implementazioni.

Ottimizzazione in fase di compilazione relativa

Generica correlata all'inferenza


1
In realtà ho saputo di questa differenza dopo una lunga notte: Eclipse stava segnalando un errore su qualcosa che a me sembrava legale (non ricordo cosa), nella mia disperazione (riuscivo a malapena a rimanere sveglio) Ho solo dato il codice a javac e poi ha funzionato senza problemi! Ho scoperto in Google che dovevo aggiornare JDT per ottenere la correzione per quel problema.
Abel Morelos,

5
Ho trovato una serie di differenze tra la gestione dei generici dei compilatori in casi difficili. Qui ci sono due che ho fatto domande su qui nel caso in cui si desidera aggiungere al vostro risposta: stackoverflow.com/questions/13501836/... stackoverflow.com/questions/13980552/...
Elias Vasylenko

5
Le classi anonime non sono mai statiche secondo JLS ma possono essere dichiarate nell'ambito statico. Quando si usa la reflection per chiedere se tale classe è statica, il codice generato da ECJ dice no mentre javac dice sì . Post correlato qui .
Paul Bellora,

2
Qualsiasi differenza semantica nel bytecode emesso è un bug in entrambe le implementazioni. Questo non è molto interessante secondo me. Posso facilmente produrre un lungo elenco di tali "differenze" semplicemente elencando i bug aperti di javac ed ecj.
aioobe,

Cordiali saluti, Netbeans non soffre di tali "differenze" poiché utilizza l'API interna di javac per fare tutto ciò che fa EJC.
Aleksandr Dubinsky,

18

Il compilatore integrato di Eclipse si basa sul compilatore Java Java di IBM . (Notare che anche Eclipse ha iniziato la sua vita in IBM). È completamente indipendente dal compilatore Java di Sun nel JDK; non è un wrapper Sun javac.

Jikes esiste da molto tempo, era molto più veloce del compilatore standard JDK Java (ma non so se sia ancora vero). Per quanto riguarda il motivo per cui IBM ha voluto scrivere il proprio compilatore Java: forse per motivi di licenza (hanno anche la propria implementazione Java).


31
Non hanno davvero scritto il proprio compilatore Java. Eclipse ha una lunga stirpe di ritorno a Visual Age per Smalltalk, prima ancora che esistesse Java. Dato che le due lingue sono in qualche modo simili, hanno semplicemente adattato la loro tecnologia esistente. Il compilatore di Sun è inoltre del tutto inadatto all'uso in un IDE, specialmente in un IDE incrementale in stile Smalltalk come Visual Age originale per Java poiché desidera sempre compilare interi file. Il compilatore IBM può compilare in modo incrementale solo i frammenti che sono stati modificati. Può anche compilare frammenti che non sono nemmeno legali di Java, che viene utilizzato in
Jörg W Mittag il

2
Eclipse scrapbook dove si può semplicemente scrivere frammenti di codice, evidenziarla e eseguirli, senza la necessità di metterli in una classe, un metodo main, o anche in un metodo affatto .
Jörg W Mittag,

1
@ JörgWMittag In realtà, l'API interna di javac (utilizzata da Netbeans) può essere utilizzata per raggiungere tutti gli stessi obiettivi.
Aleksandr Dubinsky,

1
@AleksandrDubinsky: quanto ha funzionato nel 1997, quando è stato rilasciato Visual Age per Java?
Jörg W Mittag,

15

È un compilatore separato del tutto. Ciò è necessario in quanto javac non consente la compilazione di codice leggermente non funzionante, dal sito eclipse

Un compilatore Java incrementale. Implementato come builder Eclipse, si basa sulla tecnologia sviluppata dal compilatore VisualAge per Java. In particolare, consente di eseguire ed eseguire il debug del codice che contiene ancora errori irrisolti.


Perché vorresti compilare un codice "leggermente" rotto?
Steve Cohen,

5
@SteveCohen: poiché desideri che il compilatore fornisca l'evidenziazione della sintassi, l'evidenziazione semantica, il supporto del refactoring, il controllo del tipo, il completamento del codice, i suggerimenti e tutte le altre cose che un compilatore fa mentre scrivi il tuo codice e mentre scrivi il codice, è più o meno per definizione incompleto (altrimenti, perché lo stai ancora scrivendo?) Un IDE che funziona solo alla fine del progetto, quando tutto è già stato implementato, sarebbe abbastanza inutile.
Jörg W Mittag,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.