Eclipse的Java编译器只是围绕javac程序所围绕的同一个核心的包装器,还是完全是一个单独的编译器?如果是后者,他们为什么要另起炉灶呢?


Eclipse实现了自己的编译器,称为Eclipse compiler for Java (ECJ)。

它与javac不同,javac是Sun JDK附带的编译器。一个显著的区别是,Eclipse编译器允许您运行实际上没有正确编译的代码。如果包含错误的代码块从未运行,则程序将正常运行。否则,它将抛出一个异常,表明您试图运行未编译的代码。

另一个不同之处在于,Eclipse编译器允许从Eclipse IDE内部进行增量构建,也就是说,所有代码都在您完成输入后立即编译。

Eclipse自带编译器的事实也很明显,因为您甚至不需要安装Java SDK就可以在Eclipse中编写、编译和运行Java代码。

ECJ优于javac的几个例子是:

Apache Tomcat使用ECJ编译jsp, IntelliJ IDEA支持ECJ,如GNU Compiler for Java (GCJ) 4.3, GCJ与ECJ集成, Liferay使用ECJ构建。


它完全是一个独立的编译器。这是必需的,因为javac不允许从eclipse站点编译稍有损坏的代码

增量式Java编译器。它是作为Eclipse构建器实现的,基于从用于Java编译器的VisualAge演变而来的技术。特别是,它允许运行和调试仍然包含未解决的错误的代码。


Eclipse的内置编译器基于IBM的Jikes java编译器。(注意,Eclipse也是在IBM诞生的)。它在JDK中完全独立于Sun的Java编译器;它不是Sun javac的包装。

Jikes已经存在很长一段时间了,它曾经比标准的JDK Java编译器快得多(但我不知道这是否仍然正确)。至于为什么IBM想要编写自己的Java编译器:可能是因为许可的原因(他们也有自己的Java实现)。


每个人都已经解释过他们是不同的。下面是我注意到的两个编译器之间的一些不同之处。它们都归结为(至少)一个实现中的错误。

与编译时优化相关

Eclipse错误?只在默认情况下切换null

泛型类型推断相关

泛型在Eclipse中编译和运行,但不能在javac中编译 对于泛型方法的空参数,编译器的行为会有所不同