Was ist mit einem primitiven Datentyp gemeint?

42

Mein Verständnis eines primitiven Datentyps ist das

Dies ist ein Datentyp, der implizit von einer Sprache bereitgestellt wird (andere sind benutzerdefinierte Klassen).

Unterschiedliche Sprachen haben unterschiedliche Datentypen, die für diese bestimmte Sprache als primitiv gelten. Ist das richtig?

Und was ist der Unterschied zwischen einem "Basisdatentyp" und einem "eingebauten Datentyp"? Wikipedia sagt, ein primitiver Datentyp sei einer der beiden.

PS - Warum wird der Typ "string" in SNOBOL4 als primitiver Typ betrachtet und nicht in Java?

jsp99
quelle

Antworten:

34

Es kommt irgendwie auf die Sprache an.

Zum Beispiel, in Sprachen wie C und C ++, haben Sie eine Reihe von integrierten in skalare Typen - int, float, double, char, etc. Diese „primitive“ in dem Sinne, dass sie nicht in einfachere Komponenten zerlegt werden können. Aus diesen Basistypen können Sie neue Typen definieren - Zeigertypen, Arraytypen, Strukturtypen, Vereinigungstypen usw.

Dann haben Sie eine Sprache wie Lisp der alten Schule, in der alles entweder ein Atom oder eine Liste ist . Wiederum ist nach der obigen Definition ein Atom "primitiv" in dem Sinne, dass es nicht in etwas Einfacheres zerlegt werden kann.

Bearbeiten

Soweit es mich betrifft, sind die Begriffe "primitiv", "grundlegend" und "eingebaut" ziemlich austauschbar. Wenn Sie jedoch wirklich umständlich sein möchten , können Sie zwischen Typen unterscheiden, die "eingebaut" sind (die explizit durch die Sprachdefinition bereitgestellt werden), und Typen, die von den eingebauten Typen abgeleitet sind, die noch "primitiv" oder "einfach" sind. , dass sie nicht in einfachere Elemente zerlegt werden können. C'stypedefMit dieser Funktion können Sie neue Typnamen für vorhandene Typen erstellen. Mit Ada können Sie neue Skalartypen mit Einschränkungen erstellen. Sie können beispielsweise einen Latitude-Typ vom integrierten Floating-Typ ableiten, wobei die Einschränkung gilt, dass Werte außerhalb des Bereichs [-90.0, 90.0] nicht zulässig sind. Es ist immer noch ein primitiver oder grundlegender Typ, da es nicht in einfachere Komponenten zerlegt werden kann. Da es jedoch benutzerdefiniert ist, wird es nicht als "eingebauter" Typ betrachtet.

Auch diese Konzepte sind ein wenig verschwommen, und es kommt wirklich auf den Kontext an. Zum Beispiel ist der Begriff eines "eingebauten" Typs für eine typenlose Sprache wie BLISS bedeutungslos.

John Bode
quelle
Was ist der Unterschied zwischen grundlegenden und eingebauten Datentypen?
jsp99
1
Ist "string" ein primitiver Datentyp in Java? (Ich habe Delnans Kommentar zu Jespers Antwort gesehen.) Ich möchte Ihre Meinung wissen, weil Sie in einem Ihrer Kommentare gesagt haben, "ob der primitive Typ von dem abhängt, den Sie fragen".
jsp99
@Appy - siehe bearbeiten.
John Bode
3
@Appy String in Java ist nicht primitiv, da es sich um einen zusammengesetzten Typ handelt. Wenn Sie sich den Quellcode der String-Klasse (src.zip im JDK-Ordner) ansehen, werden Sie feststellen, dass String intern als Array von Zeichen dargestellt wird. So können Sie String in einzelne Zeichen zerlegen. Sie können Zeichen nicht in kleinere Werte zerlegen, was chareinen primitiven Typ und Stringeinen zusammengesetzten Typ ergibt .
Jacek Prucia
2
@ Appy Sie verpassen den Punkt. SNOBOL4-Strings können nicht zerlegt werden. Java-Strings können. Das ist der Unterschied. Beide sind eingebaut, aber nur SNOBOL4-Strings sind primitiv.
Rig
19

Aus der Java- Perspektive:

In Java gibt es eine sehr klare Unterscheidung zwischen primitiven und nicht-primitiven Typen.

