Qu'entend-on par type de données primitif?

42

Ma compréhension d'un type de données primitif est que

C'est un type de données fourni implicitement par un langage (les autres sont des classes définies par l'utilisateur)

Si différentes langues ont différents ensembles de types de données qui sont considérés comme primitifs pour cette langue particulière. Est-ce correct?

Et quelle est la différence entre un "type de données de base" et un "type de données intégré". Wikipedia dit qu'un type de données primitif est l'un des deux.

PS - Pourquoi le type "chaîne" est-il considéré comme un type primitif dans SNOBOL4 et non en Java?

jsp99
la source

Réponses:

34

Cela dépend de la langue.

Par exemple, dans des langages comme C et C ++, vous avez un certain nombre de types intégrés scalaires - int, float, double, char, etc. Ce sont des « primitifs » dans le sens où ils ne peuvent pas être décomposés en éléments plus simples. À partir de ces types de base, vous pouvez définir de nouveaux types - types de pointeur, types de tableau, types de structure, types d'union, etc.

Ensuite, vous avez une langue comme le Lisp de la vieille école, où tout est soit un atome, soit une liste . Là encore, selon la définition ci-dessus, un atome est "primitif" en ce sens qu'il ne peut être décomposé en quelque chose de plus simple.

modifier

En ce qui me concerne, les termes "primitif", "basique" et "intégré" sont assez interchangeables. Cependant, si vous voulez être vraiment pédant, vous pouvez distinguer les types qui sont "intégrés" (ceux explicitement fournis par la définition du langage) des types dérivés des types intégrés qui sont toujours "primitifs" ou "de base". en ce qu'ils ne peuvent pas être décomposés en éléments plus simples. CtypedefCette fonctionnalité vous permet de créer de nouveaux noms de types pour les types existants. Ada vous permet de créer de nouveaux types scalaires soumis à des contraintes. Par exemple, vous pouvez dériver un type Latitude du type flottant intégré, avec la contrainte qu'il ne peut pas accepter de valeurs en dehors de la plage [-90.0, 90.0]. Il s'agit toujours d'un type primitif ou de base, dans la mesure où il ne peut pas être décomposé en composants plus simples, mais comme il est défini par l'utilisateur, il n'est pas considéré comme un type "intégré".

Encore une fois, ces concepts sont un peu flous et cela dépend vraiment du contexte. Par exemple, la notion de type "intégré" n'a pas de sens pour un langage sans typage comme BLISS.

