Tipo de datos escalar versus primitivo: ¿son lo mismo?

127

En varios artículos que he leído, a veces hay referencias a tipos de datos primitivos y a veces referencias a escalares.

Entiendo que cada uno es que son tipos de datos de algo simple como int, boolean, char, etc.

¿Hay algo que me falta que significa que debe usar una terminología particular o son los términos simplemente 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?

Ben Pearson
fuente

Respuestas:

203

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

Los escalares suelen contrastarse con compuestos , como matrices, mapas, conjuntos, estructuras, etc. Un escalar es un valor "único" (entero, booleano, tal vez una cadena), mientras que un compuesto está formado por 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.

Sin embargo, los tipos primitivos se contrastan con, por ejemplo , los tipos de referencia , y se usan 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 vs. referencias de Java . Veo esto como una distinción de nivel algo inferior al escalar / compuesto, pero no del todo.

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

Michael Ekstrand
fuente
1
También se debe considerar en una discusión sobre los tipos de referencia y los tipos primitivos los tipos de "valor". En cuanto a la equivalencia de escalares y primitivos, depende del idioma. Según el manual de PHP, por ejemplo, solo la mitad de sus tipos primitivos son escalares: php.net/manual/en/language.types.intro.php
Joe Bowbeer
11
Esto me ayudó 8 años después :)
CoderXYZ
18

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

"Nativo" se refiere a los tipos 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 de Perl son parte del lenguaje Perl, por lo que son nativas en Perl. C proporciona semántica de cadenas sobre punteros a caracteres mediante una biblioteca, por lo que el puntero a char es nativo, pero las cadenas no lo son.

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

"Escalar" , y este es el que confunde a la mayoría de las personas, se refiere a valores que pueden expresar la escala (de ahí el nombre), como el tamaño, el volumen, los recuentos, etc. Los enteros, los números de coma flotante y las fracciones son escalares. Los números complejos, los booleanos y las cadenas NO son 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 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, por lo que 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 bloques de construcción, también son atómicos en ese contexto, a pesar del hecho de que son compuestos bajo el portadas (donde ya no estás en el mundo del lenguaje Mathematica).

Estas definiciones son independientes del lenguaje utilizado.

Claudio Puviani
fuente
16
Aunque esta definición de tipo escalar tiene más sentido para mí, esta no parece ser la más comúnmente aceptada.
lleaff
1
Gracias por una definición clara de 'Escalar'. Aunque, como @lleaff señala que la mayoría de las personas no lo usan en este sentido específico, sería mejor si lo hicieran.
clockworkpc
Excelentes definiciones lingüísticas. Esta respuesta debe leerse junto con la respuesta de Michael Ekstrand para una discusión más completa. En el contexto de los lenguajes de programación, el escalar tiene diferentes significados, desafortunadamente.
Jerry
9

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

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

Quizás el término 'escalar' puede ser un retroceso a C:

donde los escalares son objetos primitivos que contienen un solo valor y no están compuestos de otros objetos C ++

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

Tengo curiosidad por saber si esto se refiere a si estos elementos tendrían un valor de 'escala'. - Como contar números.

Scott Langeberg
fuente
2
Me enseñaron (hace mucho tiempo en la escuela) que el término se derivaba 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 redirigen a 'variable'.
Evert
2

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

Supongo que el tipo de datos "primitivos" podría considerarse un 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 ++. Se puede usar una estructura para combinar tipos de datos (como e int y a char) para obtener un tipo de datos secundario. El tipo de datos definido por la estructura es siempre un tipo de datos secundario. Los tipos de datos primarios no se derivan de nada, sino que se dan en el lenguaje de programación.

Tengo un paralelo al primitivo siendo la nomenclatura que significa primaria. Ese paralelo es "expresión regular". Creo que la nomenclatura "regular" puede entenderse como "reguladora". Así tienes una expresión que regula la búsqueda.

La 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 desde el 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 un primitivo que no sea escalar, o de un escalar que no sea primitivo?

Aunque intercambiable, primitivo se refiere a que el tipo de datos es un componente básico de otros tipos de datos, y un primitivo no está compuesto de otros tipos de datos.

Escalar se refiere a que tiene un solo valor. Contrastes escalares 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

Indinfer
fuente
0

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

Onkell Wang
fuente
0

tipo nulo es lo único que se ajusta de manera más realista a la definición de "tipo escalar". Incluso la serialización de 'Ninguno' como 'N.' encajar en una palabra de 16 bits que es tradicionalmente escalar, o incluso un solo bit que tiene múltiples valores posibles, no es un "dato único".

Comentarista
fuente