编译器+;类间引用:javac如何快速完成C++;编译器做得慢吗?

编译器+;类间引用:javac如何快速完成C++;编译器做得慢吗?,java,compiler-construction,language-design,Java,Compiler Construction,Language Design,如果您有一组相互引用并使用彼此方法的类,那么java编译器如何能够如此快速地解析类间引用 P>我知道C++编译器是如何工作的:每个.CPP文件是单独编译的,它们使用这些可怕的.H文件来声明类字段/方法,以便每次重新解析同一组文件,并且/或编译器必须支持预编译的头。 但是Java并没有做到这一点,并且类接口/实现的程序源并没有像TurboPascal那样将它们分开 我可以看到,如果您有一个类Foo,它引用的类Bar、Baz、qux都在一个单独的barbazqux.jar文件中,那么事情就很简单了

如果您有一组相互引用并使用彼此方法的类,那么java编译器如何能够如此快速地解析类间引用

<> P>我知道C++编译器是如何工作的:每个.CPP文件是单独编译的,它们使用这些可怕的.H文件来声明类字段/方法,以便每次重新解析同一组文件,并且/或编译器必须支持预编译的头。 但是Java并没有做到这一点,并且类接口/实现的程序源并没有像TurboPascal那样将它们分开

我可以看到,如果您有一个类Foo,它引用的类Bar、Baz、qux都在一个单独的barbazqux.jar文件中,那么事情就很简单了:.jar文件已经编译好了,所以当Foo.java编译好后,可以查看barbazqux.jar中的.class文件

但是,如果您有循环类引用,并且类Foo引用引用类Foo的类Bar,那么它如何可能编译Foo.java而不必先编译Bar.java,然后决定必须编译Foo.java并陷入循环呢

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



编辑:yair指出,答案模糊地提到了多路径编译器。好的,有多次传球。每个过程中到底发生了什么?Java是如何快速编译的?是否需要重新解析每个遍中的每个文件,或者它存储抽象语法树来节省时间,或者什么?

< P> C++的语法更复杂,表达式部分含糊不清。因此Javac在解析方面更有效。此外,C++还有更多细粒度的编译单元。C++包括,即使预编译,具有递归可见性:包括包含的定义名称,其中包括可以使用的定义名称。在Java中,如果使用导入类的父类,则需要显式导入它

循环类引用是有问题的。在Java中,可以假设一个类存在,即使该类尚未编译。但是java编译器更令人印象深刻,能够同时编译它们。同样的,因为循环依赖。该类使用方法名,因此可以推测地编译第一个类

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);
}
公共A类{
公共静态无效a(int i){
System.out.println(“a(“+i+”)”);
如果(i<10)
B.B(i+2);
}
}
公共B级{
公共静态无效b(int i){
System.out.println(“b(“+i+”)”);
如果(i<10)
A.A(i+1);
}
}
公共静态void main(字符串…参数){
B.B(0);
}

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

…这个概念叫什么,所以如果我选择阅读一些编译器书籍,我可以了解更多关于它的信息?看起来像是dup问题得到了回答。我想,但是这个问题并没有很多答案。C++的编译器很难:请避免向问题添加新的问题来扩展问题的范围。最后一次编辑添加了关于性能的问题,这意味着这个问题现在对未来的访问者的价值很低,因为他们无法确定答案是什么,也无法确定哪些答案是最好的,因为有多个原因需要向上投票。问题不在于解析的效率。这是关于解决类间依赖关系的问题。请给出理由,但我投了赞成票。可能是“.hpp”文件;没有人真正使用这些文件,C++文件也是典型的.h文件。