编译器构造 – 编译循环依赖关系如何工作?

我以 Java为例,但我认为(未经测试)它在其他(所有)语言中起作用.

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

public class MType {
    XType x;
    MType() {x = null;}
}

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

public class XType {
   MType m;
   public XType(MType m) {this.m = m;}
}

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

可能这是一个愚蠢的问题,但是我想知道如何编译器(javac或者你知道的任何其他编译器)来管理这种情况,而不是如何避免它.

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

您需要采取2通或 multi-pass方法

Languages like Java require a multi-pass compiler since the deFinition of x would not be required to come before the use:

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

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

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

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...