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中编译 对于泛型方法的空参数,编译器的行为会有所不同
推荐文章
- javac和Eclipse编译器之间的区别是什么?
- 工厂模式和策略模式之间的区别是什么?
- 在Java中使用正则表达式提取值
- 如何允许所有网络连接类型HTTP和HTTPS在Android(9)馅饼?
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey