Primeiramente, vamos aproveitar para esclarecer alguns termos sobre tipagem. Segue abaixo uma versão resumida desta explicação:
Existem tipagem estática e dinâmica, e tipagem fraca e forte, e é possível ter combinações (uma linguagem pode ter tipagem estática e forte, ou dinâmica e forte, ou estática e fraca, ou dinâmica e fraca).
Tipagem estática é quando uma variável não pode mudar seu tipo. Por exemplo, em Java, se eu definir que uma variável é de um tipo, não posso atribuir um valor de outro tipo (exceto se forem compatíveis, como no caso de sub-classes, por exemplo):
// Java, tipagem estática (o tipo da variável não pode mudar)
int x = 1;
x = "abc"; // erro: não posso atribuir uma String em uma variável com tipo incompatível
Tipagem dinâmica é quando a variável pode mudar o tipo. Por exemplo, em JavaScript:
// JavaScript, tipagem dinâmica (o tipo da variável pode mudar)
var x = 1;
x = "abc"; //operação normal, o tipo que era um number passa ser string
Já as tipagens forte e fraca não são conceitos bem definidos e aceitos universalmente, e por vezes são confundidos com tipagem estática e dinâmica. De qualquer forma, a "força" da tipagem costuma estar associado ao fato de um dado poder ser tratado como se fosse de outro tipo. Em C, por exemplo, vc pode gravar um int
e acessá-lo como se fosse um ponteiro, entre outras maluquices que embora possíveis, nem sempre são úteis. Ou seja, C tem tipagem estática (uma variável não pode mudar o tipo) e fraca (um dado pode ser acessado como se fosse de outro tipo).
Também existem as linguagens que fazem coerção automática de tipos, como por exemplo PHP, na qual comparar um número com uma string pode ser verdadeiro (1 == "1"
- um dos valores é convertido para o tipo do outro, e depois é feita a comparação). Nesse caso, seria tipagem fraca (um dado é acessado como se fosse de outro tipo), além de ser dinâmica (em PHP, uma variável pode mudar seu tipo).
Já Python tem tipagem dinâmica e forte: uma variável pode mudar o tipo, mas o valor não pode ser acessado como se fosse de outro (ao contrário de PHP, em Python 1 == "1"
é falso), não há coerção automática.
Dito isso, falando de forma geral, o link já citado possui uma tabela que resume as vantagens e desvantagens de cada tipo:
Tipagem estática Tipagem dinâmica Descobre erros antes Descobre erros no último momento O código costuma ser mais legível. Os tipos aparecem no código ou o IDE consegue mostrar O programador precisa entender e documentar o código para saber os tipos e nunca é garantido Fornece melhor semântica para o código A tipagem funciona mais como um mecanismo Fornece melhor performance na maioria dos casos A performance é inferior Segurança Concisão Qualquer alteração no problema exige mudança no código Alterações podem ser assimiladas sem alteração no código específico Ferramentas de desenvolvimento possuem mais informações e podem ajudar mais o programador É dificil ou impossível criar/usar determinadas ferramentas que ajudam o programador Regras do objeto são bem definidas e fixas Regras variam com o estado do objeto Facilita a formalização Facilita o experimento Rigidez Flexibilidade Mais difícil de aprender e usar Mais difícil de manutenção Reduz a necessidade de testes Exige testes em cima dos tipos Reutilização de código é mais complicada Reutilização de código é mais arriscada Metaprogramação é complicada Metaprogramação é mais fácil Facilita grandes programas Facilita pequenos programas São consideradas tirânicas (fun) São consideradas subversivas (fun) As principais vantagens das "linguagens estáticas" são a segurança, performance e auxílio em tempo de desenvolvimento (refatoração, completação de código, informação auxiliar, cobertura de código etc.).
As "linguagens dinâmicas" são flexíveis, rápidas para prototipar, concisas.
Ou seja, pra variar, não existe essa de que uma das opções é sempre melhor. Saiba as vantagens e desvantagens de cada uma, e avalie qual usar em cada situação (claro que pra saber quando usar, também precisa de experiência, mas de qualquer forma, agora vc tem mais informações para decidir melhor).
Falando por mim, acho que a tipagem estática ajuda em bases de código grandes (sendo que "grande" é subjetivo). Muita gente tem percebido o mesmo, o que ajuda a explicar a crescente popularidade e adoção do TypeScript, por exemplo. Além disso, a declaração de tipos explícitos têm sido adicionada em linguagens como PHP e Python.
Por fim, sobre a "força" da tipagem, vale mencionar que na verdade o buraco é mais embaixo, e sugiro esta leitura, que é um ótimo ponto de partida para um aprofundamento maior sobre o tema.