Quelle est la différence entre javac et le compilateur Eclipse?

201

Le compilateur Java d'Eclipse est-il juste un wrapper autour du même noyau que le javacprogramme est enveloppé, ou s'agit-il d'un compilateur distinct? Si ces derniers, pourquoi réinventeraient-ils la roue?

Bart van Heukelom
la source

Réponses:

209

Eclipse a implémenté son propre compilateur appelé Eclipse Compiler for Java (ECJ).

Il est différent du javac, le compilateur fourni avec Sun JDK. Une différence notable est que le compilateur Eclipse vous permet d'exécuter du code qui n'a pas été correctement compilé. Si le bloc de code avec l'erreur n'est jamais exécuté, votre programme fonctionnera correctement. Sinon, il lèvera une exception indiquant que vous avez essayé d'exécuter du code qui ne se compile pas.

Une autre différence est que le compilateur Eclipse permet des constructions incrémentielles à partir de l'IDE Eclipse, c'est-à-dire que tout le code est compilé dès que vous avez fini de taper.

Le fait qu'Eclipse soit livré avec son propre compilateur est également apparent car vous pouvez écrire, compiler et exécuter du code Java dans Eclipse sans même installer le SDK Java.

Voici quelques exemples où la CJE est préférée à javac:

jjnguy
la source
3
@Bart, le compilateur Eclipse fonctionne assez bien pour les versions de version d'entreprise.
jjnguy
7
@jinguy Je ne suis pas d'accord pour que vous utilisiez le compilateur Eclipse pour les versions. Comme vous l'avez dit dans la réponse, il peut compiler du code avec des erreurs, vous ne voulez pas de trucs comme public void foo () {throw new Error ("Problème de compilation non résolu: \ n \ tFOOBAR ne peut pas être résolu \ n"); } pour apparaître dans mon code de production.
Matthew Farwell
10
@Matthew Farwell Il n'a pas dit que vous devriez, mais que vous le pouvez. Et si vous créez un build avec des erreurs, alors quelque chose ne va pas avec votre processus de build en premier lieu.
Stefan
4
Notez que l'incorporation d'ECJ dans votre application permet à votre programme de s'exécuter sous un JRE au lieu de nécessiter un JDK.
Thorbjørn Ravn Andersen
6
@MatthewFarwell pour fermer une boucle ici: pour les versions, il est simplement conseillé de ne pas spécifier l'argument du compilateur -proceedOnErroret il ne produira tout simplement pas de fichiers .class à partir de la source avec des erreurs.
Stephan Herrmann
36

Tout le monde a déjà expliqué qu'ils étaient différents. Voici quelques différences de comportements que j'ai remarquées entre les deux compilateurs. Ils se résument tous à un bug dans (au moins) l'une des implémentations.

Optimisation à la compilation liée

Inférence de type générique

polygénelubrifiants
la source
1
En fait, je connaissais cette différence après une longue nuit: Eclipse rapportait une erreur à propos de quelque chose qui me semblait légal (je ne me souviens pas de quoi), dans mon désespoir (je pouvais à peine rester éveillé), je fournis juste le code à javac et alors ça a bien marché! J'ai trouvé dans Google que je devais mettre à niveau le JDT afin d'obtenir le correctif pour ce problème.
Abel Morelos
5
J'ai trouvé un certain nombre de différences entre la gestion des génériques par les compilateurs dans les cas difficiles. Voici deux questions sur lesquelles j'ai posé des questions ici au cas où vous voudriez les ajouter à votre réponse: stackoverflow.com/questions/13501836/… stackoverflow.com/questions/13980552/…
Elias Vasylenko
5
Les classes anonymes ne sont jamais statiques selon le JLS mais elles peuvent être déclarées dans une portée statique. Lorsque vous utilisez la réflexion pour demander si une telle classe est statique, le code généré par ECJ dit non tandis que celui de javac dit oui . Article connexe ici .
Paul Bellora du
2
Toute différence sémantique dans le bytecode émis est un bogue dans l'une ou l'autre implémentation. Ce n'est pas très intéressant à mon avis. Je peux facilement produire une longue liste de ces "différences" en listant simplement les bogues ouverts de javac et ecj.
aioobe
Pour info, Netbeans ne souffre pas de telles "différences" car il utilise l'API interne de javac pour faire tout ce que fait EJC.
Aleksandr Dubinsky
18

Le compilateur intégré d'Eclipse est basé sur le compilateur Java Jikes d'IBM . (Notez qu'Eclipse a également commencé sa vie chez IBM). Il est complètement indépendant du compilateur Java de Sun dans le JDK; il n'est pas une enveloppe autour de Sun javac.

Jikes existe depuis longtemps, il était beaucoup plus rapide que le compilateur Java JDK standard (mais je ne sais pas si c'est toujours vrai). Quant à savoir pourquoi IBM voulait écrire son propre compilateur Java: peut-être pour des raisons de licence (ils ont également leur propre implémentation Java).

Jesper
la source
31
Ils n'ont pas vraiment écrit leur propre compilateur Java. Eclipse a une longue lignée depuis Visual Age pour Smalltalk, avant même que Java n'existe. Comme les deux langues sont en fait quelque peu similaires, elles ont simplement adapté leur technologie existante. Le compilateur de Sun est également totalement inadapté à une utilisation dans un IDE, en particulier dans un IDE incrémental de style Smalltalk comme Visual Age for Java d'origine, car il veut toujours compiler des fichiers entiers. Le compilateur d'IBM ne peut compiler de manière incrémentielle que les fragments qui ont été modifiés. Il peut même compiler des extraits qui ne sont même pas du Java légal, qui est utilisé dans le
Jörg W Mittag
2
Album Eclipse où vous pouvez simplement écrire des extraits de code, les mettre en surbrillance et les exécuter, sans avoir à les mettre dans une classe, une méthode principale ou même dans une méthode du tout .
Jörg W Mittag
1
@ JörgWMittag En fait, l'API interne de javac (telle qu'utilisée par Netbeans) peut être utilisée pour atteindre tous les mêmes objectifs.
Aleksandr Dubinsky
1
@AleksandrDubinsky: Dans quelle mesure cela a-t-il bien fonctionné en 1997, lorsque Visual Age for Java est sorti?
Jörg W Mittag
15

Il s'agit d'un compilateur distinct. Cela est nécessaire car javac ne permet pas la compilation de code légèrement cassé, à partir du site eclipse

Un compilateur Java incrémentiel. Implémenté en tant que générateur Eclipse, il est basé sur la technologie issue du compilateur VisualAge pour Java. En particulier, il permet d'exécuter et de déboguer du code qui contient toujours des erreurs non résolues.

BenM
la source
Pourquoi voudriez-vous la compilation de code "légèrement" cassé?
Steve Cohen
5
@SteveCohen: parce que vous voulez que le compilateur fournisse la mise en évidence de la syntaxe, la mise en évidence sémantique, la prise en charge de la refactorisation, la vérification de type, l'achèvement du code, les conseils et toutes les autres choses qu'un compilateur fait pendant que vous écrivez votre code et pendant que vous écrivez votre code, il est plus ou moins par définition incomplet (sinon, pourquoi l'écrivez-vous encore?) Un IDE qui ne fonctionne qu'à la toute fin du projet, alors que tout est déjà implémenté, serait bien inutile.
Jörg W Mittag