Cosa si intende per tipo di dati primitivo?


42

La mia comprensione di un tipo di dati primitivo è quella

È un tipo di dati fornito implicitamente da una lingua (altri sono classi definite dall'utente)

Quindi diverse lingue hanno diversi insiemi di tipi di dati che sono considerati primitivi per quella particolare lingua. È giusto?

E qual è la differenza tra un "tipo di dati di base" e un "tipo di dati integrato". Wikipedia afferma che un tipo di dati primitivo è uno dei due.

PS - Perché il tipo "stringa" è considerato un tipo primitivo in SNOBOL4 e non in Java?

Risposte:


34

In un certo senso dipende dalla lingua.

Ad esempio, in linguaggi come C e C ++, si dispone di un certo numero di tipi predefiniti scalari - int, float, double, char, ecc Questi sono "primitiva", nel senso che essi non possono essere scomposti in componenti più semplici. Da questi tipi di base è possibile definire nuovi tipi: tipi di puntatore, tipi di matrice, tipi di struttura, tipi di unione, ecc.

Quindi hai una lingua come la vecchia scuola Lisp, in cui tutto è un atomo o un elenco . Ancora una volta, secondo la definizione di cui sopra, un atomo è "primitivo", nel senso che non può essere scomposto in qualcosa di più semplice.

modificare

Per quanto mi riguarda, i termini "primitivo", "base" e "incorporato" sono praticamente intercambiabili. Se vuoi diventare veramente pedante, tuttavia, puoi distinguere tra tipi "incorporati" (quelli esplicitamente forniti dalla definizione della lingua) e tipi derivati ​​dai tipi incorporati che sono ancora "primitivi" o "di base" in quanto non possono essere scomposti in elementi più semplici. C ditypedefLa funzione consente di creare nuovi nomi di tipi per tipi esistenti. Ada ti consente di creare nuovi tipi scalari con vincoli. Ad esempio, è possibile derivare un tipo di latitudine dal tipo mobile incorporato, con il vincolo che non può assumere valori al di fuori dell'intervallo [-90,0, 90,0]. È ancora un tipo primitivo o di base in quanto non può essere suddiviso in nessun componente più semplice, ma poiché è definito dall'utente, non è considerato un tipo "incorporato".

Ancora una volta, questi concetti sono un po 'sfocati e dipendono davvero dal contesto. Ad esempio, la nozione di un tipo "incorporato" non ha senso per un linguaggio non tipizzato come BLISS.


qual è la differenza tra tipi di dati di base e integrati?
jsp99,

1
"String" è un tipo di dati primitivo in Java ?? (Ho visto il commento di Delnan alla risposta di Jesper). Voglio conoscere la tua opinione, perché in uno dei tuoi commenti hai detto "se il tipo primitivo dipende da chi chiedi".
jsp99,

@Appy - vedi modifica.
John Bode,

3
@Appy String in Java non è primitivo perché è un tipo composto. Se guardi il codice sorgente della classe String (src.zip nella cartella JDK) vedrai che quella stringa interna è rappresentata da una matrice di caratteri. Quindi puoi scomporre String in singoli caratteri. Non è possibile scomporre il carattere in valori più piccoli, il che rende charun tipo primitivo e Stringun tipo composto.
Jacek Prucia,

2
@Appy Ti manca il punto. Le stringhe SNOBOL4 non possono essere scomposte. Le stringhe Java possono. Questa è la differenza. Entrambi sono integrati ma solo le stringhe SNOBOL4 sono primitive.
Rig

19

Dal punto di vista Java :

In Java esiste una chiara distinzione tra tipi primitivi e non primitivi.

Una variabile di un tipo primitivo contiene direttamente il valore di quel tipo (in altre parole, sono tipi di valore ).

Una variabile di tipo non primitivo non contiene direttamente il valore; invece, è un riferimento (simile a un puntatore) a un oggetto. (In Java non è possibile creare tipi di valore definiti dall'utente).

Java ha otto tipi primitivi: byte, short, int, long, char, boolean, floate double. Qualsiasi altra cosa è di tipo non primitivo.


Quindi il tipo di dati String non è primitivo in Java. In ogni programma Java main () scriviamo "public static void main (String args [])". Perché? Perché dobbiamo sempre passare un argomento String in main? Inoltre non abbiamo mai bisogno di importare il tipo String in Java nel modo in cui lo includiamo in C / C ++ (es. #Include <string> o usando std :: string). Spiega per favore.
Maxood

7
@Maxood String ha avere uno status speciale nella lingua (si arriva letterali, è nella firma di main, c'è internato che presumo è esplicitamente consentito dal JLS, è disponibile automagicamente, ecc), ma non è un primitivo tipo di dati. Si potrebbe chiamarlo incorporato .

@Jesper Perché i tipi primitivi sono più veloci con cui lavorare? Semplicemente per il fatto che non hanno gli involucri extra-primitivi? Sto cercando di capire la differenza tra primitivi e non primitivi ... come sono i primitivi integrati nella CPU o qualcosa del genere?
Abdul,

Da Wikipedia: "A seconda della lingua e della sua implementazione, i tipi di dati primitivi possono o meno avere una corrispondenza uno a uno con gli oggetti nella memoria del computer. Tuttavia, ci si aspetta di solito che le operazioni sui tipi di dati di base primitivi siano la lingua più veloce ci sono costrutti ". --- Quindi questa corrispondenza 1 a 1 è la causa principale della sua velocità, mentre con gli oggetti non è 1 a 1. Ho ragione?
Abdul,

1
@Abdul non lo rende troppo complicato. La CPU ha un numero di registri, che può contenere diversi tipi di valori primitivi (ad esempio un numero intero a 32 bit o 64 bit o un numero in virgola mobile a precisione singola o doppia) e la CPU dispone di istruzioni implementate nell'hardware per eseguire operazioni su i valori nei registri. La tua ultima osservazione è sostanzialmente corretta.
Jesper,

9

Una primitiva è un tipo di dati di base che non è costruito con altri tipi di dati. Può rappresentare solo un singolo valore. Tutti i primitivi sono tipi di dati incorporati per necessità (il compilatore deve conoscerli), ma non tutti i tipi di dati incorporati sono primitivi.

In alcune lingue, il compilatore ha una conoscenza integrata di determinati tipi che sono costruiti da altre cose, perché deve essere in grado di trattarli in un modo speciale. Esempi potrebbero essere la variante in Delphi e Visual Basic (e l'equivalente Boo, "Duck") e la classe di oggetti base nella maggior parte dei linguaggi OO.


Grazie :) La tua risposta è molto istruttiva, ma non riesco a capire chiaramente. Puoi dare alcuni esempi (probabilmente con C / C ++ / Java).
jsp99,

@Mason Wheeler Questo è dove usiamo il termine digitazione libera e tipizzazione forte. Come ho sentito la gente dire che VB è un linguaggio liberamente tipizzato mentre Java è fortemente tipizzato. Si prega di confermare
Maxood

3
@Appy C ++ viene fornito con classi per stringhe, vettori e mappe. Questi sono integrati nella lingua, nella definizione della lingua ecc. Tuttavia sono scritti in C ++ e provengono dalla libreria standard. Potresti scrivere il tuo che si comporta in modo identico. Confronta questo con un int o un carattere. Non puoi definire il tuo carattere in C ++. Potresti sovraccaricare tutti gli operatori di una classe e ottenere qualcosa che si comporta in modo simile ma non identico. Questa è una primitiva. Fondamentalmente qualcosa di definito in una lingua che non è implementabile in quella lingua.
scalpellino

5

Perché il tipo "stringa" è considerato un tipo primitivo in SNOBOL4 e non in Java?

Poiché la specifica del linguaggio Java specifica molto chiaramente cosa significa la parola "primitiva" nel contesto di Java e Java Stringnon è conforme a questa specifica, mentre la specifica del linguaggio SNOBOL4 definisce cosa significa "primitiva" nel contesto della stringa SNOBOL4 e SNOBOL4 è conforme a tale specifica.

Non c'è davvero altro. La specifica della rispettiva lingua definisce cosa significano certe parole e qualcosa o si adatta a quella descrizione o no. Ad esempio, il linguaggio C Specification definisce il significato della "funzione" parola di essere qualcosa che è molto chiaramente non è quello che la parola "funzione" di solito significa, ma questo è il modo in cui la parola è usata all'interno della comunità C.


@Mittag Sulla base della tua risposta, ho cercato su google alcune frasi e mi sono imbattuto in un collegamento molto carino che cancella quasi tutti i dubbi su questo particolare argomento :).
jsp99,

0

Un tipo di dati "primitivo" significa che hai un valore archiviato in memoria - questo valore non ha metodi o struttura interna. Una primitiva può essere gestita solo da operazioni esterne.

In Java, le primitive sono numeri (int, long, ecc.) E char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Se il tuo valore ha una struttura (sto pensando ai montanti qui) allora non è un primitivo. Se ha metodi (un oggetto o una classe) non è una primitiva.


2
Primitivo C # 's inttipo di dati ha disporre di metodi ...
Heinzi

Potresti fare un esempio?
JoshRagem,

var myString = 3.ToString();(vedi Int32.ToString () ). Si noti che intin C # è sinonimo di Int32, cioè, Int32 è un tipo primitivo (a differenza di Java, dove Integerè diverso da int). Pertanto, 3.ToString()in C # non comporta la boxe!
Heinzi,

È molto interessante; il collegamento fornito indica che "int" è in realtà un oggetto della classe "Int32" (o forse una combinazione della classe primitiva e una classe wrapper), quindi per definizione ho inserito: "int" non è una primitiva. :)
JoshRagem

1
@barlop: Java non discende dal C ++. Se Herbert Schildt non riuscisse nemmeno a chiarire un fatto così semplice, non sono sicuro che mi fiderei del resto del libro. Patrick Naughton, designer originale di Java, era un grande fan di Objective-C. In effetti, aveva già notificato di lavorare su Objective-C alla NeXT, quando Scott McNealy lo convinse a rimanere al Sun e progettare un nuovo linguaggio. James Gosling, l'altro designer originale, conosceva molto bene Smalltalk (antenato diretto di Objective-C) e Lisp (ispirazione per Smalltalk). Successivamente, diversi membri del team di progettazione di Objective-C si trasferirono a Sun.
Jörg W Mittag,

0

Ho trovato alcune informazioni e ho pensato che avrebbe aiutato le altre risposte. Quindi voglio condividerlo -

Wikipedia dice -

In informatica, il tipo di dati primitivo è uno dei seguenti:

Un tipo di base è un tipo di dati fornito da un linguaggio di programmazione come blocco base. La maggior parte delle lingue consente la costruzione ricorsiva di tipi compositi più complicati a partire da tipi di base.
Un tipo incorporato è un tipo di dati per il quale il linguaggio di programmazione fornisce supporto integrato.

Nella maggior parte dei linguaggi di programmazione, tutti i tipi di dati di base sono integrati. Inoltre, molte lingue forniscono anche una serie di tipi di dati compositi (tipo "stringa" in Java).

Vorrei dirlo in questo modo -
Un tipo di dati di base è un tipo di dati che non può essere ulteriormente suddiviso (il tipo "stringa" può essere creato da "carattere", ma il carattere non può essere "suddiviso" in alcun tipo di dato (nella maggior parte della programmazione lingue). Quindi è un tipo di dati di base)

Il tipo di stringa, in SNOBOL4 è considerato primitivo. Anche se non conosco il motivo esatto per cui. È sia di base che integrato in SNOBOL4.

Le specifiche Java menzionano chiaramente l'elenco di tipi di dati che considera di tipo primitivo. Poiché il tipo di stringa non è nelle loro specifiche , non è un tipo di dati primitivo in Java, nonostante sia un tipo incorporato.


-2

I primitivi sono tipi di dati fondamentali forniti dalla lingua stessa. Esempio in linguaggio C sono i tipi di dati int, float, char. Viene fornito come parte fondamentale della lingua.

Le non primitive sono variabili o oggetti definiti dall'utente. Ad esempio, puoi definire un oggetto che memorizza i dati oppure puoi usare struct in C per definire le tue variabili. Questi non sono primitivi perché dovevi prima definirli per usarli.

Esempi: dipendente, studente, a_very_large_number_that_you_defined_yourself

Modifica con più spiegazioni e indirizzando il commento Penso alla primitiva come variabili originariamente fornite con il linguaggio e non variabili come String in C ++ che devi dichiarare usando la nuova parola chiave. Questo lo rende un oggetto, quindi una stringa non sarebbe una primitiva.

Rispondi al tuo commento: probabilmente ha a che fare con l'implementazione della variabile. Se faceva parte del nucleo del linguaggio, è primitivo. Altrimenti non lo è. Esempio è String in C ++. Questa non è una variabile principale ed è dichiarata usando Nuova parola chiave. Quindi non è primitivo.


Grazie per la risposta . La classificazione di un tipo di dati come "primitivo" dipende dall'implementazione? Come in C / C ++ archiviamo le stringhe come array di caratteri. Ma dobbiamo definirle esplicitamente. Quindi, se un'altra lingua ha la stessa implementazione per memorizzare una stringa ma la fornisce implicitamente, il tipo di dati "stringa" sarà una primitiva in quella lingua particolare?
jsp99,

@Appy - possibilmente. C non fornisce un stringtipo di dati in quanto tale; le stringhe sono rappresentate come aggregati del tipo primitivo char. Il C ++ ha introdotto un stringtipo di dati adeguato , ma che si tratti o meno di un tipo "primitivo" dipende da chi lo chiedi. Personalmente, non lo classificherei come tale. Tuttavia, classificherei un tipo di stringa BASIC di vecchia scuola come tipo primitivo, per motivi che sono probabilmente completamente arbitrari.
John Bode,

Ha indirizzato il tuo commento alla domanda stessa. Per favore vedi modifica.
Noname,

2
non è necessario creare stringhe in C ++ con new
jk.

@jk Non ero in contatto con C ++. Hai ragione. Risolverà il ans.
Noname,

-2

Per una migliore comprensione del concetto di tipi primitivi e tipi di dati definiti dall'utente, tutto ciò che manca alle altre risposte è il concetto compiler.

Se capisci il concetto di lessici che vengono selezionati come token , scoprirai che le primitive sono gli unici tipi di dati che un compilatore conosce da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.