Algorithmes de vérification de type

19

Je commence une recherche bibliographique personnelle sur les algorithmes de vérification de type et souhaite quelques conseils. Quels sont les algorithmes, stratégies et techniques générales de vérification de type les plus couramment utilisés?

Je m'intéresse particulièrement aux algorithmes de vérification de type complexes qui ont été implémentés dans des langages typés fortement statiques largement connus tels que, par exemple, C ++, Java 5+, Scala ou autres. IE, algorithmes de vérification de type qui ne sont pas très simples en raison du typage très simple du langage sous-jacent (comme Java 1.4 et inférieur).

Je ne suis pas en soi intéressé par un langage spécifique X, Y ou Z. Je suis intéressé par les algorithmes de vérification de type quel que soit le langage qu'ils ciblent. Si vous fournissez une réponse comme "la langue L dont vous n'avez jamais entendu parler et qui est fortement typée et le typage est complexe a un algorithme de vérification de type qui fait A, B et C en vérifiant X et Y en utilisant l'algorithme Z", ou "le la stratégie X et Y utilisée pour Scala et une variante Z de A utilisée pour C # sont cool à cause des fonctionnalités R, S et T qui fonctionnent de cette façon ", alors les réponses sont bonnes.

Victor Stafusa
la source
3
Vous devriez peut-être modifier cette question pour poser des questions sur la vérification de type pour une langue spécifique. Les questions ouvertes de style liste sont généralement déconseillées sur SE (bien que ce site particulier n'ait pas encore de politique à ce sujet). Aussi: <type-system-elitist> Le système de type de Java n'est pas complexe </type-system-elitist>.
sepp2k
3
Peut-être que la question pourrait être reformulée pour être plus précise, mais je ne pense pas qu'elle devrait être close.
Dave Clarke
1
@ sepp2k: Je sais que c'est un peu large, mais fini de cette façon parce que je ne veux pas limiter l'utilité des réponses. BTW, je n'ai pas compris ce que vous voulez dire avec "<type-system-elitist> Le système de type Java n'est pas complexe </type-system-elitist>". Le système de type Java 1.4 et inférieur était en fait simple, mais avec les génériques dans Java 5, il est devenu beaucoup plus complexe.
Victor Stafusa
2
Demander une langue particulière rendrait la question plus inappropriée pour ce site, à mon humble avis. La question devrait peut-être demander des techniques générales.
Raphael
1
@Victor Un outil de base sont les grammaires d'attributs . Vous ne serez peut-être pas en mesure de faire tout ce que vous pouvez imaginer de méchant avec eux, mais ils sont un bon point de départ.
Raphael

Réponses:

13

La plupart des recherches ne publient pas réellement les algorithmes de vérification de type pour les langages de programmation complets. Vous trouverez quelques formalisations d'une grande partie des systèmes de types pour les langages de programmation complets, comme le travail effectué par Drossopoulou et Eisenbach pour Java ou le travail de Nipkov et al sur C ++ . Plus souvent, cependant, vous ne trouverez les systèmes de types que pour une partie essentielle du langage (Featherweight Java en est un exemple) ou pour les concepts de base d'un langage tels que l' approche d'inférence de type locale de scala .

Dans les conférences telles que POPL et ICFP, vous trouverez de nombreux algorithmes de vérification de type pour des types spécifiques de systèmes de type, et de nouvelles approches telles que la vérification de type bidirectionnelle et tridirectionnelle .

Plus généralement, vous devez probablement connaître l' algorithme Damas-Milner , l'inférence de type locale, la vérification de type bidirectionnelle et tridirectionnelle et développer à partir de là, en suivant les références dans les articles et en utilisant google scholar pour trouver les articles qui les citent et s'appuyer sur les approches décrites. En outre, comme suggéré ci-dessus, les conférences telles que POPL, ICPF, ESOP et même ECOOP et OOPSLA auront des documents pertinents pour votre quête.

Dave Clarke
la source
Afaik, le système de caractères de Scala a été développé dans des projets de recherche et est donc publié. Le compilateur est également open source. Cependant, je n'ai pas examiné non plus.
Raphael
Pas besoin pour moi de déduire; Je sais qu'il existe des articles publiés sur le système de type de Scala. Cette affirmation est facilement vérifiée par la recherche . De plus, je compte le code source du compilateur comme une publication suffisante sur l'algorithme (à condition qu'il soit inclus dans les sources; je suppose que oui, mais je n'ai pas vérifié). Ma déclaration initiale était ambiguë, c'est vrai, mais votre réaction semble injustifiée.
Raphael
2

Un outil de base est la grammaire des attributs . Vous ne serez peut-être pas en mesure de faire tout ce que vous pouvez imaginer de méchant avec eux, mais ils sont un bon point de départ.

Essentiellement, vous pouvez parcourir l'arborescence de syntaxe abstraite d'un programme de haut en bas et / ou de bas en haut et transmettre des informations. Ainsi, par exemple, vous pouvez transmettre des informations de type de portée globale (par exemple, les classes et leurs membres) vers le bas et déterminer le type d'expressions de manière récursive, c'est-à-dire de bas en haut, en passant les types résultants vers le haut.

Trouvez quelques explications et exemples dans les diapositives ici (chapitre 5).

Raphael
la source
Quelqu'un a-t-il une meilleure référence? Je suppose que je dois acheter le Dragonbook ou Wilhelm / Maurer un de ces jours ...
Raphael
1
L'outil JastAdd est un excellent compilateur moderne et compilateur basé sur des grammaires d'attributs de référence. Nous l'avons utilisé dans un certain nombre de projets.
Dave Clarke