Skalar vs. primitiver Datentyp - sind sie dasselbe?

127

In verschiedenen Artikeln, die ich gelesen habe, gibt es manchmal Verweise auf primitive Datentypen und manchmal Verweise auf Skalare.

Mein Verständnis von jedem ist, dass es sich um Datentypen von etwas Einfachem wie int, boolean, char usw. handelt.

Fehlt mir etwas, das bedeutet, dass Sie eine bestimmte Terminologie verwenden sollten, oder sind die Begriffe einfach austauschbar? Die Wikipedia-Seiten für jede zeigen nichts Offensichtliches.

Wenn die Begriffe einfach austauschbar sind, welche sind die bevorzugten?

Ben Pearson
quelle

Antworten:

203

Ich glaube nicht, dass sie austauschbar sind. Sie sind häufig ähnlich, aber der Unterschied besteht und scheint hauptsächlich darin zu liegen, was ihnen gegenübergestellt wird und was im Kontext relevant ist.

Skalare werden normalerweise mit Verbindungen wie Arrays, Maps, Mengen, Strukturen usw. verglichen. Ein Skalar ist ein "einzelner" Wert - Ganzzahl, Boolescher Wert, möglicherweise eine Zeichenfolge -, während eine Verbindung aus mehreren Skalaren (und möglicherweise Verweisen auf) besteht andere Verbindungen). "Skalar" wird in Kontexten verwendet, in denen die relevante Unterscheidung zwischen einzelnen / einfachen / atomaren Werten und zusammengesetzten Werten besteht.

Primitive Typen werden jedoch beispielsweise Referenztypen gegenübergestellt und verwendet, wenn die relevante Unterscheidung "Ist dies direkt ein Wert oder ist es eine Referenz auf etwas, das den realen Wert enthält?" Lautet, wie bei den primitiven Typen von Java im Vergleich zu Referenzen . Ich sehe dies als eine etwas niedrigere Unterscheidung als Skalar / Verbindung, aber nicht ganz.

Es hängt wirklich vom Kontext ab (und häufig davon, welche Sprachfamilie diskutiert wird). Um ein möglicherweise pathologisches Beispiel zu nennen: Zeichenfolgen. In C ist eine Zeichenfolge eine Verbindung (ein Array von Zeichen), während in Perl eine Zeichenfolge ein Skalar ist. In Java ist eine Zeichenfolge ein Objekt (oder ein Referenztyp). In Python ist alles (konzeptionell) ein Objekt- / Referenztyp, einschließlich Zeichenfolgen (und Zahlen).

Michael Ekstrand
quelle
1
Bei einer Diskussion von Referenztypen und primitiven Typen sind auch "Wert" -Typen zu berücksichtigen. Die Äquivalenz von Skalaren und Primitiven hängt von der Sprache ab. Laut dem PHP-Handbuch sind zum Beispiel nur die Hälfte der primitiven Typen Skalare: php.net/manual/en/language.types.intro.php
Joe Bowbeer
11
Das hat mir 8 Jahre später geholfen :)
CoderXYZ
18

Es gibt viel Verwirrung und Missbrauch dieser Begriffe. Oft wird eins verwendet, um ein anderes zu bedeuten. Hier ist, was diese Begriffe tatsächlich bedeuten.

"Native" bezieht sich auf Typen, die in die Sprache integriert sind, anstatt von einer Bibliothek (sogar einer Standardbibliothek) bereitgestellt zu werden, unabhängig davon, wie sie implementiert sind. Perl-Strings sind Teil der Perl-Sprache, daher sind sie in Perl nativ. C bietet eine Zeichenfolgensemantik über Zeiger auf Zeichen unter Verwendung einer Bibliothek, sodass der Zeiger auf Zeichen nativ ist, Zeichenfolgen jedoch nicht.

"Atomic" bezieht sich auf einen Typ, der nicht mehr zerlegt werden kann. Es ist das Gegenteil von "Composite" . Verbundwerkstoffe können in eine Kombination von Atomwerten oder anderen Verbundwerkstoffen zerlegt werden. Native Ganzzahlen und Gleitkommazahlen sind atomar. Brüche, komplexe Zahlen, Container / Sammlungen und Zeichenfolgen sind zusammengesetzt.

"Skalar" - und dies ist derjenige, der die meisten Menschen verwirrt - bezieht sich auf Werte, die Skalierung (daher der Name) ausdrücken können, wie Größe, Volumen, Anzahl usw. Ganzzahlen, Gleitkommazahlen und Brüche sind Skalare. Komplexe Zahlen, Boolesche Werte und Zeichenfolgen sind KEINE Skalare. Etwas, das atomar ist, ist nicht unbedingt skalar und etwas, das skalar ist, ist nicht unbedingt atomar. Skalare können nativ sein oder von Bibliotheken bereitgestellt werden.

Einige Typen haben ungerade Klassifikationen. BigNumber-Typen, die normalerweise als Array von Ziffern oder Ganzzahlen implementiert werden, sind Skalare, aber technisch gesehen nicht atomar. Sie können atomar erscheinen, wenn die Implementierung ausgeblendet ist und Sie nicht auf die internen Komponenten zugreifen können. Aber die Komponenten sind nur verborgen, so dass die Atomizität eine Illusion ist. Sie werden fast immer in Bibliotheken bereitgestellt, sind also nicht einheimisch, könnten es aber sein. In der Programmiersprache Mathematica sind beispielsweise große Zahlen nativ, und da ein Mathematica-Programm sie nicht in ihre Bausteine ​​zerlegen kann, sind sie in diesem Zusammenhang auch atomar, obwohl sie unter dem zusammengesetzt sind Cover (wo Sie nicht mehr in der Welt der Mathematica-Sprache sind).

