Isso veio à tona em uma discussão com um amigo e me senti pressionado a pensar em bons argumentos. Quais benefícios a digitação fraca confere?
Isso veio à tona em uma discussão com um amigo e me senti pressionado a pensar em bons argumentos. Quais benefícios a digitação fraca confere?
Respostas:
O problema desse tipo de discussão é simplesmente que os termos "digitação fraca" e "digitação forte" são indefinidos, diferentemente dos termos "digitação estática", "digitação dinâmica", "digitação dinâmica", "digitação explícita", "digitação implícita", " digitação de pato "," digitação estrutural "ou" digitação nominal ". Heck, mesmo os termos "digitação manifesta" e "digitação latente", que ainda são áreas abertas de pesquisa e discussão, provavelmente estão melhor definidos.
Portanto, até que seu amigo forneça uma definição do termo "digitação fraca" que seja estável o suficiente para servir de base a uma discussão, nem faz sentido responder a essa pergunta.
Infelizmente, além da resposta de Nick , nenhum dos respondentes também se preocupou em fornecer sua definição, e você pode ver a confusão que gera em alguns dos comentários. É difícil dizer, já que ninguém realmente fornece suas definições, mas acho que conto pelo menos três diferentes, apenas nesta página.
Algumas das definições mais usadas são (e sim, eu sei que praticamente nenhuma delas faz sentido, mas essas são as definições que eu vi as pessoas realmente usarem):
As três definições que parecem ser usadas mais amplamente, no entanto, são
A menos que todos concordam com uma definição do que "tipagem fraca" ainda é , não faz muito sentido pensar sobre o que as suas vantagens pode ser. Vantagens de quê? Pior ainda, se não houver definição alguma , todos poderão mudar suas definições para se ajustarem a seus argumentos, e é garantido que toda discussão se transforma em uma guerra de chamas.
Eu mesmo mudei pessoalmente minha própria definição várias vezes ao longo dos anos e agora cheguei ao ponto em que não considero mais os termos úteis. Eu também costumava pensar que a digitação fraca (em suas várias definições) tem um lugar no script de shell, mas sempre que tenho que resolver o mesmo problema no Bash e no PowerShell, sou dolorosamente lembrado de como estava errado.
Lembre-se de que existem dois conceitos principais que geralmente são confusos:
Diz-se que uma linguagem de programação é digitada dinamicamente quando a maioria de sua verificação de tipo é executada em tempo de execução, em vez de em tempo de compilação. Na digitação dinâmica, os valores têm tipos, mas as variáveis não; isto é, uma variável pode se referir a um valor de qualquer tipo.
As vantagens aqui são frequentemente descartadas apenas como programadores "novos", mas também podem ser convenientes para qualquer programador:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Menos código em qualquer caso em que você precisaria converter ou atribuir um novo valor:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Digitação fraca significa que um idioma converte implicitamente (ou lança) tipos quando usado.
Benefícios:
Avaliação booleana implícita . Qualquer tipo pode ser avaliado como um booleano. Isso também tem benefícios colaterais, como parte de um ||
pode ser usado na atribuição sem conversão para booleano:
var a = param || defaultValue;
Novamente, menos código:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Até o Java teve que ir parcialmente, com a chamada implícita ao .toString()
combinar objetos com a String
; caso contrário, os programadores Java o xingariam o dia inteiro (as instruções de log estariam fora de controle).
Ambas as definições são de http://en.wikipedia.org/wiki/Type_system . Disse isso melhor do que eu poderia.
if
bloco é usado ou alguma outra lógica mais complexa (mesmo em tempo de execução ou dinâmica), a próxima linha será legal e segura contra erros.
O principal argumento para a digitação fraca é o desempenho. (isso é para responder à pergunta dos POs, conforme indicado). Há muita discussão boa sobre dinâmico versus estático, implícito versus explícito. etc.
C é a linguagem de tipo fraco mais famosa e não executa nenhuma verificação de tempo de execução ou verificação de tempo de compilação do tipo de variáveis. Em essência, você pode converter um char *
para um int *
e o idioma não se importaria. Então, por que você faria isso?
A programação C é bem parecida com a que você faria com a montagem, portanto, há momentos em que você se preocupa apenas com um endereço. Não é incomum lançar ou passar uma void *
referência por esse mesmo motivo. Se você souber como a memória está organizada (novamente uma questão de C e montagem), você pode fazer alguns cálculos bem legais com base no endereço void *
para obter as informações necessárias. Isso pode causar um curto-circuito no processo pelo qual você teria que passar em Java, por exemplo.
Embora a verificação do tipo em tempo de execução não tenha uma sobrecarga extraordinária, há momentos em que isso é suficiente para fazer com que uma seção crítica seja muito lenta. Estou pensando principalmente em programação embarcada e sistemas em tempo real neste caso.
Dito isto, na maioria dos casos, ter um sistema de tipo forte que seja verificado em tempo de compilação ou em tempo de execução ajuda com mais frequência do que dói.
Tipicamente, a digitação fraca é mais fácil para os iniciantes, por exemplo, em coisas como excel, javascript e vbscript. Você também troca alguma velocidade de desenvolvimento por possíveis erros.
Bom artigo sobre o assunto: digitação forte vs teste forte