javac和Eclipse编译器有什么区别?


201

Eclipse的Java编译器是否只是包裹该javac程序的同一个内核的包装器,还是完全是一个单独的编译器?如果是后者,为什么还要重新发明轮子呢?

Answers:


209

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

它不同于Sun JDK附带的编译器javac。一个显着的区别是Eclipse编译器使您可以运行实际上未正确编译的代码。如果永远不会运行带有错误的代码块,则您的程序将正常运行。否则,它将引发异常,表明您试图运行未编译的代码。

另一个区别是Eclipse编译器允许从Eclipse IDE内部进行增量构建,也就是说,一旦完成键入,所有代码都将被编译。

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

与Javac相比,首选ECJ的一些示例是:


3
@ Bart,Eclipse编译器可以很好地用于企业发行版。
jjnguy 2010年

7
@jinguy我不同意您应将Eclipse编译器用于发行版。正如您在答案中指出的那样,它可以编译带有错误的代码,您不希望使用诸如public void foo(){之类的东西。}出现在我的生产代码中。
Matthew Farwell

10
@Matthew Farwell他没有说您应该,但是可以。而且,如果您创建的构建中有错误,那么构建过程首先会出现问题。
Stefan

4
请注意,在应用程序中嵌入ECJ可使程序在JRE下运行,而不需要JDK。
托尔比约恩Ravn的安德森

6
@MatthewFarwell在这里结束循环:对于发行版,建议您仅指定编译器参数-proceedOnError,否则就不会从带有错误的源生成.class文件。
Stephan Herrmann

36

每个人都已经解释过它们是不同的。这是我在两个编译器之间注意到的一些行为差异。它们全都归结为(至少)一种实现中的错误。

编译时优化相关

泛型类型推断


1
实际上,经过一整夜之后,我才知道这种区别:Eclipse向我报告了一个错误的东西,我觉得这是合法的(我不记得是什么),在绝望中(我几乎无法保持清醒),我只是将代码提供给javac然后工作顺利!我在Google中发现必须升级JDT才能解决此问题。
Abel Morelos

5
在困难的情况下,我发现编译器在处理泛型之间存在许多差异。这里有两个我做了关于在这里如果你想将它们添加到你的答案的问题: stackoverflow.com/questions/13501836/... stackoverflow.com/questions/13980552/...
埃利亚斯Vasylenko

5
根据JLS,匿名类永远不会是静态的,但可以在静态范围内声明它们。当使用反射来问这样的类是否是静态的时,ECJ的生成的代码说“否”,而javac的代码说“是”。相关帖子在这里
Paul Bellora

2
发出的字节码中的任何语义差异都是上述两种实现方式中的一个错误。我认为这不是很有趣。通过列出来自javac和ecj的未解决的错误,我可以轻松地产生一长串这样的“差异”。
aioobe 2014年

仅供参考,Netbeans不会遭受任何此类“差异”,因为它使用javac的内部API来完成EJC所做的一切。
Aleksandr Dubinsky

17

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

Jikes已经存在很长时间了,它过去比标准的JDK Java编译器要快得多(但是我不知道那是否仍然如此)。关于IBM为什么要编写自己的Java编译器的原因:也许是由于许可的原因(它们也有自己的Java实现)。


31
他们并没有真正编写自己的Java编译器。Eclipse早在Visual Age for Smalltalk诞生之前就已经存在,甚至在Java尚未出现之前。由于两种语言实际上有点相似,因此它们只是改编了现有技术。Sun的编译器也完全不适合在IDE中使用,尤其是在增量式Smalltalk风格的IDE(例如原始的Visual Age for Java)中,因为它始终希望编译整个文件。IBM的编译器只能增量地编译已更改的片段。它甚至可以编译甚至不合法的Java,这是在使用的片段
约尔格W¯¯米塔格

2
Eclipse剪贴簿,您可以在其中简单地编写代码片段,突出显示它们并运行它们,而不必将它们放入类,主方法甚至根本不放入方法
约尔格W¯¯米塔格

1
@JörgWMittag实际上,javac的内部API(由Netbeans使用)可用于实现所有相同的目标。
Aleksandr Dubinsky

1
@AleksandrDubinsky:在1997年发布Visual Age for Java时,该方法实际效果如何?
约尔格W¯¯米塔格

15

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

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


您为什么要编译“轻微”损坏的代码?
史蒂夫·科恩

5
@SteveCohen:因为您希望编译器提供语法突出显示,语义突出显示,重构支持,类型检查,代码完成,提示以及编译器在编写代码以及编写代码时所做的所有其他工作,从定义上讲,它或多或少是不完整的(否则,您为什么还要编写它?)仅在项目的最后阶段工作的IDE(如果一切都已实现)将变得毫无用处。
约尔格W¯¯米塔格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.