Que argumentos existem em favor da tipificação fraca?

39

Isso surgiu em uma discussão com um amigo, e eu encontrei-me muito pressionado para pensar em um bom argumento. Que benefícios a tipagem fraca confere?

    
por Fishtoaster 19.01.2011 / 05:55
fonte

4 respostas

47

O problema com esse tipo de discussão é simplesmente que os termos "digitação fraca" e "digitação strong" são indefinidos, diferentemente dos termos "digitação estática", "digitação dinâmica", "digitação explícita", "digitação implícita". "," digitação de pato "," digitação estrutural "ou" digitação nominal ". Heck, até mesmo os termos "manifestar digitação" e "latente digitação", que ainda são áreas abertas de pesquisa e discussão são provavelmente melhor definidos.

Então, até que seu amigo forneça uma definição do termo "digitação fraca" que seja estável o suficiente para servir como base para uma discussão, não faz sentido responder a essa pergunta.

Infelizmente, além da resposta de Nick , nenhum dos respondentes se preocupou em fornecer sua definição, e você pode veja a confusão que gera em alguns dos comentários. É difícil dizer, já que ninguém fornece suas definições, mas acho que conto pelo menos três diferentes, apenas nesta mesma página.

Algumas das definições mais comumente usadas são (e sim, eu sei que praticamente nenhuma delas faz sentido, mas essas são as definições que vi as pessoas realmente usarem):

  • digitação fraca = digitação insegura / digitação strong = digitação segura
  • tipagem fraca = tipagem dinâmica / tipagem strong = tipagem estática
  • digitação fraca = digitar pato / digitar strong = digitar nominal
  • tipagem fraca = tipagem estrutural / tipagem strong = tipagem nominal
  • digitação fraca = digitação implícita / digitação strong = digitação explícita
  • digitação fraca = digitação latente / digitação strong = digitação manifesta
  • digitação fraca = sem digitação / digitação strong = digitando
  • digitação fraca = conversões implícitas / digitação strong = apenas conversões explícitas
  • digitação fraca = conversões implícitas ou explícitas / digitação strong = sem conversões
  • digitação fraca = conversões implícitas / digitação strong = somente conversões explícitas
  • digitação fraca = conversões implícitas ou explícitas / digitação strong = sem conversões
  • tipagem fraca = interpretação / tipagem strong = compilação
  • digitação fraca = digitação lenta / strong = rápida
  • digitação fraca = coleta de lixo / digitação strong = gerenciamento de memória manual
  • digitação fraca = gerenciamento de memória manual / digitação strong = coleta de lixo
  • … e muitos outros

As três definições que parecem ser usadas mais amplamente, no entanto, são

  • digitação fraca = sua linguagem de programação idiota / digitação strong = minha linguagem de programação super incrível
  • tipagem fraca = todas as outras linguagens de programação / tipagem strong = a única linguagem de programação que sempre me preocupei em aprender (geralmente Java, C # ou C ++; estranhamente, pessoas que aprendem Haskell ou Scheme como sua primeira e única linguagem não parecem compartilhar essa visão de mundo)
  • digitação fraca = todas as línguas que não entendo / digitação strong = Java (substitua com C # ou C ++ à vontade)

A menos que todos concordem com uma definição do que "tipagem fraca" mesmo é , não faz sentido pensar em quais seriam suas vantagens. Vantagens de quê? Pior ainda, se não houver nenhuma definição , então todos podem apenas mudar suas definições para ajustá-las a seus argumentos, e toda discussão é praticamente garantida para se transformar em um flamewar.

Eu pessoalmente mudei minha própria definição várias vezes ao longo dos anos e agora cheguei ao ponto em que nem considero os termos mais ú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, lembro dolorosamente como estava errado.

    
por 19.01.2011 / 21:49
fonte
25

Lembre-se de que há dois conceitos principais que são comumente confundidos:

Digitação dinâmica

A programming language is said to be dynamically typed when the majority of its type checking is performed at run-time as opposed to at compile-time. In dynamic typing, values have types but variables do not; that is, a variable can refer to a value of any type.

As vantagens aqui são frequentemente descartadas apenas para "novos" programadores, 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, caso contrário, você teria que transmitir ou atribuir um novo valor:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

Dactilografia fraca ou fraca

Weak typing means that a language implicitly converts (or casts) types when used.

Benefícios:

  • Transmita qualquer valor de tipo como um parâmetro para uma função . Útil para retornos de chamada, APIs flexíveis e simplifica a implementação de fechamentos.
  • Avaliação booleana implícita . Qualquer tipo pode ser avaliado como um booleano. Isso também tem benefícios colaterais, como parte de um || que 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 a meio caminho, com a chamada implícita para .toString() ao combinar objetos com String ; caso contrário, os programadores Java estariam amaldiçoando-o durante todo o dia (as instruções de log ficariam fora de controle).

Ambas as definições são do link . Ele disse melhor do que eu pude.

    
por 19.01.2011 / 06:45
fonte
6

O argumento principal para tipagem fraca é o desempenho. (isto é para responder a pergunta do OP como indicado). Há muita discussão boa sobre dinâmica versus estática, implícita versus explícita. etc.

C é a mais famosa linguagem fracamente tipada, 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. Essencialmente, você pode converter char * em int * e a língua não se importaria. Então, por que você faria isso?

A programação em C é muito parecida com a que você faria com a montagem, então há momentos em que você só se importa com um endereço. Não é incomum lançar ou passar uma referência void * por esse mesmo motivo. Se você sabe como a memória é organizada (novamente um C e um problema de montagem), você pode fazer alguns cálculos bem legais com base no endereço no void * para obter as informações necessárias. Isso permite que você cause um curto-circuito no processo pelo qual você teria que passar em Java.

Embora a verificação do tipo de 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 isso, na maioria dos casos, ter um sistema de tipos strong que seja o tempo de compilação verificado ou o tempo de execução verificado ajuda mais frequentemente do que dói.

    
por 19.01.2011 / 22:07
fonte
2

A digitação fraca normalmente é mais fácil para os novatos entenderem, 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 strong versus testes strongs

    
por 19.01.2011 / 06:00
fonte