Tweeter original ici. :)
Tout d'abord, je suis quelque peu amusé / choqué que mon tweet soit pris si au sérieux! Si j'avais su que ça allait être aussi largement diffusé, j'aurais passé plus de 30 secondes à l'écrire!
Thiago Silva a raison de souligner que «statique» et «dynamique» décrivent plus précisément la vérification de type , plutôt que les systèmes de type . En fait, il n'est pas vraiment exact de dire qu'une langue est typée de manière statique ou dynamique. Au contraire, une langue a un système de types, et une implémentation de cette langue peut imposer le système de types à l'aide de la vérification statique, de la vérification dynamique, ou des deux, ou des deux (bien que ce ne soit pas une implémentation de langage très attrayante!).
En fait, il existe certains systèmes de types (ou caractéristiques de systèmes de types) qui se prêtent mieux à la vérification statique, et il existe certains systèmes de types (ou caractéristiques de systèmes de types) qui se prêtent mieux à la vérification dynamique. Par exemple, si votre langue vous permet de spécifier dans le texte d'un programme qu'une valeur particulière doit toujours être un tableau d'entiers, il est alors assez simple d'écrire un vérificateur statique pour vérifier cette propriété. Inversement, si votre langue a un sous-typage, et si elle autorise le downcasting, alors il est raisonnablement simple de vérifier la validité d'un downcast au moment de l'exécution, mais il est extrêmement difficile de le faire au moment de la compilation.
Ce que je voulais vraiment dire par mon tweet, c'est simplement que la grande majorité des implémentations de langage effectuent une certaine quantité de vérification de type dynamique. Ou, de manière équivalente, la grande majorité des langues ont des fonctionnalités qui sont difficiles (voire impossibles) à vérifier statiquement. Le downcasting en est un exemple. D'autres exemples incluent le débordement arithmétique, la vérification des limites du tableau et la vérification nulle. Certains d'entre eux peuvent être vérifiés statiquement dans certaines circonstances, mais dans l'ensemble, vous auriez du mal à trouver une implémentation de langage qui ne fait aucune vérification au moment de l'exécution.
Ce n'est pas une mauvaise chose. C'est juste une observation qu'il existe de nombreuses propriétés intéressantes que nous aimerions que nos langues appliquent, et que nous ne savons pas vraiment comment vérifier statiquement. Et c'est un rappel que les distinctions comme les "types statiques" par rapport aux "types dynamiques" ne sont pas aussi nettes que certains le voudraient. :)
Une dernière remarque: les termes «fort» et «faible» ne sont pas vraiment utilisés dans la communauté de recherche en langage de programmation, et ils n'ont pas vraiment de sens cohérent. En général, j'ai trouvé que lorsque quelqu'un dit qu'une langue a un "typage fort" et qu'une autre langue a un "typage faible", ils disent vraiment que leur langue préférée (celle avec "typage fort") les empêche de faire une erreur que l'autre langue (celle avec "typage faible") ne fait pas - ou inversement, que leur langue préférée (celle avec "typage faible") leur permet de faire quelque chose de cool que l'autre langue (le celui avec "typage fort") ne le fait pas.