John Bode
la source
Quelle est la différence entre les types de données de base et intégrés?
jsp99
1
Est-ce que "string" est un type de données primitif en Java? (J'ai vu le commentaire de Delnan sur la réponse de Jesper). Je veux connaître votre opinion car, dans l’un de vos commentaires, vous avez indiqué que "le type primitif dépend de qui vous demandez".
Jsp99
@Appy - voir edit.
John Bode
3
@Appy Une chaîne en Java n'est pas primitive car il s'agit d'un type composé. Si vous examinez le code source de la classe String (src.zip dans le dossier JDK), vous verrez que String est représenté en interne sous la forme d'un tableau de caractères. Ainsi, vous pouvez décomposer String en caractères individuels. Vous ne pouvez pas décomposer un caractère en valeurs plus petites, ce qui crée charun type primitif et Stringun type composé.
Jacek Prucia
2
@Appy Vous manquez le point. Les chaînes SNOBOL4 ne peuvent pas être décomposées. Les chaînes Java peuvent. C'est la différence. Les deux sont intégrés mais seules les chaînes SNOBOL4 sont primitives.
Rig
19

Du point de vue de Java :

En Java, il existe une distinction très claire entre les types primitifs et non primitifs.

Une variable de type primitif contient directement la valeur de ce type (en d’autres termes, il s’agit de types valeur ).

Une variable de type non primitif ne contient pas directement la valeur; au lieu de cela, il s'agit d'une référence (similaire à un pointeur) à un objet. (Il n'est pas possible en Java de créer des types de valeur définis par l'utilisateur).

Java a huit types primitifs: byte, short, int, long, char, boolean, floatet double. Tout le reste est un type non primitif.

Jesper
la source
Le type de données String est donc non primitif en Java. Dans chaque programme main () Java, nous écrivons "public static void main (String args [])". Pourquoi? Pourquoi devons-nous toujours passer un argument String dans main? De plus, nous n'avons jamais besoin d'importer le type String en Java de la même manière que nous l'incluons en C / C ++ (par exemple, #include <string> ou en utilisant std :: string). S'il vous plaît, expliquez.
Maxood
7
@Maxood String fait un statut particulier dans la langue (il obtient littéraux, il est dans la signature main, il y a interner que je présume est explicitement autorisé par les JLS, il est automagiquement disponible, etc.) , mais il n'est pas une primitive de type de données. On pourrait appeler cela intégré .
@Jesper Pourquoi les types primitifs sont-ils plus rapides à utiliser? Tout simplement parce qu’ils n’ont pas les extra-enveloppants non? J'essaie de comprendre la différence entre les primitives et les non-primitives ... car les primitives sont-elles intégrées au processeur ou quelque chose du genre?
Abdul
From Wikipedia: "En fonction du langage et de son implémentation, les types de données primitifs peuvent ou non avoir une correspondance tête à tête avec des objets dans la mémoire de l'ordinateur. Cependant, on s'attend généralement à ce que les opérations sur les types de données primitifs de base soient le langage le plus rapide. il y a des constructions. " --- Donc, cette correspondance 1-à-1 est la cause principale de sa rapidité, alors qu'avec les objets, ce n'est pas 1-à-1. Ai-je raison?
Abdul
1
@ Abdul ne rend pas les choses trop compliquées. La CPU a un certain nombre de registres pouvant contenir différents types de valeurs primitives (par exemple un entier 32 bits ou 64 bits ou un nombre à virgule flottante simple ou double précision) et la CPU dispose d'instructions implémentées matériellement pour effectuer des opérations sur. les valeurs dans les registres. Votre dernière remarque est essentiellement correcte.
Jesper
9

Une primitive est un type de données de base qui n'est pas construit à partir d'autres types de données. Il ne peut représenter qu'une seule valeur. Toutes les primitives sont des types de données intégrés par nécessité (le compilateur doit les connaître), mais tous les types de données intégrés ne sont pas des primitives.

Dans certaines langues, le compilateur a une connaissance intégrée de certains types qui sont construits à partir d’autres choses, car il doit pouvoir les traiter de manière spéciale. Les exemples sont les variantes dans Delphi et Visual Basic (et l'équivalent de Boo, "Duck") et la classe d'objets de base dans la plupart des langages OO.

Maçon Wheeler
la source
Merci :) Votre réponse est très informative, mais je suis incapable de comprendre clairement. Si vous donnez quelques exemples (probablement avec C / C ++ / Java).
jsp99
@Mason Wheeler C'est ici que nous utilisons le terme dactylographie en bloc et dactylographie forte. Comme j'ai entendu des gens dire que VB est un langage faiblement typé alors que Java est un langage fortement typé. Veuillez confirmer.
Maxood
3
@Appy C ++ est livré avec des classes pour les chaînes, les vecteurs et les cartes. Ceux-ci sont intégrés, ils viennent avec le langage, sont dans la définition du langage, etc. Cependant, ils sont écrits en C ++ et proviennent de la bibliothèque standard. Vous pouvez écrire votre propre qui se comporte de manière identique. Comparez cela à un int ou à un char. Vous ne pouvez pas définir votre propre caractère en C ++. Vous pouvez surcharger chaque opérateur d'une classe et obtenir quelque chose qui se comporte de la même manière, mais pas à l'identique. C'est un primitif. Fondamentalement, quelque chose défini dans une langue qui ne peut pas être implémentée dans cette langue.
Stonemetal
5

Pourquoi le type "chaîne" est-il considéré comme un type primitif dans SNOBOL4 et non en Java?

Parce que la spécification de langage Java spécifie très clairement ce que le mot "primitive" signifie dans le contexte de Java et que celui-ci Stringn'est pas conforme à cette spécification, alors que la spécification de langage SNOBOL4 définit ce que "primitive" signifie dans le contexte de la chaîne SNOBOL4 et SNOBOL4 conforme à cette spécification.

Il n'y a vraiment rien de plus. La spécification du langage respectif définit la signification de certains mots. Quelque chose correspond à cette description ou non. Par exemple, la spécification du langage C définit la signification du mot "fonction" comme étant quelque chose qui n'est clairement pas ce que le mot "fonction" signifie habituellement, mais c'est la façon dont le mot est utilisé dans la communauté C.

Jörg W Mittag
la source
@Mittag Sur la base de votre réponse, j'ai cherché quelques phrases dans Google et suis tombé sur un très bon lien qui dissipe presque tous les doutes sur ce sujet particulier :).
Jsp99
0

Un type de données 'primitive' signifie que vous avez une valeur stockée en mémoire - cette valeur n'a pas de méthode ni de structure interne. Une primitive ne peut être exploitée que par des opérations externes.

En Java, les primitives sont des nombres (int, long, etc.) et char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Si votre valeur a une structure (je pense aux jambes de force ici), alors ce n'est pas une primitive. S'il a des méthodes (un objet ou une classe), ce n'est pas une primitive.

JoshRagem
la source
2
C # primitive de inttype de données n'ont des méthodes ...
Heinzi
Pouvez-vous donner un exemple?
JoshRagem
var myString = 3.ToString();(voir Int32.ToString () ). Notez que intdans C # est un synonyme de Int32, c'est-à- Int32 dire un type primitif (contrairement à Java, où Integerest différent de int). Ainsi, 3.ToString()en C # n'implique pas la boxe!
Heinzi
C'est très intéressant; le lien que vous avez fourni indique que "int" est en réalité un objet de la classe "Int32" (ou peut-être une combinaison de la primitive et d'une classe wrapper). Par conséquent, selon la définition que j'ai donnée: "int" n'est pas une primitive. :)
JoshRagem
1
@barlop: Java n'est pas issu de C ++. Si Herbert Schildt ne parvient même pas à comprendre un fait aussi simple, je ne suis pas sûr de pouvoir faire confiance au reste du livre non plus. Patrick Naughton, concepteur original de Java, était un grand fan d’Objective-C. En fait, il avait déjà annoncé son intention de travailler sur Objective-C chez NeXT, lorsque Scott McNealy l'avait convaincu de rester chez Sun et de concevoir un nouveau langage. James Gosling, l'autre concepteur original, connaissait très bien Smalltalk (ancêtre direct de Objective-C) et Lisp (source d'inspiration pour Smalltalk). Par la suite, plusieurs membres de l'équipe de conception d'Objective-C ont rejoint Sun.
Jörg W Mittag
0

