O que se entende por um tipo de dados primitivo?

42

Meu entendimento de um tipo de dados primitivo é que

É um tipo de dados fornecido por um idioma implicitamente (Outros são classes definidas pelo usuário)

Portanto, idiomas diferentes têm conjuntos diferentes de tipos de dados que são considerados primitivos para esse idioma específico. Isso esta certo?

E qual é a diferença entre um "tipo de dados básico" e "tipo de dados interno". A Wikipedia diz que um tipo de dados primitivo é um dos dois.

PS - Por que o tipo "string" é considerado um tipo primitivo no SNOBOL4 e não em Java?

jsp99
fonte

Respostas:

34

Depende do idioma.

Por exemplo, em linguagens como C e C ++, você tem uma série de built-in tipos escalares - int, float, double, char, etc. Estes são "primitivos", no sentido de que não podem ser decompostos em componentes mais simples. A partir desses tipos básicos, você pode definir novos tipos - tipos de ponteiro, tipos de matriz, tipos de estrutura, tipos de união, etc.

Então você tem uma linguagem como o Lisp da velha escola, onde tudo é um átomo ou uma lista . Novamente, pela definição acima, um átomo é "primitivo" no sentido de que não pode ser decomposto em algo mais simples.

Editar

Para mim, os termos "primitivo", "básico" e "interno" são praticamente intercambiáveis. Se você quiser ser realmente pedante, poderá distinguir entre os tipos "internos" (aqueles explicitamente fornecidos pela definição de linguagem) e os tipos derivados dos tipos internos ainda "primitivos" ou "básicos". na medida em que não podem ser decompostos em elementos mais simples. C'stypedefEsse recurso permite criar novos nomes de tipos para os tipos existentes. O Ada permite criar novos tipos escalares que têm restrições. Por exemplo, você pode derivar um tipo Latitude do tipo flutuante interno, com a restrição de que ele não pode assumir valores fora do intervalo [-90,0, 90,0]. Ainda é um tipo primitivo ou básico, pois não pode ser dividido em nenhum componente mais simples, mas, como é definido pelo usuário, não é considerado um tipo "interno".

Novamente, esses conceitos são um pouco confusos e realmente dependem do contexto. Por exemplo, a noção de um tipo "interno" não tem sentido para um idioma sem tipo como o BLISS.

John Bode
fonte
Qual é a diferença entre tipos de dados básicos e incorporados?
Jsp99
1
"String" é um tipo de dados primitivo em Java? (Vi o comentário de delnan à resposta de Jesper). Quero saber sua opinião, porque em um de seus comentários você disse "se o tipo primitivo depende ou não de quem você pergunta".
Jsp99
@Appy - veja editar.
John Bode
3
@Appy String em Java não é primitiva porque é um tipo composto. Se você observar o código-fonte da classe String (src.zip na pasta JDK), verá que internamente a String é representada como uma matriz de caracteres. Assim, você pode decompor String em caracteres individuais. Você não pode decompor caracteres em valores menores, o que torna charum tipo primitivo e Stringum tipo composto.
Jacek Prucia
2
@ Appy Você está perdendo o objetivo. As cadeias SNOBOL4 não podem ser decompostas. As strings Java podem. Essa é a diferença. Ambos são construídos, mas apenas as seqüências SNOBOL4 são primitivas.
Rig
19

Da perspectiva do Java :

Em Java, há uma distinção muito clara entre tipos primitivos e não primitivos.

Uma variável de um tipo primitivo contém diretamente o valor desse tipo (em outras palavras, eles são tipos de valor ).

Uma variável de um tipo não primitivo não contém o valor diretamente; em vez disso, é uma referência (semelhante a um ponteiro) a um objeto. (Não é possível em Java criar tipos de valores definidos pelo usuário).

Java tem oito tipos primitivos: byte, short, int, long, char, boolean, floate double. Qualquer outra coisa é do tipo não primitivo.