Eine Variable eines primitiven Typs enthält direkt den Wert dieses Typs (mit anderen Worten, es handelt sich um Werttypen ).

Eine Variable eines nicht-primitiven Typs enthält den Wert nicht direkt. Stattdessen handelt es sich um eine Referenz (ähnlich einem Zeiger) auf ein Objekt. (In Java ist es nicht möglich, benutzerdefinierte Werttypen zu erstellen.)

Java hat acht primitive Typen: byte, short, int, long, char, boolean, floatund double. Alles andere ist ein nicht primitiver Typ.

Jesper
quelle
Daher ist der String-Datentyp in Java nicht primitiv. In jedem Java main () Programm schreiben wir "public static void main (String args [])". Warum? Warum müssen wir immer ein String-Argument in main übergeben? Außerdem müssen wir den String-Typ niemals in Java so importieren, wie wir ihn in C / C ++ einbinden (z. B. #include <string> oder mit std :: string). Bitte erkläre.
Maxood
7
@Maxood String hat einen besonderen Status in der Sprache (es bekommt Literale, es ist in der Signatur von main, es gibt Internierungen, von denen ich annehme, dass sie von der JLS explizit erlaubt sind, es ist automatisch verfügbar usw.), aber es ist kein primitiver Datentyp. Man könnte es als eingebaut bezeichnen .
@Jesper Warum lassen sich primitive Typen schneller bearbeiten? Einfach nur, weil sie nicht die zusätzliche Verpackung haben, die Nicht-Primitive tun? Ich versuche den Unterschied zwischen Primitiven und Nicht-Primitiven herauszufinden ... wie sind Primitive in die CPU eingebaut oder so?
Abdul
Aus Wikipedia: "Abhängig von der Sprache und ihrer Implementierung können primitive Datentypen eine Eins-zu-Eins-Entsprechung mit Objekten im Computerspeicher aufweisen oder nicht. Normalerweise erwartet man jedoch, dass Operationen mit grundlegenden primitiven Datentypen die schnellste Sprache sind Konstrukte gibt es. " --- Diese 1-zu-1-Entsprechung ist der Grund dafür, dass sie schneller ist, wohingegen sie bei Objekten nicht 1-zu-1 ist. Hab ich recht?
Abdul
1
@Abdul mach es nicht zu kompliziert. Die CPU verfügt über eine Reihe von Registern, die verschiedene Arten von Grundwerten enthalten können (z. B. eine 32-Bit- oder 64-Bit-Ganzzahl oder eine Gleitkommazahl mit einfacher oder doppelter Genauigkeit), und die CPU verfügt über Anweisungen, die in der Hardware implementiert sind, um Operationen auszuführen die Werte in den Registern. Ihre letzte Bemerkung ist im Wesentlichen richtig.
Jesper
9

Ein Grundelement ist ein Basisdatentyp, der nicht aus anderen Datentypen aufgebaut ist. Es kann nur ein einziger Wert dargestellt werden. Alle Grundelemente sind notwendigerweise eingebaute Datentypen (der Compiler muss sie kennen), aber nicht alle eingebauten Datentypen sind Grundelemente.

In einigen Sprachen verfügt der Compiler über integriertes Wissen über bestimmte Typen, die aus anderen Dingen aufgebaut sind, da sie auf besondere Weise behandelt werden müssen. Beispiele wären die Variante in Delphi und Visual Basic (und das Boo-Äquivalent "Duck") und die Basisobjektklasse in den meisten OO-Sprachen.

Mason Wheeler
quelle
Danke :) Ihre Antwort ist sehr informativ, aber ich kann nicht klar verstehen. CAn Sie einige Beispiele geben (wahrscheinlich mit C / C ++ / Java).
jsp99
@Mason Wheeler Hier wird der Begriff „loses Tippen“ und „starkes Tippen“ verwendet. Wie ich gehört habe, sagen Leute, dass VB eine lose typisierte Sprache ist, während Java eine stark typisierte Sprache ist. Bitte bestätigen.
Maxood
3
@Appy C ++ wird mit Klassen für Zeichenfolgen, Vektoren und Maps ausgeliefert. Diese sind in die Sprache integriert, befinden sich in der Sprachdefinition usw. Sie sind jedoch in C ++ geschrieben und stammen aus der Standardbibliothek. Sie könnten Ihre eigenen schreiben, die sich identisch verhalten. Vergleichen Sie dies mit einem int oder einem char. Sie können in C ++ kein eigenes Zeichen definieren. Sie könnten jeden Operator in einer Klasse überladen und etwas erhalten, das sich ähnlich, aber nicht identisch verhält. Dies ist ein Primitiv. Grundsätzlich etwas, das in einer Sprache definiert ist, die in dieser Sprache nicht implementiert werden kann.
Stonemetal
5

