Tipo di dati scalare e primitivo: sono la stessa cosa?


127

In vari articoli che ho letto, a volte ci sono riferimenti a tipi di dati primitivi e talvolta ci sono riferimenti a scalari.

La mia comprensione di ciascuno è che sono tipi di dati di qualcosa di semplice come int, boolean, char, ecc.

C'è qualcosa che mi manca che significa che dovresti usare una terminologia particolare o i termini sono semplicemente intercambiabili? Le pagine di Wikipedia per ciascuna di esse non mostrano nulla di ovvio.

Se i termini sono semplicemente intercambiabili, qual è quello preferito?

Risposte:


203

Non credo siano intercambiabili. Sono spesso simili, ma la differenza esiste e sembra essere principalmente in ciò con cui sono in contrasto e in ciò che è rilevante nel contesto.

Gli scalari sono tipicamente in contrasto con i composti , come array, mappe, insiemi, strutture, ecc. Uno scalare è un valore "singolo" - intero, booleano, forse una stringa - mentre un composto è costituito da più scalari (e possibilmente riferimenti a altri composti). "Scalare" viene utilizzato in contesti in cui la distinzione rilevante è tra valori singoli / semplici / atomici e valori composti.

I tipi primitivi , tuttavia, sono in contrasto con, ad esempio , i tipi di riferimento e vengono utilizzati quando la distinzione pertinente è "Questo è direttamente un valore o è un riferimento a qualcosa che contiene il valore reale?", Come nei tipi primitivi di Java rispetto ai riferimenti . La vedo come una distinzione di livello leggermente inferiore rispetto a scalare / composto, ma non del tutto.

Dipende davvero dal contesto (e spesso di quale famiglia linguistica si discute). Per fare un esempio, forse patologico, gli archi. In C, una stringa è un composto (un array di caratteri), mentre in Perl, una stringa è uno scalare. In Java, una stringa è un oggetto (o un tipo di riferimento). In Python, tutto è (concettualmente) un tipo di oggetto / riferimento, comprese le stringhe (e i numeri).


1
Anche da considerare in una discussione sui tipi di riferimento e i tipi primitivi sono i tipi "valore". Per quanto riguarda l'equivalenza di scalari e primitive, dipende dalla lingua. Secondo il manuale di PHP, per esempio, solo la metà dei suoi tipi primitivi sono scalari: php.net/manual/en/language.types.intro.php
Joe Bowbeer

11
Questo mi ha aiutato 8 anni dopo :)
CoderXYZ

18

C'è molta confusione e uso improprio di questi termini. Spesso uno è usato per indicare un altro. Ecco cosa significano effettivamente questi termini.

"Native" si riferisce ai tipi che sono incorporati nella lingua, invece di essere forniti da una libreria (anche una libreria standard), indipendentemente da come sono implementati. Le stringhe Perl fanno parte del linguaggio Perl, quindi sono native in Perl. C fornisce la semantica delle stringhe sui puntatori ai caratteri usando una libreria, quindi il puntatore a char è nativo, ma le stringhe no.

"Atomico" si riferisce a un tipo che non può più essere scomposto. È l'opposto di "composito" . I compositi possono essere scomposti in una combinazione di valori atomici o altri compositi. I numeri interi nativi e i numeri in virgola mobile sono atomici. Frazioni, numeri complessi, contenitori / raccolte e stringhe sono composti.

"Scalare" - e questo è quello che confonde la maggior parte delle persone - si riferisce a valori che possono esprimere scala (da cui il nome), come dimensione, volume, conteggi, ecc. I numeri interi, i numeri in virgola mobile e le frazioni sono scalari. I numeri complessi, i valori booleani e le stringhe NON sono scalari. Qualcosa che è atomico non è necessariamente scalare e qualcosa che è scalare non è necessariamente atomico. Gli scalari possono essere nativi o forniti dalle librerie.

Alcuni tipi hanno classificazioni dispari. I tipi BigNumber, solitamente implementati come una matrice di cifre o interi, sono scalari, ma tecnicamente non sono atomici. Possono sembrare atomici se l'implementazione è nascosta e non è possibile accedere ai componenti interni. Ma i componenti sono solo nascosti, quindi l'atomicità è un'illusione. Sono quasi sempre forniti nelle biblioteche, quindi non sono nativi, ma potrebbero esserlo. Nel linguaggio di programmazione Mathematica, ad esempio, i grandi numeri sono nativi e, poiché non c'è modo per un programma Mathematica di scomporli nei loro elementi costitutivi, sono anche atomici in quel contesto, nonostante siano composti sotto il copertine (dove non sei più nel mondo della lingua Mathematica).

