C'est une bonne question! Il demande ce que nous attendons des types dans un langage tapé.
Notez d'abord que nous pouvons taper n'importe quel langage de programmation avec l' unité : il suffit de choisir une lettre, de dire U
et de dire que chaque programme a du type U
. Ce n'est pas terriblement utile, mais cela fait un point.
Il existe de nombreuses façons de comprendre les types, mais du point de vue du programmeur, je pense que ce qui suit est utile. Considérez un type comme une spécification ou une garantie . Dire que a le type revient à dire que "nous garantissons / attendons / demandons que satisfasse la propriété codée par ". Souvent, est quelque chose de simple , auquel cas la propriété est simplement "c'est un entier".A e A AeAeAAint
Il n'y a pas de fin à la façon dont vos types peuvent être expressifs. En principe, il peut s'agir de n'importe quel type d'énoncés logiques, ils peuvent utiliser la théorie des catégories, etc. Vous pouvez aller plus loin, en ce moment j'écoute une conférence sur les "logiques de séparation simultanées" qui vous permet de parler du fonctionnement des programmes simultanés avec un état partagé. Des trucs de fantaisie.
L'art des types dans la conception de langages de programmation est un équilibre entre expressivité et simplicité :
- des types plus expressifs nous permettent d'expliquer plus en détail (à nous-mêmes et au compilateur) ce qui est censé se passer
- les types plus simples sont plus faciles à comprendre et peuvent être automatisés plus facilement dans le compilateur. (Les gens proposent des types qui nécessitent essentiellement un assistant de vérification et la saisie de l'utilisateur pour effectuer la vérification de type.)
La simplicité ne doit pas être sous-estimée, car tous les programmeurs n'ont pas de doctorat en théorie des langages de programmation.
Revenons donc à votre question: comment savez-vous que votre système de typage est bon ? Eh bien, prouvez des théorèmes qui montrent que vos types sont équilibrés. Il y aura deux types de théorèmes:
Théorèmes qui disent que vos types sont utiles . Savoir qu'un programme a un type devrait impliquer certaines garanties, par exemple que le programme ne restera pas bloqué (ce serait un théorème de sécurité ). Une autre famille de théorèmes relierait les types à des modèles sémantiques afin que nous puissions commencer à utiliser de vrais mathématiques pour prouver des choses sur nos programmes (ce seraient des théorèmes d'adéquation , et bien d'autres). L'unité ci-dessus est mauvaise car elle n'a pas de théorèmes aussi utiles.
Théorèmes qui disent que vos types sont simples . Un élément fondamental serait qu'il est possible de déterminer si une expression donnée a un type donné. Une autre fonctionnalité de simplicité consiste à fournir un algorithme pour déduire un type. D'autres théorèmes sur la simplicité seraient: qu'une expression a au plus un type, ou qu'une expression a un type principal (c'est-à-dire, le "meilleur" parmi tous les types qu'elle a).
Il est difficile d'être plus précis car les types sont un mécanisme très général. Mais j'espère que vous voyez ce que vous devez viser. Comme la plupart des aspects de la conception d'un langage de programmation, il n'y a pas de mesure absolue de réussite. Au lieu de cela, il y a un espace de possibilités de conception, et l'important est de comprendre où dans l'espace vous êtes, ou voulez être.