Warum wird der Typ "string" in SNOBOL4 und nicht in Java als primitiver Typ betrachtet?

Weil die Java-Sprachspezifikation sehr klar spezifiziert, was das Wort "primitiv" im Kontext von Java bedeutet, und Java Stringdieser Spezifikation nicht entspricht, während die SNOBOL4-Sprachspezifikation definiert, was "primitiv" im Kontext von SNOBOL4 und der SNOBOL4-Zeichenfolge bedeutet entspricht dieser Spezifikation.

Da ist wirklich nichts mehr dran. Die Angabe der jeweiligen Sprache definiert, was bestimmte Wörter bedeuten und was entweder zu dieser Beschreibung passt oder nicht. Zum Beispiel definiert die C-Sprachspezifikation die Bedeutung des Wortes "Funktion" als etwas, was ganz klar nicht das ist, was das Wort "Funktion" normalerweise bedeutet, aber so wird das Wort in der C-Community verwendet.

Jörg W. Mittag
quelle
@Mittag Basierend auf Ihrer Antwort habe ich einige Sätze gegoogelt und bin auf einen sehr schönen Link gestoßen, der fast alle Zweifel an diesem bestimmten Thema beseitigt :).
jsp99
0

Ein "primitiver" Datentyp bedeutet, dass Sie einen Wert im Speicher haben - dieser Wert hat keine Methoden oder interne Struktur. Ein Primitiv kann nur durch externe Operationen bearbeitet werden.

In Java sind Primitive Zahlen (int, long usw.) und char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Wenn Ihr Wert eine Struktur hat (ich denke hier an Verstrebungen), dann ist es kein Primitiv. Wenn es Methoden (ein Objekt oder eine Klasse) hat, ist es kein Primitiv.

JoshRagem
quelle
2
C # 's primitiven intDatentyp hat Methoden ...
Heinzi
Könnten Sie ein Beispiel geben?
JoshRagem
var myString = 3.ToString();(Siehe Int32.ToString () ). Beachten Sie, dass intin C # ist ein Synonym für Int32, das heißt, Int32 ist ein primitiver Typ ( im Gegensatz zu Java, wo Integerverschieden ist int). Also, 3.ToString()in C # geht es nicht um Boxen!
Heinzi
Das ist sehr interessant; Der Link, den Sie angegeben haben, zeigt an, dass 'int' wirklich ein Objekt der Klasse 'Int32' ist (oder vielleicht eine Kombination aus dem Primitiven und einer Wrapper-Klasse), also ist 'int' nach meiner Definition kein Primitiv. :)
JoshRagem
1
@barlop: Java stammt nicht von C ++ ab. Wenn Herbert Schildt eine so einfache Tatsache nicht einmal klarstellen kann, bin ich mir nicht sicher, ob ich dem Rest des Buches vertrauen würde. Patrick Naughton, ursprünglicher Java-Designer, war ein großer Objective-C-Fan. Tatsächlich hatte er bereits angekündigt, bei NeXT an Objective-C zu arbeiten, als Scott McNealy ihn überzeugte, bei Sun zu bleiben und eine neue Sprache zu entwerfen. James Gosling, der andere ursprüngliche Designer, war mit Smalltalk (direkter Vorfahr von Objective-C) und Lisp (Inspiration für Smalltalk) sehr vertraut. Später wechselten mehrere Mitglieder des Objective-C-Designteams zu Sun.
Jörg W Mittag
0

Ich bin auf einige Informationen gestoßen und hatte das Gefühl, dass sie die anderen Antworten unterstützen würden. Also willst du es teilen -

Wikipedia sagt -

In der Informatik ist der primitive Datentyp einer der folgenden:

Ein Basistyp ist ein Datentyp, der von einer Programmiersprache als Grundbaustein bereitgestellt wird. In den meisten Sprachen können kompliziertere zusammengesetzte Typen ausgehend von Basistypen rekursiv konstruiert werden.
Ein integrierter Typ ein Datentyp ist , für die der Programmiersprache träger eingebaut liefert.

