80

En varios artículos he leído, a veces hay referencias a los tipos de datos primitivos y, a veces hay referencias a los escalares.Tipo de datos escalar vs. primitivo: ¿son lo mismo?

Mi comprensión de cada una es que son tipos de datos de algo tan simple como un int, boolean, char, etc.

¿Hay algo que me falta eso significa que debe usar la terminología en particular o simplemente son los términos intercambiables ? Las páginas de Wikipedia para cada una no muestran nada obvio.

Si los términos son simplemente intercambiables, ¿cuál es el preferido?

Respuesta

118

No creo que sean intercambiables. Con frecuencia son similares, pero la diferencia existe, y parece ser principalmente en lo que se contrasta y lo que es relevante en contexto.

escalares típicamente se contrastan con compuestos, tales como matrices, mapas, conjuntos, estructuras, etc. Un escalar es un valor "single" - número entero, boolean, tal vez una cadena - mientras que un compuesto se compone de múltiples escalares (y posiblemente referencias a otros compuestos). "Escalar" se usa en contextos donde la distinción relevante es entre valores simples/simples/atómicos y valores compuestos.

Los tipos primitivos, sin embargo, se ponen en contraste con p. Ej. tipos de referencia, y se utilizan cuando la distinción relevante es "¿Es esto directamente un valor, o es una referencia a algo que contiene el valor real?", Como en los tipos primitivos de Java vs. referencias. Veo esto como una distinción de un nivel un poco más bajo que escalar/compuesto, pero no del todo.

Realmente depende del contexto (y con frecuencia qué familia de idioma se está discutiendo). Para tomar uno, posiblemente patológico, ejemplo: cadenas. En C, una cuerda es un compuesto (una matriz de caracteres), mientras que en Perl, una cuerda es un escalar. En Java, una cadena es un objeto (o tipo de referencia). En Python, todo es (conceptualmente) un tipo de objeto/referencia, que incluye cadenas (y números).

+0

También se debe considerar en una discusión de tipos de referencia y tipos primitivos los tipos de "valor". En cuanto a la equivalencia de escalares y primitivos, depende del idioma. De acuerdo con el manual de PHP, por ejemplo, solo la mitad de sus tipos primitivos son escalares: http://php.net/manual/en/language.types.intro.php –

6

En pocas palabras, parece que un tipo 'escalar' se refiere a un solo elemento, en lugar de un compuesto o colección. Entonces los escalares incluyen tanto valores primitivos como cosas como un valor enum.

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

Quizás el 'escalar' plazo puede ser un retroceso a C:

donde escalares son objetos primitivos que contienen un solo valor y no se componen de otro C++ objetos

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

Tengo curiosidad acerca de si esto se refiere a si estos i ¿Tems tendría un valor de 'escala'? - Como contar números.

+0

Me enseñaron (hace mucho tiempo en la escuela) que el término se deriva de 'procesador escalar' en contraste con un 'procesador vectorial'. Un procesador escalar es una CPU que solo puede manejar una pieza de datos a la vez. Estos procesadores fueron/son nombrados después de los términos aritméticos. Curiosamente, cuando buscas 'escalar' en wikipedia, te redireccionan a 'variable'. – Evert

3

Me gusta la respuesta de Scott Langeberg porque es concisa y está respaldada por enlaces autoritativos. Volvería a votar la respuesta de Scott si pudiera.

Supongo que el tipo de datos "primitivo" podría considerarse como tipo de datos primario, de modo que los tipos de datos secundarios se derivan de los tipos de datos primarios. La derivación es a través de la combinación, como una estructura C++.Una estructura se puede usar para combinar tipos de datos (como, int y a char) para obtener un tipo de datos secundario. El tipo de datos definido por la estructura siempre es un tipo de datos secundario. Los tipos de datos primarios no se derivan de nada, sino que están dados en el lenguaje de programación.

Tengo una definición paralela a primitiva que es la nomenclatura primaria. Ese paralelo es "expresión regular". Creo que la nomenclatura "regular" puede entenderse como "regular". Por lo tanto, tienes una expresión que regula la búsqueda.

Etimología escalar (http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none) significa escalera. Creo que la forma en que esto se relaciona con la programación es que una escalera tiene una sola dimensión: ¿cuántos peldaños del final de la escalera? Un tipo de datos escalar tiene solo una dimensión, representada por un solo valor.

Creo que en el uso, primitivo y escalar son intercambiables. ¿Hay algún ejemplo de una primitiva que no sea escalar, o de un escalar que no sea primitivo?

Aunque intercambiable, primitiva se refiere a que el tipo de datos es un elemento básico de otros tipos de datos, y una primitiva no está compuesta por otros tipos de datos.

Escalar se refiere a que tiene un único valor. Scalar contrasta con el vector matemático. Un vector no está representado por un solo valor porque (usando un tipo de vector como ejemplo) se necesita un valor para representar la dirección del vector y otro valor necesario para representar la magnitud del vector.

Enlaces de referencia: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type

7

Hay mucha confusión y el mal uso de estos términos. A menudo, uno se usa para significar otro. Esto es lo que esos términos realmente significan.

"Nativo" se refiere a los tipos que están integrados en el idioma, en lugar de ser proporcionados por una biblioteca (incluso una biblioteca estándar), independientemente de cómo se implementen. Las cadenas Perl son parte del lenguaje Perl, por lo que son nativas en Perl. C proporciona semántica de cadena sobre punteros a caracteres mediante una biblioteca, por lo que el puntero a char es nativo, pero las cadenas no lo son.

"Atomic" se refiere a un tipo que ya no se puede descomponer. Es lo contrario de "compuesto". Los compuestos pueden descomponerse en una combinación de valores atómicos u otros materiales compuestos. Los enteros nativos y los números de coma flotante son atómicos. Las fracciones, los números complejos, los contenedores/colecciones y las cadenas son compuestos.

"escalar" - y este es el que confunde la mayoría de las personas - se refiere a los valores que pueden expresar escala (de ahí el nombre), tales como el tamaño, volumen, recuentos, etc. números enteros, números de punto flotante y las fracciones son escalares. Los números complejos, booleanos y cadenas son NOT escalares. Algo que es atómico no es necesariamente escalar y algo que es escalar no es necesariamente atómico. Los escalares pueden ser nativos o proporcionados por bibliotecas.

Algunos tipos tienen clasificaciones impares. Los tipos de BigNumber, generalmente implementados como una matriz de dígitos o enteros, son escalares, pero técnicamente no son atómicos. Pueden parecer atómicos si la implementación está oculta y no puede acceder a los componentes internos. Pero los componentes solo están ocultos, entonces la atomicidad es una ilusión. Casi siempre se proporcionan en bibliotecas, por lo que no son nativas, pero podrían serlo.En el lenguaje de programación de Mathematica, por ejemplo, los números grandes son nativos y, dado que no hay forma de que un programa de Mathematica los descomponga en sus componentes básicos, también son atómicos en ese contexto, a pesar de que son compuestos bajo el covers (donde ya no estás en el mundo del lenguaje Mathematica).

Estas definiciones son independientes del idioma que se utiliza.

+1

Aunque esta definición de tipo escalar tiene más sentido para mí, esta no parece ser la más comúnmente aceptada. – lleaff

0

En C, los tipos de enumeración, los caracteres y las diversas representaciones de los enteros forman una clase de tipo más general denominada tipos escalares. Por lo tanto, las operaciones que puede realizar en valores de cualquier tipo escalar son las mismas que para los enteros.

Cuestiones relacionadas