Предположим, у нас есть воображаемый язык программирования со статической типизацией — назовем его SL. Каждый файл SL соответствует модулю — логической группе SL связанных функций в пространствах имен.
Вызовы функций в текущем модуле легко проверяются: проход компилятора обнаруживает все объявленные функции и сохраняет их сигнатуры. Позже мы можем проверить любые такие вызовы, сравнив типы аргументов с типами формальных аргументов в подписи.
Однако обработка вызовов функций в других модулях кажется немного более сложной. В частности, если компилятор может найти исходный/объектный код, соответствующий имени импортированного модуля, как он извлекает информацию о типе? Имеет ли это:
- Сканировать и анализировать исходный код импортированного модуля, пока не будет найдено объявление функции?
- Читать какие-то метаданные из объектного файла?
- Кодировать тип возвращаемого значения функции и типы параметров в имени символа и читать таблицу символов во время компиляции?
- Найти метаданные в другом месте?
Мне любопытно, какой подход используют компиляторы для современных языков, таких как Haskell, D и Go.
Изменить: я знаю, что C и C++ решают эту проблему с помощью файлов заголовков. Меня такой подход не интересует. В идеале я ищу решение, которое вообще не требует синтаксического анализа.