Tipo de dados

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar
A hierarquia de tipos padrão do Python 3

Em ciência da computação e programação de computadores , um tipo de dados ou simplesmente tipo é um atributo de dados que informa ao compilador ou interpretador como o programador pretende usar os dados. A maioria das linguagens de programação suporta tipos de dados básicos de números inteiros (de tamanhos variados), números de ponto flutuante (que se aproximam de números reais), caracteres e booleanos . Um tipo de dados restringe os valores que uma expressão, como uma variável ou uma função, pode levar. Esse tipo de dados define as operações que podem ser feitas nos dados, o significado dos dados e a maneira como os valores desse tipo podem ser armazenados. Um tipo de dados fornece um conjunto de valores dos quais uma expressão (ou seja, variável, função, etc.) pode obter seus valores. [1] [2]

Conceito

Os tipos de dados são usados ​​em sistemas de tipos, que oferecem várias maneiras de defini-los, implementá-los e usá-los. Diferentes sistemas de tipo asseguram graus variados de segurança de tipo .

Quase todas as linguagens de programação incluem explicitamente a noção de tipo de dados, embora linguagens diferentes possam usar terminologia diferente.

Os tipos de dados comuns incluem:

Por exemplo, na linguagem de programação Java , o tipo int representa o conjunto de inteiros de 32 bits que variam em valor de -2.147.483.648 a 2.147.483.647, bem como as operações que podem ser executadas em inteiros, como adição, subtração e multiplicação. Uma cor, por outro lado, pode ser representada por três bytes denotando as quantidades de vermelho, verde e azul, e uma string representando o nome da cor.

A maioria das linguagens de programação também permite que o programador defina tipos de dados adicionais, geralmente combinando vários elementos de outros tipos e definindo as operações válidas do novo tipo de dados. Por exemplo, um programador pode criar um novo tipo de dados chamado " número complexo " que inclui partes reais e imaginárias. Um tipo de dados também representa uma restrição colocada sobre a interpretação dos dados em um sistema de tipos , descrevendo a representação, interpretação e estrutura de valores ou objetos armazenados na memória do computador. O sistema de tipos usa informações de tipo de dados para verificar a exatidão dos programas de computador que acessam ou manipulam os dados.

A maioria dos tipos de dados em estatísticas tem tipos comparáveis ​​em programação de computadores e vice-versa, conforme mostrado na tabela a seguir:

Estatisticas Programação
valor real ( escala de intervalo ) ponto flutuante
valor real ( escala de razão )
dados de contagem (geralmente não negativos) inteiro
dados binários boleano
Dados categóricos tipo enumerado
vetor aleatório lista ou matriz
matriz aleatória matriz bidimensional
árvore aleatória árvore

Definição

( Parnas, Shore & Weiss 1976 ) identificaram cinco definições de um "tipo" que foram usadas - às vezes implicitamente - na literatura. Tipos que incluem comportamento se alinham mais com modelos orientados a objetos , enquanto um modelo de programação estruturada tenderia a não incluir código e são chamados de estruturas de dados antigas simples .

Os cinco tipos são:

Sintático
Um tipo é um rótulo puramente sintático associado a uma variável quando ela é declarada. Tais definições de "tipo" não dão nenhum significado semântico aos tipos. [ esclarecimentos necessários ]
Representação
Um tipo é definido em termos de sua composição de tipos mais primitivos – geralmente tipos de máquina.
Representação e comportamento
Um tipo é definido como sua representação e um conjunto de operadores manipulando essas representações.
Espaço de valor
Um tipo é um conjunto de valores possíveis que uma variável pode possuir. Tais definições permitem falar de uniões ( disjuntas ) ou produtos cartesianos de tipos.
Espaço de valor e comportamento
Um tipo é um conjunto de valores que uma variável pode possuir e um conjunto de funções que podem ser aplicadas a esses valores.

A definição em termos de representação era frequentemente feita em linguagens imperativas, como ALGOL e Pascal , enquanto a definição em termos de espaço de valor e comportamento era usada em linguagens de nível superior, como Simula e CLU .

Classes de tipos de dados

