Eclipse 的 Java 编译器只是包装程序javac
所围绕的同一个核心的包装器,还是完全是一个单独的编译器?如果是后者,他们为什么要重新发明轮子?
4 回答
Eclipse 已经实现了自己的编译器,称为Eclipse Compiler for Java (ECJ)。
它与 javac 不同,javac 是 Sun JDK 附带的编译器。一个显着的区别是 Eclipse 编译器允许您运行实际上没有正确编译的代码。如果出现错误的代码块从未运行,您的程序将运行良好。否则,它将抛出一个异常,表明您尝试运行无法编译的代码。
另一个区别是 Eclipse 编译器允许从 Eclipse IDE 中进行增量构建,也就是说,一旦您完成输入,所有代码都会被编译。
Eclipse 自带编译器这一事实也很明显,因为您可以在 Eclipse 中编写、编译和运行 Java 代码,甚至无需安装 Java SDK。
ECJ 优于 javac 的几个例子是:
- Apache Tomcat使用 ECJ 编译 JSP,
- IntelliJ IDEA支持 ECJ,从GNU Compiler for Java (GCJ) 4.3 开始,
- GCJ 与 ECJ 集成,
- Liferay 使用 ECJ 构建。
每个人都已经解释过他们是不同的。以下是我注意到的两个编译器之间的一些行为差异。它们都归结为(至少)其中一种实现中的错误。
编译时优化相关
泛型类型推断相关
Eclipse 的内置编译器基于 IBM 的Jikes java 编译器。(请注意,Eclipse 也是在 IBM 开始的)。在JDK中完全独立于Sun的Java编译器;它不是 Sun 的javac
.
Jikes 已经存在很长时间了,它曾经比标准的 JDK Java 编译器快很多(但我不知道这是否仍然正确)。至于 IBM 为什么要编写自己的 Java 编译器:可能是因为许可的原因(他们也有自己的 Java 实现)。
它完全是一个单独的编译器。这是必需的,因为 javac 不允许编译来自eclipse 站点的轻微损坏的代码
一个增量 Java 编译器。作为 Eclipse 构建器实现,它基于从 VisualAge for Java 编译器演变而来的技术。特别是,它允许运行和调试仍然包含未解决错误的代码。