Queste definizioni sono indipendenti dalla lingua utilizzata.


16
Sebbene questa definizione di un tipo scalare abbia più senso per me, questa non sembra essere quella più comunemente accettata.
lleaff

1
Grazie per una chiara definizione di "scalare". Anche se, come sottolinea @lleaff, la maggior parte delle persone non lo usa in questo senso specifico, sarebbe meglio se lo facessero.
clockworkpc

Eccellenti definizioni linguistiche. Questa risposta dovrebbe essere letta insieme alla risposta di Michael Ekstrand per una discussione più completa. Nel contesto dei linguaggi di programmazione, scalare ha significati diversi, sfortunatamente.
Jerry

9

In parole povere, sembrerebbe che un tipo "scalare" si riferisca a un singolo elemento, al contrario di un composto o di una raccolta. Quindi gli scalari includono sia valori primitivi che cose come un valore enum.

http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html

Forse il termine 'scalare' potrebbe essere un ritorno al C:

dove gli scalari sono oggetti primitivi che contengono un singolo valore e non sono composti da altri oggetti C ++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

Sono curioso di sapere se questo si riferisce al fatto che questi elementi avrebbero un valore di "scala"? - Come contare i numeri.


2
Mi è stato insegnato (molto tempo fa a scuola) che il termine derivava da "processore scalare" in contrasto con "processore vettoriale". Un processore scalare è una CPU che può gestire solo un dato alla volta. Questi processori erano / prendono il nome dai termini aritmetici. È interessante notare che, quando cerchi "scalare" su wikipedia, vieni reindirizzato a "variabile".
Evert

2

Mi piace la risposta di Scott Langeberg perché è concisa e sostenuta da link autorevoli. Voterei la risposta di Scott se potessi.

Suppongo che il tipo di dati "primitivo" possa essere considerato il tipo di dati primario in modo che i tipi di dati secondari siano derivati ​​dai tipi di dati primari. La derivazione avviene tramite la combinazione, come una struttura C ++. Una struttura può essere utilizzata per combinare tipi di dati (come e int e un carattere) per ottenere un tipo di dati secondario. Il tipo di dati definito dalla struttura è sempre un tipo di dati secondario. I tipi di dati primari non derivano da nulla, piuttosto sono un dato nel linguaggio di programmazione.

Ho un parallelo con primitivo essendo la nomenclatura che significa primario. Quel parallelo è "espressione regolare". Penso che la nomenclatura "regolare" possa essere intesa come "regolamentare". Così hai un'espressione che regola la ricerca.

Etimologia scalare ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) significa simile a una scala. Penso che il modo in cui questo si collega alla programmazione è che una scala ha solo una dimensione: quanti pioli dalla fine della scala. Un tipo di dati scalare ha una sola dimensione, quindi rappresentata da un singolo valore.

Penso che nell'uso, primitivo e scalare siano intercambiabili. C'è qualche esempio di una primitiva che non è scalare o di uno scalare che non è primitivo?

Sebbene intercambiabile, primitiva si riferisce al tipo di dati che è un blocco predefinito di altri tipi di dati e una primitiva non è composta da altri tipi di dati.

Scalare si riferisce al suo avere un singolo valore. Scalare contrasta con il vettore matematico. Un vettore non è rappresentato da un singolo valore perché (usando un tipo di vettore come esempio) è necessario un valore per rappresentare la direzione del vettore e un altro valore necessario per rappresentare la grandezza del vettore.

Link di riferimento: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


0

In C, i tipi di enumerazione, i caratteri e le varie rappresentazioni di interi formano una classe di tipi più generale chiamata tipi scalari. Quindi, le operazioni che puoi eseguire sui valori di qualsiasi tipo scalare sono le stesse di quelle per gli interi.


0

il tipo null è l'unica cosa che più realisticamente si conforma alla definizione di un "tipo scalare". Anche la serializzazione di "Nessuno" come "N." inserirsi in una parola a 16 bit che è tradizionalmente scalare - o anche un singolo bit che ha più valori possibili - non è un "singolo dato".


0

Ogni primitiva è scalare, ma non viceversa. DateTime è scalare, ma non primitivo.

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.