17

我已经用 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它 compiles: 编译,即使MType因为XType需要它。但是……MType需要XType……那是如何工作的?编译器如何知道发生了什么?

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

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

4

2 回答 2

9

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

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

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

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

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

于 2010-06-13T16:10:10.360 回答
4

第一个文件不需要知道关于 XType 的任何信息,除了它是一个类型之外,第二个文件中的 MType 也是如此。此外,在 Java 中,所有对象实际上都具有相同的大小(因为所有内容都是通过引用访问的),因此不需要对象的大小。在其他语言中并非如此 - 例如,您的代码不会在 C++ 中编译(语言语法除外)。

于 2010-06-13T16:23:50.087 回答