Tipos de dados primitivos

Tipos de dados primitivos são tipicamente tipos que são internos ou básicos para uma implementação de linguagem.

Tipos de dados de máquina

Todos os dados em computadores baseados em eletrônica digital são representados como bits (alternativas 0 e 1) no nível mais baixo. A menor unidade de dados endereçável geralmente é um grupo de bits chamado byte (geralmente um octeto , que é de 8 bits). A unidade processada por instruções de código de máquina é chamada de palavra (a partir de 2011 , normalmente 32 ou 64 bits). A maioria das instruções interpreta a palavra como um número binário , de modo que uma palavra de 32 bits pode representar valores inteiros sem sinal de 0 aou valores inteiros com sinal depara. Por causa do complemento de dois , a linguagem de máquina e a máquina não precisam distinguir entre esses tipos de dados não assinados e assinados na maioria das vezes.

Números de ponto flutuante usados ​​para aritmética de ponto flutuante usam uma interpretação diferente dos bits em uma palavra. Consulte Aritmética de ponto flutuante para obter detalhes.

Os tipos de dados de máquina precisam ser expostos ou disponibilizados em sistemas ou linguagens de programação de baixo nível , permitindo um controle refinado sobre o hardware. A linguagem de programação C , por exemplo, fornece tipos inteiros de várias larguras, como shorte long. Se um tipo nativo correspondente não existir na plataforma de destino, o compilador os dividirá em código usando tipos que existem. Por exemplo, se um inteiro de 32 bits for solicitado em uma plataforma de 16 bits, o compilador o tratará tacitamente como um array de dois inteiros de 16 bits.

Na programação de alto nível, os tipos de dados de máquina geralmente são ocultos ou abstraídos como um detalhe de implementação que tornaria o código menos portátil se exposto. Por exemplo, um tipo genérico numericpode ser fornecido em vez de inteiros de alguma largura de bit específica.

Tipo booleano

O tipo Boolean representa os valores true e false . Embora apenas dois valores sejam possíveis, eles raramente são implementados como um único dígito binário por motivos de eficiência. Muitas linguagens de programação não têm um tipo booleano explícito, interpretando (por exemplo) 0 como falso e outros valores como verdadeiro. Os dados booleanos referem-se à estrutura lógica de como a linguagem é interpretada para a linguagem de máquina. Neste caso, um booleano 0 se refere à lógica False. True é sempre um diferente de zero, especialmente um que é conhecido como Boolean 1.

Enumerações

O tipo enumerado possui valores distintos, que podem ser comparados e atribuídos, mas que não possuem necessariamente nenhuma representação concreta particular na memória do computador; compiladores e interpretadores podem representá-los arbitrariamente. Por exemplo, os quatro naipes em um baralho de cartas podem ser quatro enumeradores denominados CLUB , DIAMOND , HEART , SPADE , pertencentes a um tipo enumerado denominado naipe . Se uma variável V é declarada tendo naipecomo seu tipo de dados, pode-se atribuir qualquer um desses quatro valores a ele. Algumas implementações permitem que os programadores atribuam valores inteiros aos valores de enumeração ou até mesmo os tratem como equivalentes a inteiros.

Tipos numéricos

Tal como:

  • Os tipos de dados inteiros ou "números não fracionários". Podem ser subtipados de acordo com sua capacidade de conter valores negativos (por exemplo unsigned, em C e C++). Também pode ter um pequeno número de subtipos predefinidos (como shorte longem C/C++); ou permitir que os usuários definam livremente subfaixas como 1..12 (por exemplo, Pascal / Ada ).
  • Os tipos de dados de ponto flutuante , geralmente representam valores como valores fracionários de alta precisão ( números racionais , matematicamente), mas às vezes são chamados erroneamente de reais (evocativos de números reais matemáticos ). Eles geralmente têm limites predefinidos em seus valores máximos e em sua precisão. Normalmente armazenado internamente na forma a × 2 b (onde aeb são números inteiros ) , mas exibido na forma decimal familiar .
  • Os tipos de dados de ponto fixo são convenientes para representar valores monetários. Eles geralmente são implementados internamente como números inteiros, levando a limites predefinidos.
  • Bignum ou tipos numéricos de precisão arbitrária não possuem limites predefinidos. Eles não são tipos primitivos e são usados ​​com moderação por motivos de eficiência.

