【问题标题】:How often is "incremental compilation" performed on Java in Eclipse/ Intellij?Eclipse/Intellij 中的 Java 多久执行一次“增量编译”?
【发布时间】:2016-07-17 19:52:42
【问题描述】:

我了解 Eclipse 使用它自己的 Java (ECJ) 编译器,它能够执行增量编译。从我发现的大多数读数来看,这种编译通常是由保存操作触发的,但这似乎与您在输入单个单元/代码后几乎立即收到编译错误的错误反馈这一事实不符.我还没有找到任何文档或文献说明触发的粒度(即每个单词、字母、行)?是否正在进行某种额外的背景代码分析?尽管除了语法中的错误检测之外,我看不出它如何能够检测到只能通过编译过程才能发现的语义错误。

【问题讨论】:

  • 你看过优秀的开源应用架构吗?具体aosabook.org/en/eclipse.html
  • 你没有提到NetBeans
  • @JasonSperske 我只是看了看,并没有真正看到该页面如何回答我提出的问题。如果有特定的部分,请指出给我。
  • 我认为 IntelliJ 根本不进行增量编译。
  • @user3601148 我将“增量编译”解释为将语法树暴露给 IDE 的 Eclipse 风格。据我了解,IDEA 仍然通过通常的外部编译器路由单文件编译;您链接的更新只是消除了一直使用 Ctrl-B 的需要。正如 OP 所指出的,Eclipse 甚至能够检测到语法错误,并在保存之前的键入期间推荐修复。

标签: java eclipse ecj incremental-compiler


【解决方案1】:

编译器的紧密集成让Eclipse可以在各种情况下调用编译器,其中两个与本题相关:

术语“增量编译”通常是指保存时编译,这可能会触发编译更多依赖于已更改文件的文件。在技​​术术语中,这称为“构建”,它读取 .java 文件并生成 .class 文件。

即用型编译可以提供更直接的反馈。这种编译基于内存中的工作副本而不是文件。您甚至可以在不保存的情况下编辑多个依赖文件,并且编译已经可以看到对其他工作副本所做的更改。在技​​术术语中,这被称为“调和”。尽管此功能是通过调用完整编译器来实现的,但协调不会产生任何类文件。

至于触发器粒度的原始问题:协调工作在每个编辑器的脏区队列上。记录脏区是由编辑器中的击键触发的。然后以 500 毫秒的默认延迟轮询队列。

除了更直接的反馈之外,用户将体验到协调仅在编辑器中创建错误标记,而构建另外使这些标记在 ProblemsMarkers 中可见意见。

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多