Qual é a diferença entre javac e o compilador Eclipse?

201

O compilador Java do Eclipse é apenas um invólucro em torno do mesmo núcleo em que o javacprograma está envolvido, ou é um compilador separado? Se este último, por que eles reinventariam a roda?

Bart van Heukelom
fonte

Respostas:

209

O Eclipse implementou seu próprio compilador chamado Eclipse Compiler for Java (ECJ).

É diferente do javac, o compilador enviado com o Sun JDK. Uma diferença notável é que o compilador Eclipse permite executar o código que não foi compilado corretamente. Se o bloco de código com o erro nunca for executado, seu programa funcionará bem. Caso contrário, ele lançará uma exceção indicando que você tentou executar o código que não é compilado.

Outra diferença é que o compilador Eclipse permite construções incrementais a partir do IDE Eclipse, ou seja, todo o código é compilado assim que você terminar de digitar.

O fato de o Eclipse vir com seu próprio compilador também é aparente porque você pode escrever, compilar e executar código Java no Eclipse sem precisar instalar o Java SDK.

Alguns exemplos em que o ECJ é preferível ao javac são:

jjnguy
fonte
3
@ Bart, o compilador Eclipse funciona bem o suficiente para compilações de versões corporativas.
jjnguy
7
@jinguy Não concordo que você deva usar o compilador Eclipse para lançamentos. Como você afirmou na resposta, ele pode compilar código com erros, você não deseja coisas como public void foo () {throw new Error ("Problema de compilação não resolvido: \ n \ tFOOBAR não pode ser resolvido \ n"); } para aparecer no meu código de produção.
Matthew Farwell
10
@ Matthew Farwell Ele não disse que você deveria, mas que você pode. E se você criar uma construção com erros, algo está errado com seu processo de construção em primeiro lugar.
11288 Stefan
4
Observe que a incorporação do ECJ no seu aplicativo permite que seu programa seja executado sob um JRE em vez de exigir um JDK.
Thorbjørn Ravn Andersen
6
@MatthewFarwell para fechar um loop aqui: para versões de lançamento, é aconselhável simplesmente não especificar o argumento do compilador -proceedOnErrore ele simplesmente não produzirá arquivos .class da fonte com erros.
23813 Stephan Herrmann
36

Todo mundo já explicou que são diferentes. Aqui estão algumas diferenças de comportamento que eu notei entre os dois compiladores. Todos se resumem a um bug em (pelo menos) uma das implementações.

Otimização em tempo de compilação relacionada

Inferências do tipo genérico relacionadas

poligenelubricants
fonte
1
Na verdade, eu sabia dessa diferença depois de uma longa noite: o Eclipse estava relatando um erro sobre algo que para mim parecia legal (não me lembro o quê), no meu desespero (mal conseguia ficar acordado), apenas alimentei o código para javac e então funcionou sem problemas! Descobri no Google que precisava atualizar o JDT para obter a correção para esse problema.
Abel Morelos
5
Eu encontrei várias diferenças entre o manuseio de genéricos pelos compiladores em casos difíceis. Aqui estão dois que eu fiz perguntas sobre aqui no caso de você deseja adicioná-los à sua resposta: stackoverflow.com/questions/13501836/... stackoverflow.com/questions/13980552/...
Elias Vasylenko
5
As classes anônimas nunca são estáticas de acordo com o JLS, mas podem ser declaradas no escopo estático. Ao usar a reflexão para perguntar se essa classe é estática, o código gerado pelo ECJ diz não, enquanto o javac diz que sim . Post relacionado aqui .
Paul Bellora
2
Qualquer diferença semântica no bytecode emitido é um bug em qualquer implementação. Isso não é muito interessante na minha opinião. Eu posso facilmente produzir uma longa lista dessas "diferenças" apenas listando os bugs abertos de javac e ecj.
Aioobe
Para sua informação, o Netbeans não sofre dessas "diferenças", pois usa a API interna do javac para fazer tudo o que o EJC faz.
Aleksandr Dubinsky
18

O compilador embutido do Eclipse é baseado no compilador jikes Jikes da IBM . (Observe que o Eclipse também iniciou sua vida na IBM). É completamente independente do compilador Java da Sun no JDK; não é um invólucro ao redor do sol javac.

O Jikes existe há muito tempo, costumava ser muito mais rápido que o compilador JDK Java padrão (mas não sei se isso ainda é verdade). Por que a IBM queria escrever seu próprio compilador Java: talvez por motivos de licenciamento (eles também têm sua própria implementação Java).

Jesper
fonte
31
Eles realmente não escreveram seu próprio compilador Java. O Eclipse tem uma longa linhagem de volta ao Visual Age for Smalltalk, antes mesmo que o Java existisse. Como as duas línguas são realmente um pouco semelhantes, elas simplesmente adaptaram sua tecnologia existente. O compilador da Sun também é completamente inadequado para uso em um IDE, especialmente em um IDE incremental no estilo Smalltalk, como o Visual Age original para Java, pois sempre deseja compilar arquivos inteiros. O compilador da IBM pode compilar incrementalmente apenas os fragmentos que foram alterados. Ele pode até mesmo compilar trechos que não são sequer Java legal, que é usado na
Jörg W Mittag
2
Eclipse recados onde você pode simplesmente escrever trechos de código, destacá-los e executá-los, sem ter que colocá-los em uma classe, um método principal, ou mesmo em um método em tudo .
Jörg W Mittag
1
@ JörgWMittag Na verdade, a API interna do javac (usada pelo Netbeans) pode ser usada para atingir todos os mesmos objetivos.
Aleksandr Dubinsky
1
@AleksandrDubinsky: Quão bem isso realmente funcionou em 1997, quando o Visual Age for Java foi lançado?
Jörg W Mittag
15

É um compilador separado completamente. Isso é necessário, pois o javac não permite a compilação de código um pouco quebrado, a partir do site eclipse

Um compilador Java incremental. Implementado como um construtor Eclipse, é baseado na tecnologia desenvolvida no compilador VisualAge for Java. Em particular, ele permite executar e depurar códigos que ainda contêm erros não resolvidos.

BenM
fonte
Por que você deseja a compilação de código "ligeiramente" quebrado?
Steve Cohen
5
@SteveCohen: como você deseja que o compilador forneça realce de sintaxe, realce semântico, suporte a refatoração, verificação de tipo, conclusão de código, dicas e todas as outras coisas que um compilador faz enquanto você escreve seu código e enquanto escreve. por definição, é mais ou menos incompleto (caso contrário, por que você ainda está escrevendo?) Um IDE que só funcione no final do projeto, quando tudo já foi implementado, seria bastante inútil.
Jörg W Mittag