¿Cuál es la diferencia entre javac y el compilador de Eclipse?

201

¿El compilador de Java de Eclipse es solo un contenedor alrededor del mismo núcleo que el javacprograma, o es un compilador completamente diferente? Si esto último, ¿por qué iban a reinventar la rueda?

Bart van Heukelom
fuente

Respuestas:

209

Eclipse ha implementado su propio compilador llamado Eclipse Compiler for Java (ECJ).

Es diferente del javac, el compilador que se envía con Sun JDK. Una diferencia notable es que el compilador Eclipse le permite ejecutar código que en realidad no se compiló correctamente. Si el bloque de código con el error nunca se ejecuta, su programa funcionará bien. De lo contrario, arrojará una excepción que indica que intentó ejecutar código que no se compila.

Otra diferencia es que el compilador de Eclipse permite compilaciones incrementales desde el IDE de Eclipse, es decir, todo el código se compila tan pronto como termine de escribir.

El hecho de que Eclipse viene con su propio compilador también es evidente porque puede escribir, compilar y ejecutar código Java en Eclipse sin siquiera instalar el SDK de Java.

Algunos ejemplos en los que se prefiere ECJ sobre javac son:

jjnguy
fuente
3
@Bart, el compilador de Eclipse funciona lo suficientemente bien para las compilaciones de lanzamiento empresarial.
jjnguy
77
@jinguy No estoy de acuerdo con que debas usar el compilador Eclipse para los lanzamientos. Como indicó en la respuesta, puede compilar código con errores, no desea cosas como public void foo () {arrojar un nuevo error ("Problema de compilación no resuelto: \ n \ tFOOBAR no se puede resolver \ n"); } para aparecer en mi código de producción.
Matthew Farwell
10
@Matthew Farwell No dijo que debías, pero que puedes. Y si alguna vez crea una compilación con errores, entonces algo está mal con su proceso de compilación en primer lugar.
Stefan
44
Tenga en cuenta que incrustar ECJ en su aplicación permite que su programa se ejecute bajo un JRE en lugar de requerir un JDK.
Thorbjørn Ravn Andersen
66
@MatthewFarwell para cerrar un ciclo aquí: para las versiones de lanzamiento, se recomienda simplemente no especificar el argumento del compilador -proceedOnErrory simplemente no producirá archivos .class desde la fuente con errores.
Stephan Herrmann
36

Todos ya han explicado que son diferentes. Aquí hay algunas diferencias en los comportamientos que he notado entre los dos compiladores. Todos se reducen a un error en (al menos) una de las implementaciones.

Optimización en tiempo de compilación relacionada

Genéricos relacionados con la inferencia de tipos

poligenelubricantes
fuente
1
En realidad, supe de esta diferencia después de una larga noche: Eclipse estaba informando un error sobre algo que me pareció legal (no recuerdo qué), en mi desesperación (apenas podía permanecer despierto) solo le di el código a javac y entonces funcionó sin problemas! Encontré en Google que tenía que actualizar el JDT para obtener la solución a ese problema.
Abel Morelos
55
He encontrado una serie de diferencias entre el manejo de compiladores de genéricos en casos difíciles. Aquí hay dos preguntas sobre las que hice aquí en caso de que desee agregarlas a su respuesta: stackoverflow.com/questions/13501836/… stackoverflow.com/questions/13980552/…
Elias Vasylenko
55
Las clases anónimas nunca son estáticas según el JLS pero pueden declararse en un ámbito estático. Cuando se usa la reflexión para preguntar si dicha clase es estática, el código generado por ECJ dice que no, mientras que el de javac dice que sí . Publicación relacionada aquí .
Paul Bellora
2
Cualquier diferencia semántica en el bytecode emitido es un error en cualquiera de las implementaciones. Esto no es muy interesante en mi opinión. Puedo producir fácilmente una larga lista de tales "diferencias" simplemente enumerando los errores abiertos de javac y ecj.
aioobe
Para su información, Netbeans no sufre de tales "diferencias", ya que utiliza la API interna de javac para hacer todo lo que hace EJC.
Aleksandr Dubinsky
18

El compilador incorporado de Eclipse se basa en el compilador Java Jikes de IBM . (Tenga en cuenta que Eclipse también comenzó su vida en IBM). Es completamente independiente del compilador Java de Sun en el JDK; No es una envoltura alrededor de Sun's javac.

Jikes ha existido durante mucho tiempo, solía ser mucho más rápido que el compilador JDK Java estándar (pero no sé si eso sigue siendo cierto). En cuanto a por qué IBM quería escribir su propio compilador de Java: tal vez por razones de licencia (también tienen su propia implementación de Java).

Jesper
fuente
31
Realmente no escribieron su propio compilador de Java. Eclipse tiene un largo linaje de regreso a Visual Age para Smalltalk, incluso antes de que Java existiera. Dado que los dos idiomas son en realidad algo similares, simplemente adaptaron su tecnología existente. El compilador de Sun también es completamente inadecuado para su uso en un IDE, especialmente en un IDE incremental de estilo Smalltalk como el Visual Age for Java original, ya que siempre quiere compilar archivos completos. El compilador de IBM puede compilar de forma incremental solo los fragmentos que han cambiado. Incluso puede compilar fragmentos que ni siquiera son Java legales, que se utilizan en el
Jörg W Mittag
2
Eclipse bloc de notas en el que simplemente puede escribir fragmentos de código, los resalta y ejecutarlos, sin tener que ponerlos en una clase, un método principal, o incluso en un método en absoluto .
Jörg W Mittag
1
@ JörgWMittag En realidad, la API interna de javac (utilizada por Netbeans) se puede utilizar para lograr los mismos objetivos.
Aleksandr Dubinsky
1
@AleksandrDubinsky: ¿Qué tan bien funcionó en 1997, cuando se lanzó Visual Age para Java?
Jörg W Mittag
15

Es un compilador completamente separado. Esto es necesario ya que javac no permite la compilación de código ligeramente roto, desde el sitio eclipse

Un compilador incremental de Java. Implementado como un generador de Eclipse, se basa en la tecnología desarrollada desde el compilador VisualAge para Java. En particular, permite ejecutar y depurar código que todavía contiene errores no resueltos.

BenM
fuente
¿Por qué querrías la compilación de código "ligeramente" roto?
Steve Cohen
55
@SteveCohen: Debido a que desea que el compilador proporcione resaltado de sintaxis, resaltado semántico, soporte de refactorización, verificación de tipo, finalización de código, sugerencias y todas las otras cosas que hace un compilador mientras está escribiendo su código, y mientras está escribiendo su código, está más o menos por definición incompleto (de lo contrario, ¿por qué todavía lo está escribiendo?) Un IDE que solo funciona al final del proyecto, cuando todo ya se ha implementado, sería bastante inútil.
Jörg W Mittag