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とコンパイルされます。必要な場合でもコンパイルさMTypeXTypeます。しかし...MType必要XType...それはどのように機能しますか?コンパイラは何が起こっているかをどのように知るのですか?

コンパイラー(javacまたはあなたが知っている他のコンパイラー)がその状況をどのように管理するかを知りたいのですが、それを回避する方法ではありません。

私はプリコンパイラを書いているので、その状況を管理したいので、質問しています。

4

2 に答える 2

9

2パスまたはマルチパスのアプローチを取る必要があります。

Javaのような言語では、使用前にxの定義を指定する必要がないため、マルチパスコンパイラが必要です。

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

さまざまなアプローチがあります。たとえば、次のようにすることができます。

最初のパスはすべての変数宣言を検索し、2番目のパスはメソッド宣言を検索するなど、最後のパスがこのすべての情報を使用して最終的なコードをコンパイルするまで続きます。

于 2010-06-13T16:10:10.360 に答える
4

最初のファイルは、タイプであることを除いてXTypeについて何も知る必要はありません。同様に、2番目のファイルのMTypeについても知る必要があります。また、Javaでは、すべてのオブジェクトは事実上同じサイズであるため(すべてが参照を介してアクセスされるため)、オブジェクトのサイズは必要ありません。これは他の言語ではそうではありません-たとえば、現状のコードはC ++でコンパイルされません(言語構文は別として)。

于 2010-06-13T16:23:50.087 に答える