Fortes e fracos de digitação - Strong and weak typing


Da Wikipédia, a enciclopédia livre

Na programação de computadores , linguagens de programação são muitas vezes coloquialmente classificados quanto à possibilidade da linguagem sistema de tipo torna fortemente digitado ou fracamente tipado ( vagamente digitado ). Geralmente, uma linguagem fortemente digitado tem regras mais rigorosas de digitação em tempo de compilação, o que implica que os erros e as exceções são mais provável de acontecer durante a compilação. A maioria dessas regras afetam atribuição de variável, valores de retorno e função de chamada. Por outro lado, uma linguagem fracamente tipada tem regras de digitação mais soltas e podem produzir resultados imprevisíveis ou pode executar a conversão implícita de tipo em tempo de execução. Um conceito diferente, mas relacionado é a digitação latente .

História

Em 1974, Liskov e Zilles definida uma linguagem fortemente tipado como aquele em que "sempre que um objeto é passado a partir de uma função de chamada para uma função chamada, seu tipo deve ser compatível com o tipo declarado na função chamado." Em 1977, Jackson escreveu: "Em uma linguagem fortemente digitado cada área de dados terá um tipo distinto e cada processo irá indicar as suas necessidades de comunicação em termos de estes tipos."

Definições de "forte" ou "fraco"

Uma série de decisões de design de linguagem diferente têm sido referidos como evidência de "forte" ou "fraco" de digitação. Na verdade, muitos destes são compreendidas de forma mais precisa como a presença ou ausência de segurança de tipo , a segurança de memória , verificação de tipo estático , ou verificação de tipo dinâmico .

"Tipagem forte" geralmente refere-se ao uso de tipos de linguagem de programação, a fim de ambas as invariantes de captura do código, e garantir a sua exatidão, e, definitivamente, excluir certas classes de erros de programação. Assim, existem muitas disciplinas "forte digitação" usadas para atingir esses objetivos.

conversões de tipo implícito e "tipo trocadilhos"

Algumas linguagens de programação torná-lo fácil de usar um valor de um tipo como se fosse um valor de outro tipo. Isso às vezes é descrito como "tipagem fraca".

Por exemplo, Aahz Maruch opina que " A coerção ocorre quando você tem uma tipagem estática linguagem e você usar os recursos sintáticos da língua para forçar o uso de um tipo como se fosse um tipo diferente (considere o uso comum de void * em C ). a coerção é normalmente um sintoma de tipagem fraca. a conversão, por outro lado, cria um objeto novo em folha do tipo apropriado ".

Como outro exemplo, GCC descreve este como tipo-punning e avisa que vai quebrar estrito serrilhado . Thiago Macieira discute vários problemas que podem surgir quando tipo trocadilhos faz com que o compilador para fazer inadequados otimizações .

Há muitos exemplos de linguagens que permitem conversões de tipo implícito , mas de uma maneira de tipo seguro. Por exemplo, tanto C ++ e C # permitir que os programas para definir operadores para converter um valor de um tipo para outro de uma forma semanticamente significativa. Quando compilador C ++ encontra um tal conversão, ele trata a operação apenas como uma chamada de função. Em contraste, a conversão de um valor para o tipo C void * é uma operação insegura que é invisível para o compilador.

ponteiros

Algumas linguagens de programação expor ponteiros como se fossem valores numéricos, e permitir aos usuários realizar operações aritméticas sobre eles. Essas línguas são, por vezes referido como "fracamente tipado", uma vez que a aritmética de ponteiro pode ser usado para contornar sistema de tipos da linguagem.

sindicatos untagged

Algumas linguagens de programação apoiar os sindicatos não marcados , que permitem que um valor de um tipo a ser visto como se fosse um valor de outro tipo.

Estática verificação de tipo

Em Luca Cardelli artigo 's tipificado programação , um 'forte sistema de tipo' é descrito como aquele em que não há possibilidade de um erro de tipo de tempo de execução desmarcada. Em outro escrito, a ausência de erros em tempo de execução não verificado é referido como segurança ou tipo de segurança ; Tony Hoare primeiros trabalhos de chamar esta propriedade de segurança .

