Que argumentos existem a favor da digitação fraca?

40

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?

Fishtoaster
fonte
17
O Engineering a Compiler de Cooper e Torczon define tipagem fraca como empregando um sistema de tipos mal projetado. Essa certeza não parece beneficiar alguém.
Corbin março
@ Marçoorbin: Nice. Eu preciso adicionar isso à minha lista.
Jörg W Mittag
5
O melhor argumento pode ser dado pelos executivos das empresas: permite-me contratar pessoas baratas para construir meus sistemas
Vector

Respostas:

46

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):

  • digitação fraca = digitação insegura / digitação forte = digitação segura
  • digitação fraca = digitação dinâmica / digitação forte = digitação estática
  • digitação fraca = digitação de pato / digitação forte = digitação nominal
  • tipagem fraca = tipagem estrutural / tipagem forte = tipagem nominal
  • digitação fraca = digitação implícita / digitação forte = digitação explícita
  • digitação fraca = digitação latente / digitação forte = digitação de manifesto
  • digitação fraca = sem digitação / digitação forte = digitando
  • digitação fraca = conversão implícita / digitação forte = somente conversão explícita
  • digitação fraca = conversão implícita ou explícita / digitação forte = nenhuma conversão
  • digitação fraca = conversões implícitas / digitação forte = apenas conversões explícitas
  • digitação fraca = conversões implícitas ou explícitas / digitação forte = nenhuma conversão
  • digitação fraca = interpretação / digitação forte = compilação
  • digitação fraca = lenta / digitação forte = rápida
  • digitação fraca = coleta de lixo / digitação forte = gerenciamento manual de memória
  • digitação fraca = gerenciamento manual de memória / digitação forte = 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 estúpida e ruim / digitação forte = minha linguagem de programação super impressionante
  • digitação fraca = qualquer outra linguagem de programação / digitação forte = a única linguagem de programação que eu já me preocupei em aprender (geralmente Java, C # ou C ++; estranhamente, as pessoas que aprendem, por exemplo, 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 eu não entendo / digitação forte = Java (substitua por C # ou C ++ à vontade)

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.

Jörg W Mittag
fonte
5
Resposta bastante cínica! Entendo de onde você vem, mas acho que é "bom o suficiente" supor que quem não fornece uma definição está se referindo à "digitação fraca e / ou dinâmica", e foi por isso que incluí as duas na minha resposta. Eu sei que não é perfeito, mas a maioria das pessoas parece desconfiar quando se trata de definir sistemas de tipos.
Nicole
7
@Renesis: Eu chamaria isso de "realismo" :-) Já vi discussões suficientes sobre sistemas de tipos para perceber que metade das pessoas não percebem que estão falando sobre coisas completamente diferentes e as outras não sabem o que estão falando. sobre tudo . Há alguns meses, houve uma discussão na lista principal de desenvolvimento de um idioma que não cito, sobre a adição de um sistema de tipos opcional para melhorar o desempenho. Essa discussão durou uma semana, envolveu dezenas de pessoas e centenas de e-mails. Não se percebeu que um sistema de tipo opcional , por definição, não pode melhorar o desempenho. ...
Jörg W Mittag
8
+1 para o cinismo! Você pode adicionar "tipagem forte = quando o IDE sabe os tipos de meus variáveis (IntelliSense etc.), tipagem fraca = quando isso não acontece)"
user281377
11
Os nomes mais bem definidos para os sistemas de digitação não possuem o julgamento implícito do valor que os fracos e os fortes têm.
Eva
11
Lindo, divertido e preciso. Quanto mais eu aprendia sobre sistemas de tipos, mais percebia quanto tempo sofria sob a ilusão de que um idioma era diferente de outro de maneiras que simplesmente não eram. É incrível quanta confusão esse conceito causa, e eu realmente acho que não é necessário se aceitarmos que fraco / forte não é uma coisa real, então vamos falar sobre algo que realmente é e talvez possamos aprender alguma coisa.
BrianH
25

