Разрешение типов функций во внешних модулях

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

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

Однако обработка вызовов функций в других модулях кажется немного более сложной. В частности, если компилятор может найти исходный/объектный код, соответствующий имени импортированного модуля, как он извлекает информацию о типе? Имеет ли это:

  • Сканировать и анализировать исходный код импортированного модуля, пока не будет найдено объявление функции?
  • Читать какие-то метаданные из объектного файла?
  • Кодировать тип возвращаемого значения функции и типы параметров в имени символа и читать таблицу символов во время компиляции?
  • Найти метаданные в другом месте?

Мне любопытно, какой подход используют компиляторы для современных языков, таких как Haskell, D и Go.


Изменить: я знаю, что C и C++ решают эту проблему с помощью файлов заголовков. Меня такой подход не интересует. В идеале я ищу решение, которое вообще не требует синтаксического анализа.


person Martin Törnwall    schedule 12.04.2013    source источник
comment
Вы ищете функциональный эквивалент #import прагма? Или эквивалент midl компилятор?.   -  person indeterminately sequenced    schedule 18.04.2013
comment
Ничего особенного - мне просто интересно, как можно определить типы внешних функций во время компиляции.   -  person Martin Törnwall    schedule 19.04.2013


Ответы (2)


Во-первых, обратите внимание, что такое разрешение типов является свойством компилятора, а не языка как такового. Различные реализации C/C++ на самом деле предоставляют разные функции в этом направлении — например, вариант Microsoft «предварительно скомпилированные заголовки».

Компилятор Haskell GHC обрабатывает это, создавая файлы интерфейса (с суффиксами «.hi»), которые содержат необходимую информацию о типах. Я полагаю, это квалифицируется как «найти метаданные в другом месте».

person comingstorm    schedule 18.04.2013
comment
Именно такую ​​информацию я и искал. Спасибо. - person Martin Törnwall; 19.04.2013

Вот почему вам нужен заголовочный файл для c/c++, чтобы включить статическую библиотеку или dll. Для dll вы можете определить функции, проверив только dll. Это означает, что файл dll хранит имена функций, возвращаемые значения и типы параметров. Есть несколько инструментов, которые генерируют эти объявления.

На самом деле вы даете решение для вашего вопроса. Все методы используются в зависимости от ситуации.

Читать какие-то метаданные из объектного файла?

Для динамических библиотек, таких как dll, вы можете динамически запрашивать объектный код и вызывать его с помощью указателей функций. для перехода http://code.google.com/p/go-wiki/wiki/WindowsDLLs так что да. Языки .net, такие как C#, vb часто используют это.

Найти метаданные в другом месте?

Для C/C++ вам нужен заголовочный файл для определений, если используются статические библиотеки. Я не могу привести пример для языков, на которых вы говорите.

Сканировать и анализировать исходный код импортированного модуля, пока не будет найдено объявление функции?

Если у вас есть код, это очевидный способ сделать так же, как и другой код, который у вас есть.

Я не думаю, что это отличается для Go, D или Haskell от C/C++.

person Gorkem    schedule 15.04.2013
comment
Извините, я должен был добавить, что я хорошо знаю, как C и C++ решают эту проблему. (Пост отредактирован) Мне нужно объяснить, как такие языки, как Go, обнаруживают типы функций, экспортируемых другими модулями/пакетами, во время времени компиляции, то есть не оставляя это компоновщику. - person Martin Törnwall; 16.04.2013
comment
Типы функций должны определяться во время компиляции для статически типизированных языков. даже для dll у вас должно быть объявление для компиляции (хотя возможно неправильное объявление, что приводит к хаотическим проблемам во время выполнения) - person Gorkem; 18.04.2013
comment
почему вы отделяете С++ от других языков. из-за несовременности? - person Gorkem; 18.04.2013
comment
Потому что на самом деле у него нет модулей в том же смысле, что, например, у Haskell. - person Martin Törnwall; 19.04.2013