Je suis tombé sur quelques informations et je pensais que cela aiderait les autres réponses. Alors envie de le partager -

Wikipedia dit -

En informatique, le type de données primitif est l’un des suivants:

Un type de base est un type de données fourni par un langage de programmation en tant que bloc de construction de base. La plupart des langages permettent la construction récursive de types composites plus complexes à partir de types de base.
Un type intégré est un type de données pour lequel le langage de programmation fournit une prise en charge intégrée.

Dans la plupart des langages de programmation, tous les types de données de base sont intégrés. En outre, de nombreux langages fournissent également un ensemble de types de données composites (type "chaîne" en Java).

Je voudrais le dire ainsi -
Un type de données de base est un type de données qui ne peut pas être décomposé davantage (le type "chaîne" peut être créé à partir de "char", mais char ne peut être "décomposé" en un type de données langues). C’est donc un type de données de base)

Le type de chaîne, dans SNOBOL4, est considéré comme primitif. Bien que je ne connaisse pas la raison exacte pourquoi. C'est à la fois basique et intégré dans SNOBOL4.

La spécification Java mentionne clairement la liste des types de données qu’il considère être du type primitif. Étant donné que le type de chaîne ne figure pas dans leurs spécifications , il ne s'agit pas d'un type de données primitif en Java, même s'il s'agit d'un type intégré.

jsp99
la source
-2

Les primitives sont des types de données fondamentaux fournis par le langage lui-même. Les exemples de langage C sont les types de données int, float, char. Il est fourni comme une partie fondamentale de la langue.

Les non primitives sont des variables ou des objets définis par l'utilisateur. Par exemple, vous pouvez définir un objet qui stocke des données ou vous pouvez utiliser struct en C pour définir vos propres variables. Celles-ci ne sont pas primitives car il fallait d'abord les définir pour pouvoir les utiliser.

Exemples: employé, étudiant, a_very_large_number_that_you_defined_yourself

Editez avec plus d'explications et en répondant au commentaire que je considère comme primitif comme des variables fournies à l'origine avec le langage et non comme des variables telles que String en C ++ que vous devez déclarer à l'aide du mot-clé New. Cela en fait un objet, donc une chaîne ne serait pas une primitive.

Répondez à votre commentaire: Cela a probablement à voir avec l'implémentation de la variable. Si cela faisait partie du noyau de la langue, c'est primitif. Si ce n'est pas le cas Exemple: String en C ++. Ce n'est pas une variable principale et est déclaré avec le mot-clé New. Donc, ce n'est pas primitif.

Sans nom
la source
Merci d'avoir répondu . Est-ce que la classification d'un type de données en tant que "primitive" dépend de la mise en oeuvre? Comme en C / C ++, nous stockons les chaînes sous forme de tableaux de caractères. Mais nous devons les définir explicitement. Ainsi, si un autre langage utilise la même implémentation pour stocker une chaîne mais la fournit de manière implicite, le type de données "chaîne" sera-t-il une primitive dans ce langage particulier?
jsp99
@Appy - éventuellement. C ne fournit pas un stringtype de données en tant que tel; les chaînes sont représentées sous forme d'agrégats du type primitif char. C ++ a introduit un stringtype de données approprié , mais le type "primitif" lui-même dépend de qui vous demandez. Personnellement, je ne le classerais pas comme tel. Cependant, je classerais un type de chaîne BASIC de la vieille école en un type primitif, pour des raisons probablement totalement arbitraires.
John Bode
Adressé votre commentaire dans la question elle-même. Plz voir éditer.
Noname
2
Les chaînes en C ++ n'ont pas besoin d'être créées avec new
jk.
@jk J'étais déconnecté de C ++. Vous avez raison. Va réparer les ans.
Noname
-2

Pour mieux comprendre le concept de types primitifs et les types de données définis par l'utilisateur, tout ce qui manque aux autres réponses est le concept de compiler.

Si vous comprenez le concept de sélection de lexèmes en tant que jetons , vous saurez que les primitives sont les seuls types de données qu'un compilateur connaît par lui-même.

Amit
la source