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?

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:


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


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).


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.