编译循环依赖关系如何工作?

Fab*_* F. 16 compiler-construction circular-dependency

我用Java编写了这个例子,但我认为(未经测试)它可以在其他(所有?)语言中使用.

你有2个文件.首先,M.java:

public class MType {
    XType x;
    MType() {x = null;}
}
Run Code Online (Sandbox Code Playgroud)

第二,另一个文件(在同一目录中)XType.java,:

public class XType {
   MType m;
   public XType(MType m) {this.m = m;}
}
Run Code Online (Sandbox Code Playgroud)

好吧,这是糟糕的编程,但如果你运行javac XType它编译:编译甚至MType因为XType需要它.但...... MType需要XType......这是如何运作的?编译器如何知道发生了什么?

我想知道编译器(javac或你知道的任何其他编译器)如何管理这种情况,而不是如何避免它.

我问,因为我正在写一个预编译器,我想管理那种情况.

Chr*_*isF 8

你需要采取2通或多通的方法:

像Java这样的语言需要多遍编译器,因为在使用之前不需要定义x:

public class Example {  
public static void main(String [] args) {
    assert(x==0);           
    x++;
    assert(x==1);
}
static int x=0;
}
Run Code Online (Sandbox Code Playgroud)

有各种方法,例如您可以执行以下操作:

第一遍可以查找所有变量声明,第二遍查找方法声明等,直到最后一遍使用所有这些信息来编译最终代码.