Я пишу свой первый язык программирования, который является объектно-ориентированным и до сих пор хорош в создании единого «класса». Но, скажем, я хочу, чтобы уроки, скажем, ClassA
и ClassB
. Если эти двое не имеют ничего общего друг с другом, тогда все хорошо. Однако, скажем, ClassA
создает - это ClassB
ставит 2 связанных вопроса:
-Как узнать компилятор при компиляции, ClassA
который ClassB
даже существует, и, если он это делает, как он узнает о его свойствах?
До сих пор я думал: вместо того, чтобы компилировать каждый класс за раз (т. Е. Сканировать, анализировать и генерировать код), каждый «файл (на самом деле не файл, как таковой, а« класс ») мне нужно сначала сканировать + анализировать каждый» , а потом сгенерировать код для всех?
источник
Старые языки иногда более строгие; рассмотрим, что возможно в Java:
Я видел анти-шаблон выше, и он действительно ужасен (я бы запретил его). Оба модуля компиляции используют друг друга. Но Ifc можно скомпилировать в код без скомпилированного Implem. Скомпилированный код .class, сравнимый с C .obj, содержит «информацию о связях»: импорт Implem, вызывающий конструктор без параметров
Implem()
. Класс Implem может быть скомпилирован без проблем. Частично ClassLoader - выполнение данных класса JVM для инициализации / сборки, а частично и сама виртуальная машина Java играют роль компоновщика , объединяя все.Например, компиляция с одной версией определенной библиотеки и работа с другой версией этой библиотеки будет распознавать ошибки времени выполнения.
Итак, ответ: Компиляция предоставляет единицы скомпилированного объектного кода, которые нужно видеть как код + данные + API для связывания вместе.
Компилятор должен впоследствии также сделать упаковку вместе, и проверить на подъёмник API; второй этап.
Это может раздражать и выглядеть не элегантно, но математические доказательства могут действовать таким же образом: при доказательстве полной правильности можно уже считать, что часть остается верной до проверки.
источник