web-dev-qa-db-fra.com

Type de données scalaire ou primitif - s'agit-il de la même chose?

Dans divers articles que j'ai lus, il est parfois fait référence à des types de données primitifs et parfois à des scalaires.

D'après ce que je comprends de chacun, il s'agit de types de données simples, comme un int, un booléen, un caractère, etc.

Y a-t-il quelque chose qui me manque qui signifie que vous devriez utiliser une terminologie particulière ou sont-ils simplement interchangeables?.

Si les termes sont simplement interchangeables, lequel est le préféré?

96
Ben Pearson

Je ne pense pas qu'ils sont interchangeables. Ils sont souvent similaires, mais la différence existe bel et bien, et semble être principalement dans ce qui les oppose et ce qui est pertinent dans le contexte.

Les scalaires contrastent généralement avec composés , tels que des tableaux, des cartes, des ensembles, des structures, etc. Un scalaire est une valeur "unique" - entier, booléen, peut-être une chaîne - tandis qu'un composé est composé de plusieurs scalaires (et éventuellement des références à d'autres composés). "Scalaire" est utilisé dans des contextes où la distinction pertinente est faite entre les valeurs simples/simples/atomiques et les valeurs composées.

Les types primitifs , cependant, contrastent avec p. Ex. types de référence , et sont utilisés lorsque la distinction pertinente est "Est-ce directement une valeur ou est-ce une référence à quelque chose qui contient la valeur réelle?", comme dans les types primitifs de Java par rapport aux références. Je vois cela comme une distinction de niveau un peu plus bas que scalaire/composé, mais pas tout à fait.

Cela dépend vraiment du contexte (et fréquemment de la famille de langues discutée). Pour en prendre un, éventuellement pathologique, exemple: strings. En C, une chaîne est un composé (un tableau de caractères), tandis qu'en Perl, une chaîne est un scalaire. En Java, une chaîne est un objet (ou un type de référence). En Python, tout est (conceptuellement) un type d'objet/référence, y compris des chaînes (et des nombres).

146
Michael Ekstrand

Il y a beaucoup de confusion et d'abus de ces termes. Souvent, on entend un autre. Voici ce que ces termes signifient réellement.

"Native" fait référence à des types intégrés dans le langage, par opposition à ceux fournis par une bibliothèque (même une bibliothèque standard), quelle que soit leur implémentation. Les chaînes Perl font partie du langage Perl, elles sont donc natives en Perl. C fournit une sémantique de chaîne sur les pointeurs vers les caractères à l'aide d'une bibliothèque. Par conséquent, le pointeur sur caractère est natif, mais pas les chaînes.

"Atomic" fait référence à un type qui ne peut plus être décomposé. C'est l'opposé de "composite". Les composites peuvent être décomposés en une combinaison de valeurs atomiques ou d’autres composites. Les nombres entiers et les nombres à virgule flottante sont atomiques. Les fractions, les nombres complexes, les conteneurs/collections et les chaînes sont composites.

"Scalar" - et c'est celui qui déroute le plus de gens - fait référence à des valeurs pouvant exprimer l'échelle (d'où le nom), telles que la taille, le volume, le nombre, etc. Entiers, nombres à virgule flottante et les fractions sont des scalaires. Les nombres complexes, les booléens et les chaînes sont des scalaires ET NON. Quelque chose qui est atomique n'est pas nécessairement scalaire et quelque chose qui est scalaire n'est pas nécessairement atomique. Les scalaires peuvent être natifs ou fournis par des bibliothèques.

Certains types ont des classifications impaires. Les types BigNumber, généralement implémentés sous la forme d'un tableau de chiffres ou d'entiers, sont des scalaires, mais techniquement, ils ne sont pas atomiques. Ils peuvent sembler atomiques si l'implémentation est masquée et que vous ne pouvez pas accéder aux composants internes. Mais les composants ne sont que cachés, alors l'atomicité est une illusion. Ils sont presque toujours fournis dans les bibliothèques, ils ne sont donc pas natifs, mais ils pourraient l'être. Dans le langage de programmation Mathematica, par exemple, les grands nombres sont natifs et, dans la mesure où un programme Mathematica ne peut pas les décomposer en éléments constitutifs, ils sont également atomiques dans ce contexte, alors qu'ils couvre (où vous n'êtes plus dans le monde de la langue Mathematica).

Ces définitions sont indépendantes de la langue utilisée.

9
Claudio Puviani

En termes simples, il semblerait qu'un type "scalaire" se réfère à un seul élément, par opposition à un composite ou à une collection. Les scalaires incluent donc à la fois des valeurs primitives et des éléments comme une valeur enum.

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

Peut-être que le terme 'scalaire' pourrait être un retour à C:

où les scalaires sont des objets primitifs qui contiennent une valeur unique et ne sont pas composés d'autres objets C++

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

Je suis curieux de savoir s'il s'agit de savoir si ces éléments auraient une valeur d'échelle? - Comme compter les nombres.

6
Scott Langeberg

J'aime la réponse de Scott Langeberg car elle est concise et s'appuie sur des liens faisant autorité. Je voterais contre la réponse de Scott si je le pouvais.

Je suppose que le type de données "primitif" pourrait être considéré comme un type de données primaire de sorte que les types de données secondaires soient dérivés des types de données primaires. La dérivation se fait par combinaison, telle qu'une structure C++. Une structure peut être utilisée pour combiner des types de données (tels que, et int et un caractère) pour obtenir un type de données secondaire. Le type de données défini par la structure est toujours un type de données secondaire. Les types de données primaires ne sont dérivés de rien, ils sont plutôt donnés dans le langage de programmation.

J'ai un parallèle avec primitive étant la nomenclature signifiant primaire. Ce parallèle est "expression régulière". Je pense que la nomenclature "régulière" peut être comprise comme "régulatrice". Ainsi, vous avez une expression qui régule la recherche.

Étymologie scalaire ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) signifie «échelle». Je pense que la façon dont cela se rapporte à la programmation est qu'une échelle n'a qu'une seule dimension: combien de barreaux à partir de la fin de l'échelle. Un type de données scalaire n'a qu'une seule dimension, donc représentée par une valeur unique.

Je pense qu'en usage, primitif et scalaire sont interchangeables. Existe-t-il un exemple de primitive qui n'est pas scalaire ou d'un scalaire qui n'est pas primitif? 

Bien qu’elles soient interchangeables, les primitives désignent le type de données comme un bloc constitutif de base d’autres types de données, et une primitive n’est pas composée d’autres types de données. 

Scalar se réfère à avoir une valeur unique. Scalaire contraste avec le vecteur mathématique. Un vecteur n'est pas représenté par une valeur unique car (en utilisant un type de vecteur à titre d'exemple), une valeur est nécessaire pour représenter la direction du vecteur et une autre valeur nécessaire pour représenter la magnitude du vecteur. 

Liens de référence: http://whatis.techtarget.com/definition/primitivehttp://fr.wikipedia.org/wiki/Primitive_data_type

3
Indinfer

En C, les types d'énumération, les caractères et les diverses représentations d'entiers forment une classe de type plus générale appelée types scalaires. Par conséquent, les opérations que vous pouvez effectuer sur les valeurs de tout type scalaire sont identiques à celles des entiers.

0
Onkell Wang

le type null est la seule chose qui soit conforme de manière réaliste à la définition d'un "type scalaire". Même la sérialisation de 'Aucun' comme 'N.' L'adaptation à un mot de 16 bits qui est traditionnellement scalaire - ou même à un seul bit ayant plusieurs valeurs possibles - n'est pas une "donnée unique".

0
Commenter