Как компиляция круговых зависимостей работает?

Я сделал пример в 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 или любые другие компиляторы, которые Вы знаете) управляют той ситуацией, не, как избежать его.

Я спрашиваю, потому что я пишу предварительный компилятор, и я хотел бы управлять той ситуацией.

16
задан 4 revs, 3 users 55% 18 October 2017 в 19:28
поделиться

2 ответа

. Вам нужно использовать двухпроходный или многопроходный подход:

Для таких языков, как Java, требуется многопроходный компилятор, поскольку определение x не обязательно должно быть перед использованием:

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

Существуют различные подходы, например, вы можете сделать следующее:

Первый проход может искать все объявления переменных, второй для объявлений методов и т. д. до последнего прохода использует всю эту информацию для компиляции окончательного кода.

8
ответ дан 30 November 2019 в 23:05
поделиться

Первому файлу не нужно ничего знать о XType, за исключением того, что это тип, и аналогично для MType во втором файле. Кроме того, в Java все объекты фактически имеют одинаковый размер (потому что все доступно через ссылки), поэтому размер объекта не нужен. Это не так на других языках - ваш код в его нынешнем виде не будет компилироваться, например, на C ++ (кроме синтаксиса языка).

4
ответ дан 30 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: