Linguagens de tipo estaticamente geralmente exigem que você declare os tipos de variáveis, que são verificadas no momento da compilação para reduzir erros. A palavra "estático" em "estaticamente digitado" refere-se à "análise de código estático", que é o processo de examinar o código antes de executá-lo. Embora seja possível para uma linguagem de tipo estaticamente inferir o tipo da variável do lado direito de uma expressão ou parâmetros reais, na prática, a maioria das linguagens de tipo estaticamente exige que os tipos de variáveis sejam declarados explicitamente.
Linguagens tipicamente dinamicamente geralmente não exigem que declarações de variáveis tenham tipos e inferem tipos de variáveis com base no tipo calculado como resultado da avaliação do lado direito de cada instrução de atribuição ou dos parâmetros reais de uma chamada de função. Como a variável pode receber várias atribuições ao longo da sua vida útil, seu tipo pode mudar com o tempo e é por isso que é chamada de "digitado dinamicamente". Além disso, o ambiente de tempo de execução precisa acompanhar o tipo atual de cada variável, para que o tipo seja vinculado ao valor e não com a declaração da variável. Isso pode ser considerado um sistema de informações de tipo de tempo de execução (RTTI).
Elementos de linguagens de tipo estático e dinâmico podem ser combinados. Por exemplo, o C # oferece suporte a variáveis de tipo estático e dinâmico, e as linguagens orientadas a objetos geralmente oferecem suporte à baixa da hierarquia de tipos. As linguagens tipicamente estáticas geralmente fornecem várias maneiras de ignorar a verificação de tipo, por exemplo, usando conversão, reflexão e invocação dinâmica.
Digitação forte vs. fraca refere-se a um continuum de quanto a linguagem tenta evitar erros devido ao uso de uma variável como se fosse um tipo quando na verdade é outro tipo. Por exemplo, C e Java são linguagens de tipo estaticamente, no entanto, Java usa verificação de tipo muito mais forte do que C. O código C a seguir tem o prazer de compilar e executar e colocará um valor aleatório na variável b em tempo de execução, provavelmente causando um erro:
char *a = "123";
int b = (int)a;
O código Java equivalente produzirá um erro de compilação, o que geralmente é preferível:
String a = "123"
int b = (int)a;