Les langages typés statiquement nécessitent généralement de déclarer les types de variables, qui sont ensuite vérifiés au moment de la compilation pour réduire les erreurs. Le mot "statique" dans "typé statiquement" fait référence à "l'analyse de code statique", qui est le processus d'examen du code avant de l'exécuter. Bien qu'il soit possible pour un langage à typage statique de déduire le type de la variable du côté droit d'une expression ou des paramètres réels, dans la pratique, la plupart des langages à typage statique nécessitent que les types de variable soient explicitement déclarés.
Les langages typés dynamiquement n'ont généralement pas besoin de déclarations de variables pour avoir des types, et ils déduisent des types de variables en fonction du type calculé à la suite de l'évaluation du côté droit de chaque instruction d'affectation ou des paramètres réels d'un appel de fonction. Étant donné que la variable peut recevoir plusieurs affectations au cours de sa durée de vie, son type peut changer avec le temps et c'est pourquoi elle est appelée "typée dynamiquement". En outre, l'environnement d'exécution doit garder une trace du type actuel pour chaque variable, de sorte que le type est lié à la valeur plutôt qu'à la déclaration de variable. Cela peut être considéré comme un système RTTI (runtime type information).
Les éléments des langages typés statiquement et dynamiquement peuvent être combinés. Par exemple, C # prend en charge les variables typées statiquement et dynamiquement, et les langages orientés objet prennent généralement en charge la conversion de la hiérarchie des types. Les langages typés statiquement offrent généralement diverses manières de contourner la vérification de type, par exemple en utilisant la conversion, la réflexion et l'invocation dynamique.
Typage fort vs faible fait référence à un continuum de combien le langage essaie d'empêcher les bogues dus à l'utilisation d'une variable comme s'il s'agissait d'un type alors qu'il s'agit en fait d'un autre type. Par exemple, C et Java sont des langages typés statiquement, mais Java utilise une vérification de type beaucoup plus forte que C. Le code C suivant est heureux de compiler et d'exécuter, et mettra une valeur aléatoire dans la variable b lors de l'exécution, provoquant très probablement un punaise:
char *a = "123";
int b = (int)a;
Le code Java équivalent produira une erreur de compilation, ce qui est généralement préférable:
String a = "123"
int b = (int)a;