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

Bar*_*lom 192 java eclipse javac

Eclipse的Java编译器只是程序所在的同一个核心的包装器javac,还是一个单独的编译器?如果是后者,为什么他们会重新发明轮子?

jjn*_*guy 202

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

它与Sun JDK附带的javac(编译器)不同.一个值得注意的区别是Eclipse编译器允许您运行实际上没有正确编译的代码.如果从未运行带有错误的代码块,则程序运行正常.否则,它将抛出一个异常,表明您尝试运行无法编译的代码.

另一个区别是Eclipse编译器允许在Eclipse IDE中进行增量构建,也就是说,所有代码在您完成键入后立即编译.

Eclipse带有自己的编译器这一事实也很明显,因为您可以在Eclipse中编写,编译和运行Java代码,甚至无需安装Java SDK.

ECJ优于javac的一些例子是:

  • @Matthew Farwell他没有说你应该,但你可以.如果你曾经创建过一个有错误的构建,那么你的构建过程就会出现问题. (10认同)
  • @jinguy我不同意你应该使用Eclipse编译器发布.正如你在答案中所说,它可以编译有错误的代码,你不需要像public这样的东西void foo(){throw new Error("未解决的编译问题:\n\t\t\tFOOBAR无法解析\n"); 出现在我的生产代码中. (7认同)
  • @MatthewFarwell在这里关闭一个循环:对于发布版本,建议您只是_not_指定编译器参数`-proceedOnError`,它将不会从源生成带有错误的.c​​lass文件. (6认同)
  • 请注意,在应用程序中嵌入ECJ允许程序在JRE下运行而不需要JDK. (4认同)
  • @Bart,Eclipse编译器适用于企业版本构建. (3认同)
  • 如果您正在编译OSGi包而不是常规java,那么Eclipse编译器更正确,因为它允许指定包访问规则.PDE将为您管理这些访问规则以匹配OSGi运行时类加载器.https://bugs.eclipse.org/bugs/show_bug.cgi?id=106631提供了一个没有这些规则就可能发生的问题的示例. (3认同)

pol*_*nts 35

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

编译时优化相关

泛型类型的推理相关

  • 我发现在困难情况下编译器处理泛型的许多差异.这里有两个我在这里提出的问题,如果你想将它们添加到你的答案:http://stackoverflow.com/questions/13501836/possible-java-compiler-bug-program-does-not-compile-with-一些编译器http://stackoverflow.com/questions/13980552/oracle-jdk-and-eclipse-jdt-compilers-disagree-which-is-compiling-this-incorrect (5认同)
  • 根据JLS,匿名类永远不会是静态的,但它们可以在静态范围内声明.当使用反射来询问这样的类是否是静态的时,ECJ生成的代码在javac的[说是](http://ideone.com/cGgs58)时说不.相关文章[这里](http://stackoverflow.com/questions/758570/is-it-possible-to-make-anonymous-inner-classes-in-java-static). (5认同)
  • 发出的字节码中的任何语义差异都是任一实现中的错误.在我看来,这不是很有趣.我只需列出javac和ecj中的漏洞,就可以轻松地生成一长串这样的"差异". (2认同)

Jes*_*per 17

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

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

  • 他们没有真正*编写自己的Java编译器.在Java甚至存在之前,Eclipse有很长的历史可以追溯到Visual Age for Smalltalk.由于这两种语言实际上有些类似,因此他们只是调整了现有技术.Sun的编译器也完全不适合在IDE中使用,*尤其是*在增量Smalltalk样式的IDE中,就像原始的Visual Age for Java一样,因为它总是想要编译整个文件.IBM的编译器可以逐步编译已更改的片段.它甚至可以编译甚至不合法Java的片段,这些片段用于 (29认同)
  • Eclipse剪贴簿,你可以简单地编写代码片段,突出显示它们并运行它们,而不必将它们放入类,主方法,甚至可以放入方法**. (2认同)
  • @AleksandrDubinsky:1997 年 Visual Age for Java 发布时,它的实际效果如何? (2认同)

Ben*_*enM 14

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

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

  • @SteveCohen:因为您希望编译器提供语法突出显示,语义突出显示,重构支持,类型检查,代码完成,提示以及编译器在编写代码以及编写代码时所做的所有其他工作,从定义上讲,它或多或少是不完整的(否则,您为什么还要编写它?)仅在项目的最后阶段工作的IDE(如果一切都已实现)将变得毫无用处。 (4认同)