Я сделал пример в 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 или любые другие компиляторы, которые Вы знаете) управляют той ситуацией, не, как избежать его.
Я спрашиваю, потому что я пишу предварительный компилятор, и я хотел бы управлять той ситуацией.
. Вам нужно использовать двухпроходный или многопроходный подход:
Для таких языков, как Java, требуется многопроходный компилятор, поскольку определение x не обязательно должно быть перед использованием:
public class Example {
public static void main(String [] args) {
assert(x==0);
x++;
assert(x==1);
}
static int x=0;
}
Существуют различные подходы, например, вы можете сделать следующее:
Первый проход может искать все объявления переменных, второй для объявлений методов и т. д. до последнего прохода использует всю эту информацию для компиляции окончательного кода.
Первому файлу не нужно ничего знать о XType, за исключением того, что это тип, и аналогично для MType во втором файле. Кроме того, в Java все объекты фактически имеют одинаковый размер (потому что все доступно через ссылки), поэтому размер объекта не нужен. Это не так на других языках - ваш код в его нынешнем виде не будет компилироваться, например, на C ++ (кроме синтаксиса языка).