Vejo esses termos espalhados por toda parte na programação e tenho uma vaga noção do que eles significam. Uma pesquisa mostra que essas coisas foram solicitadas em todo o estouro da pilha. Tanto quanto sei, a digitação estática / dinâmica em idiomas é sutilmente diferente da digitação Forte / Fraca, mas essa diferença me escapa. Fontes diferentes parecem usar significados diferentes ou até mesmo usar os termos de forma intercambiável. Não consigo encontrar um lugar que fale sobre os dois e realmente explique a diferença. O que seria legal é se alguém pudesse explicar isso claramente aqui para mim e para o resto do mundo.
319
Respostas:
A digitação estática / dinâmica é sobre quando as informações de tipo são adquiridas (em tempo de compilação ou em tempo de execução)
A digitação forte / fraca é sobre o quão estritamente os tipos são distinguidos (por exemplo, se o idioma tenta fazer uma conversão implícita de seqüências de caracteres em números).
Veja a página wiki para informações mais detalhadas.
fonte
"12" + "34"
seria igual"46"
, mas"12" + "34Q"
seria igual"1234Q"
[felizmente, alguém poderia escrever"12" & "34"
se quisesse concatenação]. Curiosamente, as variáveis que mantinham os números os armazenavam como flutuadores de precisão dupla, e a matemática nessas variáveis usava os valores de ponto flutuante sem o uso de strings, mas não havia como perguntar se uma variável era uma string ou número.Você descobriu um ponto fraco na terminologia que os amadores usam para falar sobre linguagens de programação. Não use os termos digitação "forte" e "fraco" , porque eles não têm um significado técnico universalmente aceito. Por outro lado, a digitação estática significa que os programas são verificados antes de serem executados e um programa pode ser rejeitado antes de ser iniciado. A digitação dinâmica significa que os tipos de valores são verificados durante a execução , e uma operação mal digitada pode fazer com que o programa pare ou sinalize um erro no tempo de execução . Um dos principais motivos da digitação estática é descartar programas que possam ter esses "erros de tipo dinâmico".
Tipagem forte geralmente significa que não há brechas no sistema de tipos, enquanto tipagem fraca significa que o sistema de tipos pode ser subvertido (invalidando quaisquer garantias). Os termos geralmente são usados incorretamente para significar digitação estática e dinâmica. Para ver a diferença, pense em C: o idioma é verificado em tempo de compilação (digitação estática), mas há muitas brechas; você pode praticamente converter um valor de qualquer tipo para outro tipo do mesmo tamanho - em particular, pode converter livremente tipos de ponteiro. Pascal era uma linguagem que se destinava a ser fortemente tipada, mas que possuía uma brecha imprevista: um registro variante sem etiqueta.
As implementações de linguagens fortemente tipadas geralmente adquirem brechas ao longo do tempo, geralmente para que parte do sistema de tempo de execução possa ser implementada na linguagem de alto nível. Por exemplo, o Objective Caml tem uma função chamada
Obj.magic
que tem o efeito de tempo de execução de simplesmente retornar seu argumento, mas, em tempo de compilação, converte um valor de qualquer tipo em um de qualquer outro tipo. Meu exemplo favorito é o Modula-3, cujos designers chamaram de construção de modelagemLOOPHOLE
.Dito isto, você não pode contar com duas pessoas usando as palavras "forte" e "fraco" exatamente da mesma maneira. Então evite-os.
fonte
Basta colocar desta maneira: em um idioma estaticamente digitado, o tipo é estático , ou seja, depois de definir uma variável para um tipo, você NÃO PODE alterá-lo. Isso ocorre porque a digitação está associada à variável e não ao valor a que se refere.
Por exemplo em Java:
Enquanto em um idioma digitado dinamicamente o tipo é dinâmico , ou seja, depois de definir uma variável para um tipo, você PODE alterá-lo. Isso ocorre porque a digitação está associada ao valor e não à variável.
Por exemplo, em Python:
Por outro lado, a digitação forte / fraca em um idioma está relacionada a conversões implícitas de tipo (parcialmente extraídas da resposta de @ Dario):
Por exemplo, em Python:
enquanto no PHP:
A digitação estática permite verificar a correção do tipo no tempo de compilação. Os idiomas tipicamente estáticos são geralmente compilados e os idiomas dinamicamente são interpretados. Portanto, idiomas de tipo dinâmico podem verificar a digitação em tempo de execução.
fonte
Digitação fraca significa que o tipo de um objeto pode mudar dependendo do contexto. Por exemplo, em um idioma de tipo fraco, a cadeia "123" pode ser tratada como o número 123 se você adicionar outro número a ela. Exemplos de linguagens com digitação fraca são bash, awk e PHP.
Outro tipo de linguagem de tipo fraco é C, onde os dados em um endereço de memória podem ser tratados como um tipo diferente por conversão.
Em uma linguagem fortemente tipada, o tipo de um objeto não muda - um int é sempre um int e tentar usá-lo como uma string resultará em um erro. Java e Python são fortemente tipados.
A diferença entre a digitação dinâmica e a estática é quando as regras de tipo são aplicadas. Em uma linguagem de tipo estaticamente, o tipo de cada variável e parâmetro deve ser declarado na fonte e aplicado em tempo de compilação. Em um idioma digitado dinamicamente, os tipos são verificados apenas quando usados em tempo de execução. Portanto, Java é digitado estaticamente e Python é digitado dinamicamente.
No entanto, os limites podem ser um pouco embaçados às vezes. Por exemplo, embora o Java seja digitado estaticamente, toda vez que você usa reflexão ou conversão (por exemplo, ao usar contêineres de Objetos), eles estão adiando a verificação de tipo para o tempo de execução.
Da mesma forma, os idiomas de tipo mais forte ainda serão convertidos automaticamente entre números inteiros e flutuantes (e, em alguns idiomas, BigInts com precisão abitrar).
fonte
f
use argumentx
(fun f(x)
) [**, portanto, nenhum tipo é declarado **] e o corpo da função éx+1
. Sem nenhum tipo declarado, o compilador descobrirá quex
deve ser um int.- fun f x = x + 1;
val f = fn : int -> int
5 + 'c' // OK
Hoje, pesquisando sobre esse assunto, deparei-me com este ótimo artigo http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Ele esclareceu muitas coisas para mim e pensei: isso pode adicionar algumas das grandes respostas acima.
Digitação forte e fraca:
Tipos estáticos e dinâmicos
Tipos explícitos / implícitos:
fonte
Em Scott's Programming Language Pragmatics , 3ª edição, página 291, temos
Portanto, em termos simples, a digitação estática / dinâmica se refere ao horário em que ocorre a verificação de tipo: tempo de compilação para digitação estática e tempo de execução para idiomas dinâmicos. Da mesma forma, a digitação forte / fraca refere-se à agressividade de um idioma na imposição de seu sistema de tipos.
Tentei traduzir a descrição de Scott em um bom diagrama, publicado abaixo.
fonte
Eu acho que os outros colegas fizeram um bom trabalho, especialmente. explicando a diferença entre digitação estática e dinâmica. Mas no que diz respeito à digitação forte e fraca, deve-se dizer que existem diferentes entendimentos / visões.
Aqui estão dois exemplos:
Alguns dizem que Haskell é fortemente tipado, porque você não está autorizado a fazer qualquer tipo conversões.
Outros (por exemplo, a visão de Dario) dizem que um idioma que permite converter implicitamente de string para número de propósito é digitado de maneira fraca, mas outros chamam isso de digitação simples.
Ambas as declarações destacam não os extremos opostos de um sistema de tipos, mas aspectos completamente diferentes. Então, entendo a visão do Sr. Ramsey de não usar os termos "forte" e "fraco" para distinguir entre sistemas de tipos.
fonte
Linguagens de tipo dinâmico v / s estaticamente
Linguagens fortemente tipadas em v / s
Boas leituras adicionais
fonte
Linguagens de tipo estaticamente geralmente exigem que você declare os tipos de variáveis, que são verificadas no momento da compilação para reduzir erros. A palavra "estático" em "estaticamente digitado" refere-se à "análise de código estático", que é o processo de examinar o código antes de executá-lo. Embora seja possível para uma linguagem de tipo estaticamente inferir o tipo da variável do lado direito de uma expressão ou parâmetros reais, na prática, a maioria das linguagens de tipo estaticamente exige que os tipos de variáveis sejam declarados explicitamente.
Linguagens tipicamente dinamicamente geralmente não exigem que declarações de variáveis tenham tipos e inferem tipos de variáveis com base no tipo calculado como resultado da avaliação do lado direito de cada instrução de atribuição ou dos parâmetros reais de uma chamada de função. Como a variável pode receber várias atribuições ao longo da sua vida útil, seu tipo pode mudar com o tempo e é por isso que é chamada de "digitado dinamicamente". Além disso, o ambiente de tempo de execução precisa acompanhar o tipo atual de cada variável, para que o tipo seja vinculado ao valor e não com a declaração da variável. Isso pode ser considerado um sistema de informações de tipo de tempo de execução (RTTI).
Elementos de linguagens de tipo estático e dinâmico podem ser combinados. Por exemplo, o C # oferece suporte a variáveis de tipo estático e dinâmico, e as linguagens orientadas a objetos geralmente oferecem suporte à baixa da hierarquia de tipos. As linguagens tipicamente estáticas geralmente fornecem várias maneiras de ignorar a verificação de tipo, por exemplo, usando conversão, reflexão e invocação dinâmica.
Digitação forte vs. fraca refere-se a um continuum de quanto a linguagem tenta evitar erros devido ao uso de uma variável como se fosse um tipo quando na verdade é outro tipo. Por exemplo, C e Java são linguagens de tipo estaticamente, no entanto, Java usa verificação de tipo muito mais forte do que C. O código C a seguir tem o prazer de compilar e executar e colocará um valor aleatório na variável b em tempo de execução, provavelmente causando um erro:
O código Java equivalente produzirá um erro de compilação, o que geralmente é preferível:
fonte