Puisque vous mentionnez Python, la question n'est pas purement théorique. J'essaie donc de donner une perspective plus large sur les types. Les types sont des choses différentes pour différentes personnes. J'ai collecté au moins 5 notions distinctes (mais liées) de types:
Les systèmes de types sont des systèmes logiques et des théories définies.
Un système de types associe un type à chaque valeur calculée. En examinant le flux de ces valeurs, un système de type tente de prouver ou de s'assurer qu'aucune erreur de type ne peut se produire.
Le type est une classification identifiant l'un des différents types de données, telles que les valeurs réelles, entières ou booléennes, qui détermine les valeurs possibles pour ce type; les opérations qui peuvent être effectuées sur des valeurs de ce type; la signification des données; et la façon dont les valeurs de ce type peuvent être stockées
Les types de données abstraits permettent l'abstraction des données dans des langages de haut niveau. Les ADT sont souvent implémentés sous forme de modules: l'interface du module déclare des procédures qui correspondent aux opérations ADT. Cette stratégie de masquage des informations permet de modifier l'implémentation du module sans perturber les programmes clients.
Les implémentations du langage de programmation utilisent des types de valeurs pour choisir le stockage dont les valeurs ont besoin et des algorithmes pour les opérations sur les valeurs.
Les citations proviennent de Wikipédia, mais je peux fournir de meilleures références en cas de besoin.
Les types-1 sont nés du travail de Russel, mais aujourd'hui ils ne sont pas simplement protégés des paradoxes: le langage typé de la théorie des types d'homotopie est une nouvelle façon d'encoder les mathématiques dans un langage formel et compréhensible par la machine, et une nouvelle façon pour les humains de comprendre les fondements des mathématiques. (L'ancienne méthode consiste à coder en utilisant une théorie des ensembles axiomatiques).
Les types 2 à 5 sont apparus dans la programmation à partir de plusieurs besoins différents: pour éviter les bogues, pour classer les concepteurs de logiciels de données et les programmeurs avec lesquels travailler, pour concevoir de grands systèmes et pour implémenter efficacement les langages de programmation respectivement.
Les systèmes de type en C / C ++, Ada, Java, Python ne sont pas nés du travail de Russel ou d'un désir d'éviter les bugs. Ils sont nés du besoin de décrire différents types de données (par exemple, "le nom de famille est une chaîne de caractères et non un nombre"), de modulariser la conception du logiciel et de choisir de manière optimale les représentations de bas niveau pour les données. Ces langues n'ont pas de types-1 ou types-2. Java garantit une sécurité relative contre les bogues non pas en prouvant l'exactitude du programme en utilisant le système de type, mais en concevant soigneusement le langage (pas d'arithmétique du pointeur) et le système d'exécution (machine virtuelle, vérification du bytecode). Le système de types en Java n'est ni un système logique ni une théorie des ensembles.
Cependant, le système de types dans le langage de programmation Agda est une variante moderne du système de types de Russel (basé sur des travaux ultérieurs ou sur Per Martin-Lof et d'autres mathématiciens). Le système de types dans Agda est conçu pour exprimer les propriétés mathématiques du programme et les preuves de ces propriétés, c'est un système logique et une théorie des ensembles.
Il n'y a pas de distinction noir-blanc ici: de nombreuses langues se situent entre les deux. Par exemple, le système de types du langage Haskell a ses racines dans le travail de Russel, peut être considéré comme un système d'Agda simplifié, mais d'un point de vue mathématique, il est incohérent (auto-contradictoire) s'il est considéré comme un système logique ou une théorie des ensembles.
Cependant, en tant que véhicule théorique pour protéger les programmes Haskell contre les bogues, cela fonctionne plutôt bien. Vous pouvez même utiliser des types pour encoder certaines propriétés et leurs preuves, mais toutes les propriétés ne peuvent pas être encodées, et le programmeur peut toujours violer les propriétés prouvées s'il utilise des hacks sales découragés.
Le système de type de Scala est encore plus éloigné du travail de Russel et du langage de preuve parfait d'Agda, mais a toujours des racines dans le travail de Russel.
Quant à prouver les propriétés des langages industriels dont les systèmes de types n'ont pas été conçus pour cela, il existe de nombreuses approches et systèmes.
Pour des approches intéressantes mais différentes, voir le projet de recherche Coq et Microsoft Boogie. Coq s'appuie sur la théorie des types pour générer des programmes impératifs à partir des programmes Coq. Boogie s'appuie sur l'annotation de programmes impératifs avec des propriétés et prouve ces propriétés avec le prouveur de théorème Z3 en utilisant une approche complètement différente de Coq.