How does compiling circular dependencies work?

亡梦爱人 提交于 2019-12-17 16:35:16

问题


I've made the example in Java but I think (not tested) that it works in other (all?) languages.

You have 2 files. First, M.java:

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

Second, another file (in the same directory), XType.java:

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

Ok it's bad programming, but if you run javac XType it compiles: compiles even MType because XType needs it. But ... MType needs XType ... how does that work? How does the compiler know what is happening?

I would like to know how the compiler (javac or any other compilers you know) manages that situation, not how to avoid it.

I'm asking because I'm writing a precompiler and I would like to manage that situation.


回答1:


You need to take a 2-pass, or multi-pass approach:

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;
}

There are various approaches, for example you could do the following:

The first pass could look for all variable declarations, the second for method declarations, etc. until the last pass uses all this information to compile the final code.




回答2:


The first file doesn't need to know anything about XType except that it is a type, and similarly for MType in the second file. Also, in Java, all objects are effectively the same size (because everything is accessed through references), so the size of the object is not needed. This is not so in other languages - your code as it stands would not compile in C++, for example (language syntax apart).



来源:https://stackoverflow.com/questions/3032874/how-does-compiling-circular-dependencies-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!