【问题标题】:compilers + inter-class references: how does javac do quickly what C++ compilers do slowly? [closed]编译器 + 类间引用:javac 如何快速完成 C++ 编译器缓慢的操作? [关闭]
【发布时间】:2012-03-04 00:30:38
【问题描述】:

enter link description here如果您有一堆类都相互引用并使用彼此的方法,那么 java 编译器如何管理如此快速地解析类间引用?

我知道 C++ 编译器在这方面是如何工作的:每个 .cpp 文件都是单独编译的,它们使用那些糟糕的 .h 文件来声明类字段/方法,因此每次都重新解析同一组文件并且/ 或编译器必须支持预编译的头文件。

但是 Java 不这样做,并且类接口/实现的程序源中没有像 Turbo Pascal 将它们分开的方式。

我可以看到,如果你有一个类 Foo 并且它引用类 Bar、Baz、Quux 都在一个单独的 barbazquux.jar 文件中,那么事情就很简单了:.jar 文件已经被编译了,所以当 Foo.java 被编译时,它可以去查看 barbazquux.jar 中的 .class 文件。

但是如果你有循环类引用,并且类 Foo 引用类 Bar 引用类 Foo,它如何编译 Foo.java 而不必先编译 Bar.java 然后决定它必须编译 Foo.java 并得到陷入循环?

Java 编译器如何处理类间引用?


编辑:yair 指出another question 的答案含糊地提到了多通道编译器。好的,所以有多个通行证。每次传递到底发生了什么,Java 是如何快速编译的?它是否必须在每次传递时重新解析每个文件,还是存储抽象语法树以节省时间,还是什么?

【问题讨论】:

  • ...这个概念叫什么,如果我选择查看一些编译器书籍可以了解更多信息?
  • 看起来像已回答的 dup 问题。见here
  • 我猜,但这个问题并没有真正能说明问题的答案。
  • 请避免通过添加新问题来扩大问题的范围。最后一个编辑添加了关于性能的问题,这意味着这个问题现在对未来的访问者的价值非常低,因为他们不能确定要回答什么,也不能确定哪些答案是最好的,因为有多种理由可以投票。跨度>

标签: java compiler-construction language-design


【解决方案1】:

C++ 必须解析外部类声明的源代码,通常在 .hpp 文件中。 Java 处理已经编译好的外部类声明的目标代码。 Java 所做的更像是带有包的语言所做的,例如Ada, Modula-3, ... 这也是大多数 C/C++ 编译器也有“预编译头文件”的原因。

【讨论】:

  • @downvoter 请说明理由
  • idk 但我赞成。也许是“.hpp”文件;没有人真正使用这些,C++ 文件通常也是“.h”文件。
【解决方案2】:

C++ 的语法要复杂得多,表达式部分不明确。所以Javac在解析方面效率更高。 C++ 也有更细粒度的编译单元。 C++ 包含,即使是预编译的,也具有递归可见性:包含的包含定义可以使用的名称。在 Java 中,如果您使用导入类的父类,则需要显式导入它。

循环类引用是有问题的。在 Java 中,可以作为前提假设存在一个类,即使该类尚未编译。但是java编译器更令人印象深刻,能够同时编译它们。由于循环依赖关系相同。 JVM byte code invoke instructions 使用方法名称,因此可以推测性地编译第一个类。

public class A {
    public static void a(int i) {
        System.out.println("a(" + i + ")");
        if (i < 10)
            B.b(i + 2);
    }
}

public class B {
    public static void b(int i) {
        System.out.println("b(" + i + ")");
        if (i < 10)
            A.a(i + 1);
    }
}

public static void main(String... args) {
    B.b(0);
}

【讨论】:

  • 问题不在于解析的效率。它是关于类间依赖关系的解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多