Was ist der Unterschied zwischen javac und dem Eclipse-Compiler?

201

Ist der Java-Compiler von Eclipse nur ein Wrapper um denselben Kern, um den das javacProgramm gewickelt ist, oder handelt es sich insgesamt um einen separaten Compiler? Wenn letztere, warum sollten sie das Rad neu erfinden?

Bart van Heukelom
quelle

Antworten:

209

Eclipse hat einen eigenen Compiler namens Eclipse Compiler for Java (ECJ) implementiert .

Es unterscheidet sich vom javac, dem Compiler, der mit Sun JDK geliefert wird. Ein bemerkenswerter Unterschied besteht darin, dass Sie mit dem Eclipse-Compiler Code ausführen können, der nicht ordnungsgemäß kompiliert wurde. Wenn der Codeblock mit dem Fehler nie ausgeführt wird, läuft Ihr Programm einwandfrei. Andernfalls wird eine Ausnahme ausgelöst, die angibt, dass Sie versucht haben, nicht kompilierten Code auszuführen.

Ein weiterer Unterschied besteht darin, dass der Eclipse-Compiler inkrementelle Builds innerhalb der Eclipse-IDE zulässt, dh der gesamte Code wird kompiliert, sobald Sie mit der Eingabe fertig sind.

Die Tatsache, dass Eclipse mit einem eigenen Compiler geliefert wird, ist auch offensichtlich, da Sie Java-Code in Eclipse schreiben, kompilieren und ausführen können, ohne das Java SDK zu installieren.

Einige Beispiele, bei denen der EuGH javac vorgezogen wird, sind:

jjnguy
quelle
3
@Bart, der Eclipse-Compiler funktioniert gut genug für Builds von Unternehmensversionen.
jjnguy
7
@jinguy Ich bin nicht der Meinung, dass Sie den Eclipse-Compiler für Releases verwenden sollten. Wie Sie in der Antwort angegeben haben, kann es Code mit Fehlern kompilieren. Sie möchten keine Dinge wie public void foo () {neuen Fehler auslösen ("Ungelöstes Kompilierungsproblem: \ n \ tFOOBAR kann nicht gelöst werden \ n"); }, um in meinem Produktionscode zu erscheinen.
Matthew Farwell
10
@ Matthew Farwell Er hat nicht gesagt, dass Sie sollten, aber dass Sie können. Und wenn Sie jemals einen Build mit Fehlern erstellen, stimmt überhaupt nichts mit Ihrem Build-Prozess.
Stefan
4
Beachten Sie, dass durch das Einbetten von ECJ in Ihre Anwendung Ihr Programm unter einer JRE ausgeführt werden kann, anstatt ein JDK zu benötigen.
Thorbjørn Ravn Andersen
6
@MatthewFarwell, um hier eine Schleife zu schließen: Für Release-Builds wird empfohlen , das Compiler-Argument einfach nicht anzugeben, -proceedOnErrorund es werden einfach keine .class-Dateien aus dem Quellcode mit Fehlern erstellt.
Stephan Herrmann
36

Jeder hat bereits erklärt, dass sie anders sind. Hier sind einige Unterschiede im Verhalten, die ich zwischen den beiden Compilern festgestellt habe. Sie alle laufen auf einen Fehler in (mindestens) einer der Implementierungen hinaus.

Optimierung zur Kompilierungszeit

Generika Typ Inferenz bezogen

