En bref: comment les systèmes de types sont-ils classés dans des contextes académiques; en particulier, où puis-je trouver des sources fiables qui rendent les distinctions entre les différents types de système de types clairs?
Dans un sens, la difficulté avec cette question n'est pas que je ne trouve pas de réponse, mais plutôt que j'en trouve trop, et aucune ne se distingue comme correcte. Le fond est que j'essaie d'améliorer un article sur le wiki Haskell sur la dactylographie , qui réclame actuellement les distinctions suivantes:
- Pas de dactylographie: la langue n'a aucune notion de types, ou d'un point de vue typé: il y a exactement un type dans la langue. Le langage d'assemblage n'a que le type «motif binaire», Rexx et Tk n'ont que le type «texte», le noyau MatLab n'a que le type «matrice à valeurs complexes».
- Typage faible: il existe seulement quelques types distincts et peut-être des synonymes de types pour plusieurs types. Par exemple, C utilise des nombres entiers pour les booléens, les entiers, les caractères, les ensembles de bits et les énumérations.
- Typage fort: ensemble de types à grains fins comme dans Ada, langues wirthiennes (Pascal, Modula-2), Eiffel
Ceci est tout à fait contraire à ma perception personnelle, qui était plus dans le sens de:
- Typage faible: les objets ont des types, mais sont implicitement convertis en d'autres types lorsque le contexte l'exige. Par exemple, Perl, PHP et JavaScript sont tous des langages dans lesquels
"1"
peuvent être utilisés dans plus ou moins n'importe quel contexte qui le1
peut. - Typage fort: les objets ont des types et il n'y a pas de conversions implicites (bien que la surcharge puisse être utilisée pour les simuler), donc utiliser un objet dans le mauvais contexte est une erreur. En Python, l'indexation d'un tableau avec une chaîne ou un flottant lève une exception TypeError; à Haskell, il échouera au moment de la compilation.
J'ai demandé des avis à ce sujet à d'autres personnes plus expérimentées dans le domaine que moi, et l'une d'entre elles a donné cette caractérisation:
- Typage faible: l'exécution d'opérations invalides sur les données n'est ni contrôlée ni rejetée, mais produit simplement des résultats invalides / arbitraires.
- Typage fort: les opérations sur les données ne sont autorisées que si les données sont compatibles avec l'opération.
Si je comprends bien, la première et la dernière caractérisation appelleraient C faiblement typé, la seconde l'appellerait fortement typé. Le premier et le second appellent Perl et PHP faiblement typés, le troisième les appellent fortement typés. Tous les trois décriraient Python comme fortement typé.
Je pense que la plupart des gens me diraient "eh bien, il n'y a pas de consensus, il n'y a pas de sens accepté des termes". Si ces personnes se trompent, je serais heureux d'en entendre parler, mais si elles ont raison, comment les chercheurs CS décrivent-ils et comparent-ils les systèmes de types? Quelle terminologie puis-je utiliser qui est moins problématique?
Comme question connexe, je pense que la distinction dynamique / statique est souvent donnée en termes de "temps de compilation" et de "temps d'exécution", ce que je trouve insatisfaisant étant donné que la compilation ou non d'une langue n'est pas tellement une propriété de cette langue. que ses implémentations. Je pense qu'il devrait y avoir une description purement sémantique du typage dynamique versus statique; quelque chose comme «un langage statique est un langage dans lequel chaque sous-expression peut être saisie». J'apprécierais toute réflexion, en particulier les références, qui clarifierait cette notion.