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中编译 对于泛型方法的空参数,编译器的行为会有所不同
推荐文章
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap
- web - inf在Java EE web应用程序中用于什么?
- Java 8: Lambda-Streams,过滤方法与异常
- 将JsonNode转换为POJO