Polygenschmierstoffe
quelle
1
Eigentlich wusste ich nach einer langen Nacht von diesem Unterschied: Eclipse meldete einen Fehler über etwas, das mir legal erschien (ich erinnere mich nicht an was), in meiner Verzweiflung (ich konnte kaum wach bleiben) füttere ich den Code einfach an javac und dann hat es reibungslos funktioniert! Ich habe in Google festgestellt, dass ich das JDT aktualisieren musste, um das Problem zu beheben.
Abel Morelos
5
Ich habe eine Reihe von Unterschieden zwischen dem Umgang von Compilern mit Generika in schwierigen Fällen festgestellt. Hier sind zwei, über die ich hier Fragen gestellt habe, falls Sie sie Ihrer Antwort hinzufügen möchten
Elias Vasylenko
5
Anonyme Klassen sind laut JLS niemals statisch, können jedoch im statischen Bereich deklariert werden. Wenn Sie mithilfe der Reflexion fragen, ob eine solche Klasse statisch ist, sagt der vom EuGH generierte Code Nein, während der von Javac Ja sagt . In Verbindung stehender Beitrag hier .
Paul Bellora
2
Jeder semantische Unterschied im ausgegebenen Bytecode ist ein Fehler in beiden Implementierungen. Das ist meiner Meinung nach nicht sehr interessant. Ich kann leicht eine lange Liste solcher "Unterschiede" erstellen, indem ich nur die offenen Fehler von javac und ecj aufführe.
Aioobe
Zu Ihrer Information, Netbeans leidet nicht unter solchen "Unterschieden", da es die interne API von javac verwendet, um alles zu tun, was EJC tut.
Aleksandr Dubinsky
17

Der in Eclipse integrierte Compiler basiert auf dem Java-Compiler Jikes von IBM . (Beachten Sie, dass Eclipse auch bei IBM angefangen hat). Es ist völlig unabhängig vom Java-Compiler von Sun im JDK. Es ist keine Hülle um Sunsjavac .

Jikes gibt es schon lange, es war früher viel schneller als der Standard-JDK-Java-Compiler (aber ich weiß nicht, ob das noch stimmt). Warum IBM einen eigenen Java-Compiler schreiben wollte: möglicherweise aus Lizenzgründen (sie haben auch eine eigene Java-Implementierung).

Jesper
quelle
31
Sie haben nicht wirklich ihren eigenen Java-Compiler geschrieben. Eclipse hat eine lange Tradition in Visual Age for Smalltalk, bevor es Java überhaupt gab. Da die beiden Sprachen tatsächlich etwas ähnlich sind, haben sie einfach ihre vorhandene Technologie angepasst. Der Compiler von Sun ist auch für die Verwendung in einer IDE völlig ungeeignet, insbesondere in einer inkrementellen IDE im Smalltalk-Stil wie dem ursprünglichen Visual Age für Java, da immer ganze Dateien kompiliert werden sollen. Der IBM Compiler kann nur die geänderten Fragmente schrittweise kompilieren. Es kann sogar Snippets kompilieren, die nicht einmal legales Java sind, das im
Jörg W Mittag
2
Eclipse - Sammelalbum , wo man einfach Code - Schnipsel schreiben, markieren Sie sie und führen sie, ohne sie in eine Klasse setzen zu müssen, ein Hauptverfahren, oder sogar in ein Verfahren überhaupt .
Jörg W Mittag
1
@ JörgWMittag Tatsächlich kann die interne API von javac (wie sie von Netbeans verwendet wird) verwendet werden, um dieselben Ziele zu erreichen.
Aleksandr Dubinsky
1
@AleksandrDubinsky: Wie gut hat das 1997 funktioniert, als Visual Age für Java veröffentlicht wurde?
Jörg W Mittag
15

Es ist insgesamt ein separater Compiler. Dies ist erforderlich, da Javac das Kompilieren von leicht fehlerhaftem Code von der Eclipse-Site nicht zulässt

Ein inkrementeller Java-Compiler. Es wurde als Eclipse-Builder implementiert und basiert auf der Technologie, die aus dem VisualAge for Java-Compiler entwickelt wurde. Insbesondere ermöglicht es das Ausführen und Debuggen von Code, der noch ungelöste Fehler enthält.

BenM
quelle
Warum sollten Sie die Kompilierung von "leicht" kaputtem Code wünschen?
Steve Cohen
5
@SteveCohen: Da der Compiler Syntaxhervorhebung, semantische Hervorhebung, Refactoring-Unterstützung, Typprüfung, Codevervollständigung, Hinweise und all die anderen Dinge bereitstellen soll, die ein Compiler tut, während Sie Ihren Code schreiben und während Sie Ihren Code schreiben, Es ist per Definition mehr oder weniger unvollständig (andernfalls, warum schreiben Sie es noch?). Eine IDE, die erst am Ende des Projekts funktioniert, wenn bereits alles implementiert wurde, wäre ziemlich nutzlos.
Jörg W Mittag