Je trouve que les discussions sur les types sont plus claires avec le découpage suivant (c'est un peu plus facile avec un tableau, mais tant pis...) :
Typage faible / fort : est-ce que les types sont bien délimités (java, lisp) ou bien on a des conversions implicites qui permettent d'interpréter les valeurs autrement (c, javascript). En réalité il s'agirait plutôt d'une distribution continue des langages sur un axe allant de l'un à l'autre.
Typage statique / dynamique : est-ce que les variable ont un type, connu au moment de la compilation (java, c), ou bien les variables n'ont pas de type mais les valeurs oui, noté dedans lors de l'exécution (lisp, javascript).
Typage explicite / implicite (dans le cas du typage statique uniquement) : le type est-il indiqué explicitement par le développeur (C, java avant) ou bien peut-il être déduit la plupart du temps par le compilateur (ocaml).
Dans ce cas :
ocaml est fortement typé, statiquement et implicitement.
java ou C++ étaient fortement typés, statiquement et explicitement, mais pour partie (variables locales) ça devient plus implicitement.
C est faiblement typé, statiquement et explicitement.
lisp est fortement typé, dynamiquement.
javascript est faiblement typé, dynamiquement.
L'inférence (une déduction ici) de type étant utilisée par le compilateur pour le typage statique et implicite (le compilateur doit connaître les types des variables mais les devine souvent tout seul).
Le soucis de JavaScript est d'être faiblement typé, avec inférence de types et une faible rigueur de comportements.
Du coup plutôt faiblement typé, dynamiquement, et donc sans inférence de type (les valeurs ont un type au moment de l'exécution, mais pas les variables, qui peuvent simplement contenir n'importe quelle valeur). En tout cas autant que je comprenne javascript, je ne suis pas spécialiste (et il se peut que le compilateur puisse essayer de deviner les types de certaines valeurs et variables pour des optimisations, je ne sais pas, mais c'est encore autre chose il me semble).
Et le pire de tout ça est à mon goût le typage faible (à rapprocher sans doute de que tu décrivais comme "faible rigueur de comportements") : le fait qu'il bricole avec les valeurs pour un certain nombre d'opérations, ce qui peut donner des résultats parfois inattendus. On peut voir ça comme un héritage du langage, qui manipulait à la base des données faiblement typées (des valeurs stockées dans des pages html, représentées souvent sous forme de chaînes).
[^] # Re: Inférence de types
Posté par ylsul . En réponse à la dépêche Sortie de JDK 10. Évalué à 6.
Je trouve que les discussions sur les types sont plus claires avec le découpage suivant (c'est un peu plus facile avec un tableau, mais tant pis...) :
Dans ce cas :
L'inférence (une déduction ici) de type étant utilisée par le compilateur pour le typage statique et implicite (le compilateur doit connaître les types des variables mais les devine souvent tout seul).
Du coup plutôt faiblement typé, dynamiquement, et donc sans inférence de type (les valeurs ont un type au moment de l'exécution, mais pas les variables, qui peuvent simplement contenir n'importe quelle valeur). En tout cas autant que je comprenne javascript, je ne suis pas spécialiste (et il se peut que le compilateur puisse essayer de deviner les types de certaines valeurs et variables pour des optimisations, je ne sais pas, mais c'est encore autre chose il me semble).
Et le pire de tout ça est à mon goût le typage faible (à rapprocher sans doute de que tu décrivais comme "faible rigueur de comportements") : le fait qu'il bricole avec les valeurs pour un certain nombre d'opérations, ce qui peut donner des résultats parfois inattendus. On peut voir ça comme un héritage du langage, qui manipulait à la base des données faiblement typées (des valeurs stockées dans des pages html, représentées souvent sous forme de chaînes).