Tweeter original aqui. :)
Primeiro de tudo, estou um pouco divertido / chocado que meu tweet esteja sendo levado tão a sério! Se eu soubesse que isso seria amplamente divulgado, eu teria passado mais de 30 segundos escrevendo!
Thiago Silva está correto ao apontar que "estático" e "dinâmico" descrevem com mais precisão a verificação de tipos , em vez de sistemas de tipos . De fato, também não é preciso dizer que um idioma é digitado estaticamente ou dinamicamente. Em vez disso, uma linguagem possui um sistema de tipos, e uma implementação dessa linguagem pode impor o sistema de tipos usando verificação estática ou dinâmica, ou ambas, ou nenhuma das duas (embora isso não seja uma implementação de linguagem muito atraente!).
Por acaso, existem certos sistemas de tipos (ou recursos de sistemas de tipos) que são mais passíveis de verificação estática e existem certos sistemas de tipos (ou recursos de sistemas de tipos) que são mais passíveis de verificação dinâmica. Por exemplo, se seu idioma permitir que você especifique no texto de um programa que um valor específico sempre deve ser uma matriz de números inteiros, é razoavelmente simples escrever um verificador estático para verificar essa propriedade. Por outro lado, se o seu idioma tiver subtipagem e se permitir downcasting, é razoavelmente simples verificar a validade de um downcast em tempo de execução, mas extremamente difícil fazê-lo em tempo de compilação.
O que realmente quis dizer com meu tweet é simplesmente que a grande maioria das implementações de idiomas realiza alguma verificação dinâmica de tipo. Ou, equivalente, a grande maioria dos idiomas possui alguns recursos que são difíceis (se não impossíveis) de verificar estaticamente. Downcasting é um exemplo. Outros exemplos incluem estouro aritmético, verificação de limites de matriz e verificação nula. Alguns deles podem ser verificados estaticamente em algumas circunstâncias, mas, em geral, seria difícil encontrar uma implementação de idioma que não faça nenhuma verificação no tempo de execução.
Isso não é uma coisa ruim. É apenas uma observação de que existem muitas propriedades interessantes que gostaríamos que nossos idiomas aplicassem e que realmente não sabemos como verificar estaticamente. E é um lembrete de que distinções como "tipos estáticos" versus "tipos dinâmicos" não são tão claras quanto algumas pessoas querem que você acredite. :)
Uma observação final: os termos "forte" e "fraco" não são realmente usados na comunidade de pesquisa em linguagem de programação e não têm um significado consistente. Em geral, descobri que quando alguém diz que um idioma tem "digitação forte" e outro idioma tem "digitação fraca", eles estão realmente dizendo que seu idioma favorito (aquele com "digitação forte") os impede de cometer algum erro que o outro idioma (aquele com "digitação fraca") não - ou, inversamente, que seu idioma favorito (aquele com "digitação fraca") permita que eles façam algo interessante que o outro idioma (o um com "digitação forte") não.