Diese Definitionen sind unabhängig von der verwendeten Sprache.

Claudio Puviani
quelle
16
Obwohl diese Definition eines Skalartyps für mich am sinnvollsten ist, scheint dies nicht die am häufigsten akzeptierte zu sein.
Lleaff
1
Vielen Dank für eine klare Definition von 'Scalar'. Auch wenn @lleaff darauf hinweist, dass die meisten Leute es nicht in diesem speziellen Sinne verwenden, wäre es besser, wenn sie es tun würden.
Uhrwerk
Hervorragende sprachliche Definitionen. Diese Antwort sollte zusammen mit der Antwort von Michael Ekstrand für eine ausführlichere Diskussion gelesen werden. Im Kontext von Programmiersprachen hat Skalar leider unterschiedliche Bedeutungen.
Jerry
9

Einfach ausgedrückt scheint sich ein "Skalartyp" auf ein einzelnes Element zu beziehen, im Gegensatz zu einem Verbund oder einer Sammlung. Skalare enthalten also sowohl primitive Werte als auch Dinge wie einen Aufzählungswert.

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

Vielleicht ist der Begriff "Skalar" ein Rückfall auf C:

Dabei sind Skalare primitive Objekte, die einen einzelnen Wert enthalten und nicht aus anderen C ++ - Objekten bestehen

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

Ich bin gespannt, ob sich dies darauf bezieht, ob diese Elemente den Wert "Skalierung" haben. - Wie das Zählen von Zahlen.

Scott Langeberg
quelle
2
Mir wurde (vor sehr langer Zeit in der Schule) beigebracht, dass der Begriff im Gegensatz zu einem "Vektorprozessor" vom "Skalarprozessor" abgeleitet wurde. Ein Skalarprozessor ist eine CPU, die jeweils nur ein Datenelement verarbeiten kann. Diese Prozessoren wurden / werden nach den arithmetischen Begriffen benannt. Interessanterweise werden Sie beim Nachschlagen von "Skalar" in Wikipedia zu "Variable" umgeleitet.
Evert
2

Ich mag die Antwort von Scott Langeberg, weil sie präzise ist und durch maßgebliche Links gestützt wird. Ich würde Scotts Antwort hochstimmen, wenn ich könnte.

Ich nehme an, dass der "primitive" Datentyp als primärer Datentyp betrachtet werden könnte, so dass sekundäre Datentypen von primären Datentypen abgeleitet werden. Die Ableitung erfolgt durch Kombinieren, beispielsweise durch eine C ++ - Struktur. Eine Struktur kann verwendet werden, um Datentypen (wie z. B. und int und ein Zeichen) zu kombinieren, um einen sekundären Datentyp zu erhalten. Der strukturdefinierte Datentyp ist immer ein sekundärer Datentyp. Primäre Datentypen werden nicht von irgendetwas abgeleitet, sondern sind in der Programmiersprache gegeben.

Ich habe eine Parallele zum Primitiven als Nomenklatur, was primär bedeutet. Diese Parallele ist "regulärer Ausdruck". Ich denke, die Nomenklatur "regelmäßig" kann als "regulierend" verstanden werden. Sie haben also einen Ausdruck, der die Suche reguliert.

Skalare Etymologie ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none) ) bedeutet leiterartig. Ich denke, dies hängt mit der Programmierung zusammen, dass eine Leiter nur eine Dimension hat: Wie viele Sprossen vom Ende der Leiter. Ein skalarer Datentyp hat nur eine Dimension und wird somit durch einen einzelnen Wert dargestellt.

Ich denke, im Gebrauch sind primitiv und skalar austauschbar. Gibt es ein Beispiel für ein Primitiv, das nicht skalar ist, oder für einen Skalar, der nicht primitiv ist?

Obwohl austauschbar, bezieht sich das Grundelement darauf, dass der Datentyp ein Grundbaustein anderer Datentypen ist, und ein Grundelement besteht nicht aus anderen Datentypen.

Skalar bezieht sich auf einen einzelnen Wert. Skalar kontrastiert mit dem mathematischen Vektor. Ein Vektor wird nicht durch einen einzelnen Wert dargestellt, da (am Beispiel einer Vektortyp) ein Wert zur Darstellung der Vektorrichtung und ein anderer Wert zur Darstellung der Vektorgröße benötigt wird.

Referenzlinks: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type

Indinfer
quelle
0

In C bilden Aufzählungstypen, Zeichen und die verschiedenen Darstellungen von Ganzzahlen eine allgemeinere Typklasse, die als Skalartypen bezeichnet wird. Daher sind die Operationen, die Sie für Werte eines beliebigen Skalartyps ausführen können, dieselben wie für Ganzzahlen.

Onkell Wang
quelle
0

Der Null-Typ ist das einzige, was der Definition eines "Skalartyps" am realistischsten entspricht. Sogar die Serialisierung von 'None' als 'N.' Das Einpassen in ein traditionell skalares 16-Bit-Wort - oder sogar in ein einzelnes Bit mit mehreren möglichen Werten - ist kein "einzelnes Daten".

Kommentator
quelle