In den meisten Programmiersprachen sind alle grundlegenden Datentypen integriert. Darüber hinaus bieten viele Sprachen eine Reihe von zusammengesetzten Datentypen ("String" -Typ in Java).

Ich möchte es so sagen -
Ein Basisdatentyp ist ein Datentyp, der nicht weiter unterteilt werden kann ("string" -Typ kann aus "char" gebildet werden, char kann jedoch nicht in einen beliebigen Datentyp "unterteilt" werden (In den meisten Programmen) sprachen). Also es ist grundlegende datentyp)

Der String-Typ in SNOBOL4 wird als primitiv betrachtet. Der genaue Grund dafür ist mir jedoch nicht bekannt. Es ist sowohl einfach als auch in SNOBOL4 integriert.

Die Java-Spezifikation erwähnt deutlich die Liste der Datentypen, die sie als primitiven Typ betrachtet. Da der Zeichenfolgentyp nicht in der Spezifikation enthalten ist , ist er in Java kein primitiver Datentyp, obwohl er ein integrierter Typ ist.

jsp99
quelle
-2

Primitive sind grundlegende Datentypen, die von der Sprache selbst bereitgestellt werden. Beispiele in C-Sprache sind die Datentypen int, float und char. Es wird als grundlegender Bestandteil der Sprache bereitgestellt.

Nicht-Primitive sind benutzerdefinierte Variablen oder Objekte. Beispielsweise können Sie ein Objekt definieren, das Daten speichert, oder Sie können struct in C verwenden, um Ihre eigenen Variablen zu definieren. Diese sind nicht primitiv, da Sie sie zuerst definieren mussten, um sie zu verwenden.

Beispiele: Mitarbeiter, Student, eine_sehr_große_Anzahl_dieser_Sie_sich_definierten_Selbst

Bearbeiten Sie mit mehr Erklärung und Adressierung des Kommentars Ich denke an primitive Variablen, die ursprünglich mit der Sprache geliefert wurden, und nicht an Variablen wie String in C ++, die Sie mit dem New-Schlüsselwort deklarieren müssen. Das macht es zu einem Objekt, sodass ein String kein Primitiv wäre.

Antwort Sie Kommentar: Es hat wahrscheinlich mit der Implementierung der Variablen zu tun. Wenn es Teil des Sprachkerns war, ist es primitiv. Wenn nicht, ist es nicht. Beispiel ist String in C ++. Dies ist keine Kernvariable und wird mit dem Schlüsselwort New deklariert. Es ist also nicht primitiv.

Kein Name
quelle
Danke für die Antwort . Hängt die Klassifizierung eines Datentyps als "primitiv" von der Implementierung ab? Wie in C / C ++ speichern wir Strings als char-Arrays. Sie müssen jedoch explizit definiert werden. Wenn also eine andere Sprache dieselbe Implementierung zum Speichern einer Zeichenfolge hat, diese jedoch implizit bereitstellt, ist der Datentyp "Zeichenfolge" in dieser bestimmten Sprache ein Grundelement?
jsp99
@Appy - möglicherweise. C stellt keinen stringDatentyp als solchen bereit . Zeichenfolgen werden als Aggregate des primitiven Typs dargestellt char. C ++ hat einen geeigneten stringDatentyp eingeführt, aber ob es sich um einen "primitiven" Typ handelt, hängt davon ab, wen Sie fragen. Persönlich würde ich es nicht als solches klassifizieren. Ich würde jedoch einen BASIC-Stringtyp der alten Schule aus Gründen, die wahrscheinlich völlig willkürlich sind, als primitiven Typ klassifizieren.
John Bode
Hat Ihren Kommentar in der Frage selbst angesprochen. Bitte siehe bearbeiten.
Noname
2
Zeichenfolgen in C ++ müssen nicht mit new
jk erstellt werden.
@jk Ich hatte keinen Kontakt zu C ++. Du hast recht. Wird die ans beheben.
Noname
-2

Zum besseren Verständnis des Konzepts primitiver Typen und benutzerdefinierter Datentypen fehlt den anderen Antworten lediglich das Konzept von compiler.

Wenn Sie das Konzept der Auswahl von Lexemen als Token verstehen , werden Sie feststellen, dass Primitive die einzigen Datentypen sind, die ein Compiler für sich kennt.

Amit
quelle