wake-up-neo.net

Skalar vs. primitiver Datentyp - sind sie dasselbe?

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

Ich verstehe jedes von ihnen, dass es sich um Datentypen handelt, die so einfach sind wie int, boolean, char usw.

Gibt es etwas, was ich vermisse, bedeutet, dass Sie eine bestimmte Terminologie verwenden sollten, oder sind die Begriffe einfach austauschbar?.

Wenn die Begriffe einfach austauschbar sind, welche ist die bevorzugte?

96
Ben Pearson

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

Skalare stehen typischerweise im Gegensatz zu Verbindungen wie Arrays, Maps, Mengen, Strukturen usw. Ein Skalar ist ein "einzelner" Wert - Ganzzahl, Boolean, möglicherweise eine Zeichenfolge -, während eine Verbindung hergestellt wird mehrerer Skalare (und möglicherweise Verweise auf andere Verbindungen). "Skalar" wird in Kontexten verwendet, in denen der relevante Unterschied zwischen einfachen/einfachen/atomaren Werten und zusammengesetzten Werten besteht.

Primitive Typen stehen jedoch im Gegensatz zu z.B. Referenztypen und werden verwendet, wenn die relevante Unterscheidung lautet: "Ist dies direkt ein Wert oder ist es ein Verweis auf etwas, das den tatsächlichen Wert enthält?", wie bei den primitiven Typen von Java im Vergleich zu Referenzen. Ich halte dies für einen etwas tieferen Unterschied als Skalar/Verbindung, aber nicht ganz.

Es hängt wirklich vom Kontext ab (und häufig wird über die Sprachfamilie gesprochen). Um ein möglicherweise pathologisches Beispiel zu nennen: Strings. 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 Referenztyp). In Python ist alles (konzeptionell) ein Objekt-/Referenztyp, einschließlich Zeichenfolgen (und Zahlen).

146

Es gibt viel Verwirrung und Missbrauch dieser Begriffe. Oft wird eins verwendet, um ein anderes zu bedeuten. Was bedeuten diese Begriffe eigentlich?.

"Native" bezieht sich auf Typen, die in die Sprache integriert sind, anstatt von einer Bibliothek (sogar einer Standardbibliothek) bereitgestellt zu werden, unabhängig von ihrer Implementierung. Perl-Strings sind Teil der Perl-Sprache und daher in Perl nativ. C stellt Stringsemantik über Zeiger auf Zeichen bereit, die eine Bibliothek verwenden. Der Zeiger auf char ist also native, Strings jedoch nicht.

"Atomic" bezieht sich auf einen Typ, der nicht mehr zerlegt werden kann. Es ist das Gegenteil von "composite". Verbundstoffe können in eine Kombination von Atomwerten oder anderen Verbundstoffen zerlegt werden. Native Ganzzahlen und Fließkommazahlen sind atomar. Brüche, komplexe Zahlen, Container/Sammlungen und Strings sind zusammengesetzt.

"Scalar" - und dies ist derjenige, der die meisten Leute verwirrt - bezieht sich auf Werte, die Skalierung (daher der Name) ausdrücken können, wie Größe, Volumen, Anzahl usw. Ganzzahlen, Fließkommazahlen und Brüche sind Skalare. Komplexe Zahlen, Booleans und Strings sind UND NICHT - Skalare. Etwas, das atomar ist, ist nicht notwendigerweise skalierbar und etwas, das skalar ist, ist nicht notwendigerweise atomar. Skalare können nativ sein oder von Bibliotheken bereitgestellt werden.

Einige Typen haben ungerade Klassifizierungen. BigNumber-Typen, die normalerweise als ein Array von Ziffern oder Ganzzahlen implementiert werden, sind Skalare, aber technisch gesehen nicht atomar. Sie können als atomar erscheinen, wenn die Implementierung verborgen ist und Sie nicht auf die internen Komponenten zugreifen können. Aber die Komponenten sind nur verborgen, daher ist die Atomizität eine Illusion. Sie werden fast ausnahmslos in Bibliotheken bereitgestellt, daher sind sie nicht nativ, aber sie könnten es auch sein. In der Programmiersprache Mathematica beispielsweise sind große Zahlen nativ und da ein Mathematica-Programm keine Möglichkeit hat, sie in ihre Bausteine ​​zu zerlegen, sind sie in diesem Zusammenhang auch atomar, obwohl sie Composites unter der Programmiersprache sind deckt (wo Sie nicht mehr in der Welt der Mathematica-Sprache sind).

Diese Definitionen sind unabhängig von der verwendeten Sprache.

9
Claudio Puviani

Einfach ausgedrückt scheint es, dass sich ein Skalar-Typ auf ein einzelnes Objekt bezieht, im Gegensatz zu einem Verbund oder einer Sammlung. Skalare enthalten also sowohl Grundwerte 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ückschritt für 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 neugierig, ob sich dies darauf bezieht, ob diese Elemente einen Skalierungswert haben würden. - Wie Zahlen zählen.

6
Scott Langeberg

Die Antwort von Scott Langeberg gefällt mir, weil sie prägnant ist und von autoritativen Links unterstützt wird. Wenn ich könnte, würde ich Scott's Antwort aufstimmen.

Ich nehme an, dass der "primitive" Datentyp als primärer Datentyp angesehen werden kann, sodass sekundäre Datentypen von primären Datentypen abgeleitet werden. Die Ableitung erfolgt durch Kombinieren, z. B. einer C++ - Struktur. Eine Struktur kann verwendet werden, um Datentypen (wie und Int und Char) 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 werden in der Programmiersprache angegeben.

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

Skalare Etymologie ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) bedeutet leiterähnlich. Ich denke, das bezieht sich auf das Programmieren so, dass eine Leiter nur eine Dimension hat: Wie viele Sprossen vom Ende der Leiter. Ein Skalardatentyp hat nur eine Dimension und wird daher durch einen einzelnen Wert dargestellt.

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

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

Skalar bezieht sich auf einen einzigen Wert. Skalar kontrastiert mit dem mathematischen Vektor. Ein Vektor wird nicht durch einen einzelnen Wert dargestellt, da (unter Verwendung einer Art von Vektor als Beispiel) ein Wert zur Darstellung der Richtung des Vektors und ein weiterer Wert zur Darstellung der Größe des Vektors benötigt wird. 

Verweislinks: http://whatis.techtarget.com/definition/primitivehttp://en.wikipedia.org/wiki/Primitive_data_type

3
Indinfer

In C bilden Aufzählungstypen, -zeichen und die verschiedenen Ganzzahlendarstellungen eine allgemeinere Typenklasse, die als Skalartypen bezeichnet wird. Daher sind die Operationen, die Sie für Werte eines beliebigen Skalartyps ausführen können, mit denen für Ganzzahlen identisch.

0
Onkell Wang

nULL-Typ ist das einzige, was der Definition eines "Skalartyps" am realistischsten entspricht. Sogar die Serialisierung von 'None' als 'N.' Das Einpassen in ein 16-Bit-Wort, das traditionell skalar ist - oder sogar ein einzelnes Bit, das mehrere mögliche Werte aufweist - ist kein "einzelnes Datenelement".

0
Commenter