J'essaie d'en savoir plus sur les systèmes de vérification de type de programme complet et d'inférence de type qui utilisent les informations des sites d'appel de fonction pour calculer les informations de type (en plus de l'approche standard d'utilisation du corps de fonction). Par exemple, un tel algorithme pourrait utiliser un appel de fonction comme foo(1)
pour déduire que la fonction dans foo
prend des arguments entiers. Évidemment, cela compliquerait beaucoup l'inférence et rendrait le chèque non modulaire.
Quoi qu'il en soit, je n'ai pas eu beaucoup de chance pour trouver des recherches sur cette approche, probablement parce que je ne connais pas la bonne terminologie pour décrire ce dont je parle. Des pointeurs?
Réponses:
Pour ce faire, presque tous les systèmes avec inférence de type utilisent des informations sur le site d'appel. Les exemples incluent Standard ML, OCaml, F # et Haskell. De nombreux autres langages utilisent les informations du site d'appel pour déduire l'instanciation des paramètres de type, tels que Java, C #, Scala et Typed Racket. Cela s'appelle souvent "Inférence de type local".
Je décrirais simplement ce que vous recherchez comme "Type Inference", et vous devriez probablement commencer par rechercher ce qui est communément appelé le système "Hindley-Milner". La page Wikipedia donne une introduction raisonnable et des pointeurs vers les articles originaux.
Le point de départ pour l'inférence de type locale est le document original de Pierce et Turner, mieux lu dans la version TOPLAS 2000 ( ACM , PDF ).
la source
Vous pouvez jeter un oeil aux systèmes de types pour les types d'intersection qui peuvent vous donner quelque chose comme ça
a :: Int -> Int | Bool -> Bool
, donc vous savez que deux spécialisationsInt
etBool
suffisent, ou utiliser une inférence de type habituelle pour déduire la plupart des types généraux suivie d'une analyse de flux de contrôle pour collecter les données réelles arguments de type. En fait, il existe des approches hybrides (CFA exprimé comme un système de type et vice versa).Des travaux de recherche sur l'inférence des types les moins généraux au lieu de la plupart des types généraux peuvent exister, mais je ne les connais pas.
En ce qui concerne les techniques pour implémenter le polymorphisme, deux solutions existent: 1) spécialisation (pensez aux modèles C ++) 2) hypothèse de représentation uniforme (pensez aux collections de style C avec void *).
Pour 2, vous n'avez pas besoin du type du site d'appel pendant la vérification de type et pouvez prendre en charge plus facilement la compilation séparée.
Notez que nous parlons ici de polymorphisme paramétrique, et les appels de méthode virtuelle OO sont une chose complètement différente appelée polymorphisme de sous-type. Notez que les modèles C ++ prennent en charge à la fois quelque chose comme le polymorphisme paramétrique et le typage canard, qui est encore une autre forme de polymorphisme.
la source