Я пытаюсь узнать больше о проверке типов в целых программах и системах вывода типов, которые используют информацию с сайтов вызова функций для вычисления информации о типах (в дополнение к стандартному подходу использования тела функции). Например, такой алгоритм может использовать вызов функции, например, foo(1)
чтобы сделать вывод, что функция foo
принимает целочисленные аргументы. Очевидно, это сильно усложнит вывод и сделает проверку немодулярной.
В любом случае, мне не повезло найти какое-либо исследование этого подхода, возможно, потому что я не знаю правильной терминологии, чтобы описать то, о чем я говорю. Есть указатели?
Ответы:
Почти все системы с выводом типа используют для этого информацию сайта вызова. Примеры включают в себя Standard ML, OCaml, F # и Haskell. Многие другие языки используют информацию о сайте вызова для определения реализации параметров типа, например Java, C #, Scala и Typed Racket. Это часто называется «Вывод локального типа».
Я бы просто описал то, что вы ищете, как «Вывод типа», и вы, вероятно, должны начать с поиска так называемой системы «Хиндли-Милнера». Википедия страница дает разумное введение и указатели на оригинальные работы.
Начать локальный вывод типов можно с оригинальной статьи Пирса и Тернера, которую лучше всего прочитать в версии TOPLAS 2000 ( ACM , PDF ).
источник
Вы можете взглянуть на системы типов для типов пересечений, которые могут дать вам что-то похожее
a :: Int -> Int | Bool -> Bool
, так что вы знаете, что двух специализаций достаточноInt
иBool
достаточно, или использовать обычный вывод типа для вывода наиболее общих типов, за которым следует анализ потока управления для сбора фактических данных. введите аргументы. На самом деле существуют гибридные подходы (CFA выражается в виде системы типов и наоборот).Могут существовать исследовательские работы по выводу наименее общих типов вместо большинства общих типов, но я не знаю о них.
Что касается методов реализации полиморфизма, существуют два решения: 1) специализация (представьте шаблоны C ++) 2) предположение о равномерном представлении (представьте коллекции в стиле C с void *).
Для 2 вам не нужен тип из call-site во время проверки типов, и вы можете легче поддерживать отдельную компиляцию.
Обратите внимание, что здесь мы говорим о параметрическом полиморфизме, а вызовы виртуальных методов ОО - это совершенно другая вещь, называемая полиморфизмом подтипа. Обратите внимание, что шаблоны C ++ поддерживают что-то вроде параметрического полиморфизма и утиной типизации, что является еще одной формой полиморфизма.
источник