Tipos de string e texto

Strings são uma seqüência de caracteres usados ​​para armazenar palavras ou texto simples , na maioria das vezes linguagens de marcação de texto que representam texto formatado . Os caracteres podem ser uma letra de algum alfabeto , um dígito, um espaço em branco, um sinal de pontuação, etc. Os caracteres são desenhados a partir de um conjunto de caracteres como ASCII . Os tipos de caracteres e strings podem ter diferentes subtipos de acordo com a codificação de caracteres. O ASCII original de 7 bits foi limitado e substituído por conjuntos de 8, 16 e 32 bits, que podem codificar uma ampla variedade de alfabetos não latinos (como hebraico e chinês) e outros símbolos. Strings podem ser de tamanho variável ou fixo, e algumas linguagens de programação têm ambos os tipos. Eles também podem ser subtipados por seu tamanho máximo.

Como a maioria dos conjuntos de caracteres inclui os dígitos , é possível ter uma string numérica, como "1234". Essas strings numéricas geralmente são consideradas distintas de valores numéricos como 1234, embora alguns idiomas convertam automaticamente entre eles.

Strings são um tipo de dados primitivo em muitas linguagens, particularmente aquelas voltadas para iniciantes, como BASIC . Em algumas linguagens, uma string é tecnicamente um tipo de dados composto. Por exemplo, em C , strings são compostas de uma matriz de caracteres e em Java, uma string é uma instância da java.lang.Stringclasse. Mas essas linguagens fornecem suporte especial para literais de strings, então as strings ainda têm algum comportamento interno e podem ser consideradas primitivas. [3]

Tipos compostos

Os tipos compostos são derivados de mais de um tipo primitivo. Isso pode ser feito de várias maneiras. As formas como são combinadas são chamadas de estruturas de dados . Compor um tipo primitivo em um tipo composto geralmente resulta em um novo tipo, por exemplo, array-of-integer é um tipo diferente de integer .

  • Uma matriz (também chamada de vetor, lista ou sequência) armazena vários elementos e fornece acesso aleatório a elementos individuais. Os elementos de uma matriz normalmente (mas não em todos os contextos) precisam ser do mesmo tipo. As matrizes podem ser de comprimento fixo ou expansíveis. Índices em um array normalmente são obrigados a ser inteiros (se não, pode-se enfatizar esse relaxamento falando sobre um array associativo ) de um intervalo específico (se nem todos os índices nesse intervalo corresponderem a elementos, pode ser um array esparso ).
  • Record (também chamado de tupla ou struct) Os registros estão entre as estruturas de dados mais simples . Um registro é um valor que contém outros valores, geralmente em número e sequência fixos e normalmente indexados por nomes. Os elementos dos registros são geralmente chamados de campos ou membros .
  • União . Uma definição de tipo de união especificará quais tipos primitivos permitidos podem ser armazenados em suas instâncias, por exemplo, "float ou long integer". Compare com um record , que pode ser definido para conter um float e um inteiro; enquanto que, em uma união, há apenas um tipo permitido por vez.
    • Uma união marcada (também chamada de variante , registro de variante, união discriminada ou união disjunta) contém um campo adicional que indica seu tipo atual para maior segurança de tipo.
  • Um conjunto é uma estrutura de dados abstrata que pode armazenar determinados valores, sem nenhuma ordem específica e sem valores repetidos. Os valores em si não são recuperados de conjuntos, em vez disso, testa-se um valor de associação para obter um booleano "in" ou "not in".
  • Um objeto contém vários campos de dados, como um registro, e também várias sub-rotinas para acessá-los ou modificá-los, chamados métodos .

Muitas outras são possíveis, mas tendem a ser mais variações e combinações das anteriores. Por exemplo, uma lista encadeada pode armazenar os mesmos dados que um array, mas fornece acesso sequencial em vez de aleatório e é formado por registros na memória dinâmica ; embora indiscutivelmente uma estrutura de dados em vez de um tipo per se , também é comum e distinto o suficiente para que sua inclusão em uma discussão de tipos compostos possa ser justificada.

Tipos de dados abstratos

Qualquer tipo de dados que não especifique a representação concreta dos dados é um tipo de dados abstrato . Em vez disso, uma especificação formal baseada nas operações do tipo de dados é usada para descrevê-lo. Qualquer implementação de uma especificação deve cumprir as regras dadas. Tipos de dados abstratos são usados ​​em semântica formal e verificação de programas e, menos estritamente, em design .

Além da verificação, uma especificação pode ser imediatamente transformada em uma implementação. A família OBJ de linguagens de programação, por exemplo, baseia-se nessa opção usando equações para especificação e reescrita para executá-las. A especificação algébrica [4] foi um importante assunto de pesquisa em CS por volta de 1980 e quase um sinônimo para tipos de dados abstratos naquela época. Tem uma base matemática em álgebra universal . [5] A linguagem de especificação pode se tornar mais expressiva permitindo outras fórmulas além das equações.

Um exemplo típico é a hierarquia Boom dos tipos de dados binários tree , list , bag e set . [6] Todos esses tipos de dados podem ser declarados por três operações: null , que constrói o contêiner vazio, single , que constrói um contêiner a partir de um único elemento e append , que combina dois contêineres do mesmo tipo. A especificação completa para os quatro tipos de dados pode ser fornecida adicionando sucessivamente as seguintes regras sobre essas operações:

- null é o neutro esquerdo e direito de uma árvore: append(null,A) = A, append(A,null) = A.
- as listas adicionam que o anexo é associativo: append(append(A,B),C) = append(A,append(B,C)).
- sacos adicionam comutatividade: apêndice(B,A) = apêndice(A,B).
- finalmente, os conjuntos também são idempotentes: apêndice(A,A) = A.

O acesso aos dados pode ser especificado por correspondência de padrões nas três operações, por exemplo, uma função de membro para esses contêineres por:

- membro(X,único(Y)) = eq(X,Y)
- membro(X,null) = false
- membro(X,append(A,B)) = ou(membro(X,A), membro(X,B))

Deve-se tomar cuidado para garantir que a função seja invariável sob as regras relevantes para o tipo de dados.

Outros tipos

Os tipos podem ser baseados ou derivados dos tipos básicos explicados acima. Em algumas linguagens, como C, as funções têm um tipo derivado do tipo de seu valor de retorno .

Ponteiros e referências

O principal tipo derivado não composto é o ponteiro , um tipo de dados cujo valor se refere diretamente (ou "aponta para") outro valor armazenado em outro lugar na memória do computador usando seu endereço . É um tipo primitivo de referência . (Em termos cotidianos, um número de página em um livro pode ser considerado um dado que se refere a outro). Os ponteiros geralmente são armazenados em um formato semelhante a um inteiro; no entanto, tentar desreferenciar ou "procurar" um ponteiro cujo valor nunca foi um endereço de memória válido faria com que um programa travasse. Para melhorar esse problema em potencial, os ponteiros são considerados um tipo separado do tipo de dados para o qual apontam, mesmo que a representação subjacente seja a mesma.

Tipos de funções

Embora as funções também possam receber um tipo, seu tipo não é considerado um tipo de dados na configuração deste artigo. Aqui, os dados são vistos como sendo distintos dos algoritmos . Na programação, as funções estão fortemente relacionadas a este último. Mas, como um princípio central do processamento universal de dados é que os algoritmos podem ser representados como dados , por exemplo, descrição textual e programas binários, o contraste entre dados e funções tem limites. Na verdade, não apenas as funções podem ser representadas por dados, mas as funções também podem ser usadas para codificar dados . Muitos sistemas de tipos contemporâneos focam fortemente nos tipos de função e muitas linguagens modernas permitem que as funções operem como cidadãos de primeira classe .

Excluir funções de serem tratadas como tipos de dados não é incomum em campos relacionados. [ citação necessária ] A lógica de predicados, por exemplo, não permite a aplicação de quantificadores em nomes de funções ou predicados.

Metatipos

Algumas linguagens de programação representam as informações de tipo como dados, permitindo introspecção e reflexão de tipo . Em contraste, sistemas de tipos de ordem superior , embora permitam que tipos sejam construídos a partir de outros tipos e passados ​​para funções como valores, normalmente evitam basear decisões computacionais neles. [ citação necessária ]

Tipos de conveniência

Por conveniência, linguagens e bancos de dados de alto nível podem fornecer tipos de dados prontos do "mundo real", por exemplo, horas, datas e valores monetários (moeda). [7] [8] Estes podem ser embutidos na linguagem ou implementados como tipos compostos em uma biblioteca. [9]

Sistemas de tipos

Um sistema de tipos associa tipos a valores calculados. Ao examinar o fluxo desses valores, um sistema de tipos tenta provar que nenhum erro de tipo pode ocorrer. O sistema de tipos em questão determina o que constitui um erro de tipo, mas um sistema de tipos geralmente procura garantir que as operações que esperam um certo tipo de valor não sejam usadas com valores para os quais essa operação não faz sentido.

Um compilador pode usar o tipo estático de um valor para otimizar o armazenamento necessário e a escolha de algoritmos para operações no valor. Em muitos compiladores C o tipo de dado, por exemplo, é representado em 32 bits , de acordo com a especificação IEEE para números de ponto flutuante de precisão simples . Eles usarão, portanto , operações de microprocessador específicas de ponto flutuante nesses valores (adição de ponto flutuante, multiplicação, etc.). float

A profundidade das restrições de tipo e a maneira de sua avaliação afetam a digitação da linguagem. Uma linguagem de programação pode ainda associar uma operação com algoritmos concretos variados em cada tipo no caso de polimorfismo de tipo . A teoria dos tipos é o estudo dos sistemas de tipos, embora os sistemas de tipos concretos das linguagens de programação se originem de questões práticas de arquitetura de computadores, implementação de compiladores e design de linguagem.

Os sistemas de tipo podem ser variadamente estáticos ou dinâmicos , tipagem forte ou fraca e assim por diante.

Veja também

Referências

  1. ^ digite no Free On-line Dictionary of Computing
  2. ^ Shaffer, CA (2011). Análise de Estruturas de Dados e Algoritmos em C++ (3ª ed.). Mineola, NY: Dover. 1.2. ISBN 978-0-486-48582-9.
  3. ^ "Tipos de Dados Primitivos (Os Tutoriais Java™ > Aprendendo a Linguagem Java > Fundamentos da Linguagem)" . docs.oracle.com . Recuperado em 28 de fevereiro de 2022 .
  4. ^ Ehrig, H. (1985). Fundamentos de Especificação Algébrica 1 - Equações e Semântica Inicial . Springer-Verlag. ISBN 0-387-13718-1.
  5. ^ Wechler, Wolfgang (1992). Álgebra Universal para Cientistas da Computação . Springer-Verlag. ISBN 0-387-54280-9.
  6. ^ Bunkenburg, Alexander (1994). "A Hierarquia Boom". Programação Funcional, Glasgow 1993 : 1–8. CiteSeerX 10.1.1.49.3252 . doi : 10.1007/978-1-4471-3236-3_1 . 
  7. Oeste, Randolph (27 de maio de 2020). "Como o SQL Server armazena tipos de dados: dinheiro" . Nasceu SQL . Recuperado em 28 de janeiro de 2022 . Algum tempo atrás eu descrevi MONEY como um tipo de dado de “conveniência” que é efetivamente o mesmo que DECIMAL(19,4), [...]
  8. ^ "Introdução aos tipos de dados e propriedades de campo" . support.microsoft . com . Recuperado em 28 de janeiro de 2022 .
  9. ^ Wickham, Hadley. "16 Datas e horários" . R para ciência de dados: importe, organize, transforme, visualize e modele dados . Sebastopol, CA. ISBN 1491910399. Recuperado em 28 de janeiro de 2022 .

Leitura adicional

Links externos