Jesper
fonte
Portanto, o tipo de dados String não é primitivo em Java. Em todo programa Java main (), escrevemos "public static void main (String args [])". Por quê? Por que sempre temos que passar um argumento String em main? Além disso, nunca precisamos importar o tipo String em Java da maneira como o incluímos em C / C ++ (por exemplo, #include <string> ou usando std :: string). Por favor explique.
Maxood
7
@Maxood String faz tem estatuto especial na língua (ele fica literais, é a assinatura de main, não está internando que eu presumo é explicitamente permitido pelas JLS, está disponível automagicamente, etc.), mas não é um primitivo tipo de dados. Pode-se chamá-lo de embutido .
@Jesper Por que os tipos primitivos são mais rápidos de trabalhar? Simplesmente devido ao fato de que eles não têm o invólucro extra que os não primitivos têm? Eu estou tentando descobrir a diferença entre primitivos e não primitivos ... como em primitivos são construídos na CPU ou algo assim?
Abdul
Da Wikipedia: "Dependendo do idioma e de sua implementação, os tipos de dados primitivos podem ou não ter uma correspondência individual com objetos na memória do computador. No entanto, geralmente se espera que as operações nos tipos de dados primitivos básicos sejam o idioma mais rápido. constrói existem. " --- Portanto, essa correspondência 1 para 1 é a causa raiz de ser mais rápida, enquanto que nos objetos não é 1 para 1. Estou correcto?
Abdul
1
@Abdul não torna muito complicado. A CPU possui vários registros, que podem conter diferentes tipos de valores primitivos (por exemplo, um número inteiro de 32 ou 64 bits ou um número de ponto flutuante de precisão simples ou dupla) e a CPU possui instruções implementadas no hardware para executar operações em os valores nos registros. Sua última observação está essencialmente correta.
Jesper
9

Um primitivo é um tipo de dados básico que não é criado a partir de outros tipos de dados. Ele pode representar apenas um valor único. Todos os primitivos são tipos de dados internos por necessidade (o compilador precisa saber sobre eles), mas nem todos os tipos de dados internos são primitivos.

Em algumas linguagens, o compilador possui conhecimento interno de certos tipos criados a partir de outras coisas, porque precisa ser capaz de tratá-los de uma maneira especial. Os exemplos seriam a Variante no Delphi e Visual Basic (e o equivalente da Boo, "Duck") e a classe de objeto base na maioria das linguagens OO.

Mason Wheeler
fonte
Obrigado :) Sua resposta é muito informativa, mas não consigo entender claramente. Você pode dar alguns exemplos (provavelmente com C / C ++ / Java).
Jsp99
@Mason Wheeler É aqui que usamos o termo tipagem solta e tipagem forte. Como já ouvi pessoas dizendo que o VB é uma linguagem pouco digitada, enquanto o Java é fortemente tipado. Por favor confirme.
Maxood
3
O @Appy C ++ é fornecido com classes para strings, vetores e mapas. Eles são integrados, eles vêm com a linguagem, estão na definição da linguagem, etc. No entanto, eles são escritos em C ++, eles vêm da biblioteca padrão. Você pode escrever o seu próprio que se comporta de forma idêntica. Compare isso com um int ou um char. Você não pode definir seu próprio caractere em C ++. Você pode sobrecarregar todos os operadores de uma classe e obter algo que se comporte de maneira semelhante, mas não idêntica. Isto é um primitivo. Basicamente, algo definido em um idioma que não é implementável nesse idioma.
stonemetal
5

Por que o tipo "string" é considerado um tipo primitivo no SNOBOL4 e não em Java?

Como a Especificação de Linguagem Java especifica muito claramente o que a palavra "primitivo" significa no contexto de Java, e o Java Stringnão está em conformidade com essa especificação, enquanto a Especificação de Linguagem SNOBOL4 define o que "primitivo" significa no contexto das cadeias de caracteres SNOBOL4 e SNOBOL4 está em conformidade com essa especificação.

Não há realmente mais nada a ver. A especificação do respectivo idioma define o que certas palavras significam e algo se encaixa nessa descrição ou não. Por exemplo, a Especificação da linguagem C define o significado da palavra "função" como algo que claramente não é o que a palavra "função" normalmente significa, mas é assim que a palavra é usada na comunidade C.

Jörg W Mittag
fonte
@ Mittag Com base na sua resposta, eu pesquisei algumas frases e me deparei com um link muito bom que quase tira todas as dúvidas sobre esse tópico em particular :).
Jsp99
0

Um tipo de dados 'primitivo' significa que você tem um valor armazenado na memória - esse valor não possui métodos ou estrutura interna. Uma primitiva só pode ser operada por operações externas.

Em Java, primitivas são números (int, long, etc.) e char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Se o seu valor tem estrutura (estou pensando em struts aqui), então não é um primitivo. Se possui métodos (um objeto ou classe), não é um primitivo.