Dinâmica tipo de verificação

Em teoria, todas as linguagens de programação têm verificação de tipo estático. No entanto, algumas linguagens de programação axiomatise a correcção das declarações escritas pelo programador em tempo de compilação e, em vez deixá-lo até o tempo de execução linguagem para verificar se há correção semântica de tais declarações. Por exemplo, uma variável pode armazenar tanto um número no "depois" ramo de uma instrução if ou o valor booleano "false" no ramo "else", que o sistema de tipo permitiria que em tempo de compilação. Isso é muitas vezes chamado de verificação de tipo "dinâmico", mas deve-se notar que tal linguagem de programação não é de facto "dinamicamente" digitado.

Variação entre linguagens de programação

Note-se que algumas dessas definições são contraditórias, outros são apenas conceitualmente independente, e outros ainda são casos especiais (com restrições adicionais) de outras definições (menos forte), mais "liberais". Devido à grande divergência entre essas definições, é possível defender reivindicações sobre a maioria das linguagens de programação que são fortemente ou fraca digitada. Por exemplo:

  • Java , Pascal , Ada e C exigem que todos os variáveis a ter um tipo declarado, e apoiar o uso de conversões explícitas de valores aritméticos para outros tipos de aritmética. Java, C #, Ada e Pascal são, por vezes dito ser mais fortemente tipado do que C, uma afirmação que provavelmente é baseado no fato de que C suporta mais tipos de conversões implícitas e C também permite ponteiro valores a serem explicitamente convertidos enquanto Java e Pascal não. Java em si pode ser considerada mais fortemente tipado de Pascal como maneiras de escapar do sistema de tipo estático em Java são controlados pela máquina virtual Java sistema tipo 's. C # e VB.NET são semelhantes aos Java a esse respeito, embora eles permitem a desativação da verificação de tipo dinâmico, colocando explicitamente segmentos de código em um "contexto inseguro". Sistema de tipo de Pascal tem sido descrito como "muito forte", porque o tamanho de uma matriz ou string é parte de seu tipo, fazer algumas tarefas de programação muito difícil.
  • Smalltalk , Perl , o Ruby , Python , e Auto estão "fortemente digitado" no sentido de que erros de digitação são impedidos em tempo de execução e eles fazem pouco implícita conversão de tipo , mas essas línguas não fazem uso de verificação de tipo estático: o compilador não verifica ou impor regras de restrição de tipo. O termo tipagem pato é agora usado para descrever a tipagem dinâmica paradigma utilizado pelas línguas neste grupo.
  • O Lisp família de línguas são "fortemente digitado" no sentido de que erros de digitação são impedidos em tempo de execução. Alguns dialetos Lisp como Lisp Comum ou Clojure não apoiar diferentes formas de declarações de tipo e alguns compiladores ( cmucl e relacionados) usam estas declarações, juntamente com a inferência de tipos para permitir várias otimizações e também formas limitadas de verificações de tipo tempo de compilação.
  • ML padrão , F # , OCaml , Haskell , e Rust são estaticamente digite-marcada, mas o compilador infere automaticamente um tipo preciso para a maioria dos valores.
  • Visual Basic é uma linguagem híbrida. Além de variáveis com tipos declarados, também é possível declarar uma variável do "Variante" tipo de dados que pode armazenar dados de qualquer tipo. Seus casts implícitas são bastante liberal, onde, por exemplo, pode-se resumir variantes de cordas e passar o resultado em uma variável inteira. Visual Basic é fracamente tipado.
  • Linguagem assembly e Forth foram disse a ser untyped . Não há nenhuma verificação de tipo; é da responsabilidade do programador para assegurar que os dados fornecidos a funções é do tipo apropriado. Qualquer conversão de tipo necessário é explícito.

Por esta razão, os escritores que desejam escrever de forma inequívoca sobre sistemas do tipo, muitas vezes evitam o termo "tipagem forte" em favor de expressões específicas, tais como " segurança de tipo ".

Veja também

Referências