Lembre-se de que existem dois conceitos principais que geralmente são confusos:

Digitação dinâmica

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 ou fraca

Digitação fraca significa que um idioma converte implicitamente (ou lança) tipos quando usado.

Benefícios:

  • Passe qualquer valor de tipo como parâmetro para uma função . Útil para retornos de chamada, APIs flexíveis e facilita 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 ||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.

Nicole
fonte
11
A digitação dinâmica também é benéfica quando muita geração de código seria necessária em um idioma estaticamente digitado. Compare a quantidade de geração de código necessária para, por exemplo, o Entity Framework em bibliotecas C # e ORM em linguagens de tipo dinâmico (PHP, Python, etc.). Embora alguns possam argumentar que os benefícios em termos de IDE IntelliSense superam o custo de toda essa geração de código ...
Dean Harding
3
O seu comentário "// no i = ((Array) data) .length ou Array myArr = (Array) data;" não tem nada a ver com digitação dinâmica, porque a matriz de dados é possível em tempo de compilação. Uma linguagem de tipo estaticamente pode propagar o conhecimento obtido a partir de instanceof.
Peter Taylor
@ Peter Taylor, suponho que isso seja verdade em casos simples, você conhece algum que o faça? Isso tem a ver com a digitação dinâmica, pois, se um ifbloco é 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.
Nicole
@ Renesis, eu não, não. Mas a família de idiomas ML é estaticamente tipada e usa inferência de tipo, portanto, raramente é necessário declarar explicitamente o tipo de uma variável.
Peter Taylor
11
@ Peter Taylor está correto. Muitos dos benefícios da digitação dinâmica estão disponíveis em idiomas com melhores sistemas de digitação estática, como Haskell, Scala ou mesmo C # em alguns casos. Eu diria que a principal vantagem da digitação dinâmica é lidar com coisas que são inerentemente sem tipo, como HTML DOM. Por que escrever o nó ["attr"] em vez do node.attr? Eles sempre são resolvidos no tempo de execução de qualquer maneira.
Matt Olenik
7

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.

Berin Loritsch
fonte
2
Não vejo por que uma linguagem fortemente tipada não pode compilar com a mesma eficiência que C. Mas o compilador deve ser muito mais complexo.
9000
2
C ++ é um exemplo de uma dessas linguagens. No C ++, toda a verificação de tipo é feita no tempo de compilação e nenhuma é feita no tempo de execução ... A menos que você tenha o RTTI ativado.
Berin Loritsch
2
Não tenho certeza se concordo com esse argumento de desempenho, mas é uma visão interessante.
Martin Ba
2

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

Homde
fonte
11
Eu não acho que exista uma forte correspondência entre idiomas fracamente digitados e idiomas amigáveis ​​para iniciantes. Ruby e python são fortemente tipados e geralmente considerados amigáveis ​​para iniciantes. C é fracamente tipado e geralmente considerado novato hostil.
sepp2k
Não, não o idioma em geral, eu estava apenas falando sobre a digitação.
Homde
2
Dinâmica e fortemente tipada são a combinação amigável para iniciantes. Embora eu tenha visto que, quando as pessoas passam de uma linguagem de tipo estaticamente para outra, elas também ficam realmente confusas. Eu nunca vi alguém que começou com digitação dinâmica desde que as escolas acabam ensinando C ou Java primeiro na maioria das vezes.
Jsternberg
3
@Mchl: isso não tem nada a ver com digitação estática / dinâmica ou forte / fraca. Ter que declarar tipos é uma digitação explícita / implícita.
Jörg W Mittag
11
Poderia muito bem ser;) Então, mudei também da linguagem explicitamente para a linguagem tipicamente implícita. Corrija-me se eu estiver errado. Pascal é digitado estaticamente, forte e explicitamente, enquanto o PHP é digitado de forma dinâmica, fraca e implícita, não é?
Mchl