JoshRagem
fonte
2
Primitiva "s C # inttipo de dados faz tem métodos ...
Heinzi
Você poderia dar um exemplo?
21712 JoshRagem
var myString = 3.ToString();(consulte Int32.ToString () ). Observe que intem C # é sinônimo de Int32, ou seja, Int32 é um tipo primitivo (diferente de Java, onde Integeré diferente int). Assim, 3.ToString()em C # não envolve boxe!
21412 Heinzi
Isso é muito interessante; o link que você forneceu indica que 'int' é realmente um objeto da classe 'Int32' (ou talvez uma combinação da classe primitiva e da wrapper); portanto, pela definição que coloquei: 'int' não é uma primitiva. :)
JoshRagem 14/03
1
@ Barlop: Java não é descendente de C ++. Se Herbert Schildt não consegue nem esclarecer um fato tão simples, também não tenho certeza se confiaria no resto do livro. Patrick Naughton, designer original de Java, era um grande fã de Objective-C. Na verdade, ele já havia avisado para trabalhar no Objective-C na NeXT, quando Scott McNealy o convenceu a ficar na Sun e projetar um novo idioma. James Gosling, o outro designer original, estava muito familiarizado com Smalltalk (ancestral direto do Objective-C) e Lisp (inspiração para Smalltalk). Mais tarde, vários membros da equipe de design do Objective-C foram para a Sun.
Jörg W Mittag
0

Encontrei algumas informações e achei que isso ajudaria as outras respostas. Então, quero compartilhá-lo -

A Wikipedia diz -

Na ciência da computação, o tipo de dados primitivo é um dos seguintes:

Um tipo básico é um tipo de dados fornecido por uma linguagem de programação como um componente básico. A maioria dos idiomas permite que tipos compostos mais complicados sejam construídos recursivamente a partir de tipos básicos.
Um tipo interno é um tipo de dados para o qual a linguagem de programação fornece suporte interno.

Na maioria das linguagens de programação, todos os tipos de dados básicos são incorporados. Além disso, muitas linguagens também fornecem um conjunto de tipos de dados compostos (tipo "string" em Java).

Eu gostaria de dizer dessa maneira -
Um tipo de dados básico é um tipo de dados que não pode ser mais dividido (o tipo "string" pode ser criado a partir de "char", mas o char não pode ser 'dividido' em qualquer tipo de dados (na maioria das vezes em Programação idiomas). Portanto, é um tipo de dados básico)

O tipo de string, no SNOBOL4, é considerado primitivo. Embora eu não saiba exatamente o motivo. É básico e embutido no SNOBOL4.

A especificação Java menciona claramente a lista de tipos de dados que considera ser do tipo primitivo. Como o tipo de sequência não está em suas especificações , não é um tipo de dados primitivo em Java, apesar de ser um tipo interno.

jsp99
fonte
-2

Primitivas são tipos de dados fundamentais fornecidos pelo próprio idioma. Exemplos na linguagem C são tipos de dados int, float, char. É fornecido como parte fundamental da linguagem.

Não primitivos são variáveis ​​ou objetos definidos pelo usuário. Por exemplo, você pode definir um objeto que armazena dados ou pode usar struct em C para definir suas próprias variáveis. Estes não são primitivos porque você tinha que defini-los primeiro para usá-los.

Exemplos: Empregado, Estudante, um_multiplicador_de_verdadeiro_de_definição

Edite com mais explicações e abordando o comentário que eu considero primitivo como variáveis ​​que vieram originalmente com a linguagem e não variáveis ​​como String em C ++, que você deve declarar usando a palavra-chave New. Isso o torna um objeto para que uma String não seja uma primitiva.

Responda ao seu comentário: Provavelmente tem a ver com a implementação da variável. Se fazia parte do núcleo da linguagem, é primitivo. Se não, não é. Exemplo é String em C ++. Esta não é uma variável principal e é declarada usando Nova palavra-chave. Portanto, não é primitivo.

Noname
fonte
Obrigado pela resposta. A classificação de um tipo de dados como "primitivo" depende da implementação? Como no C / C ++, armazenamos as strings como matrizes de caracteres. Mas precisamos defini-las explicitamente. Portanto, se alguma outra linguagem tiver a mesma implementação para armazenar uma string, mas a fornecer implicitamente, o tipo de dados "string" será primitivo nessa linguagem específica?
jsp99
@ Appy - possivelmente. C não fornece um stringtipo de dados como tal; strings são representadas como agregados do tipo primitivo char. O C ++ introduziu um stringtipo de dados adequado , mas se é ou não um tipo "primitivo" depende de quem você pergunta. Pessoalmente, eu não o classificaria como tal. No entanto, eu classificaria um tipo de string BASIC da velha escola como um tipo primitivo, por razões que provavelmente são completamente arbitrárias.
John Bode
Endereçou seu comentário na própria pergunta. Por favor, veja editar.
Noname
2
strings em C ++ não precisam ser criadas com o novo
jk.
@jk Eu estava fora de contato com C ++. Você está certo. Irá corrigir o ans.
Noname
-2

Para entender melhor o conceito de tipos primitivos e tipos de dados definidos pelo usuário, tudo o que falta às outras respostas é o conceito compiler.

Se você entender o conceito de lexemes sendo selecionados como tokens , saberá que as primitivas são os únicos tipos de dados que um compilador conhece por si só.

Amit
fonte