¿Qué se entiende por tipo de datos primitivo?

42

Mi comprensión de un tipo de datos primitivo es que

Es un tipo de datos provisto por un lenguaje implícitamente (Otros son clases definidas por el usuario)

Por lo tanto, diferentes idiomas tienen diferentes conjuntos de tipos de datos que se consideran primitivos para ese idioma en particular. ¿Está bien?

¿Y cuál es la diferencia entre un "tipo de datos básico" y un "tipo de datos incorporado"? Wikipedia dice que un tipo de datos primitivo es cualquiera de los dos.

PD: ¿Por qué el tipo "string" se considera un tipo primitivo en SNOBOL4 y no en Java?

jsp99
fuente

Respuestas:

34

Depende del idioma.

Por ejemplo, en lenguajes como C y C ++, tiene un número de tipos incorporados escalares - int, float, double, char, etc Estas son "primitivo" en el sentido de que no se pueden descomponer en componentes más simples. A partir de estos tipos básicos, puede definir nuevos tipos: tipos de puntero, tipos de matriz, tipos de estructura, tipos de unión, etc.

Entonces tienes un lenguaje como la vieja escuela Lisp, donde todo es un átomo o una lista . Nuevamente, según la definición anterior, un átomo es "primitivo" en el sentido de que no puede descomponerse en algo más simple.

Editar

En lo que a mí respecta, los términos "primitivo", "básico" e "incorporado" son bastante intercambiables. Sin embargo, si desea ser realmente pedante, puede distinguir entre los tipos que están "incorporados" (aquellos proporcionados explícitamente por la definición del lenguaje) y los tipos derivados de los tipos incorporados que aún son "primitivos" o "básicos". en que no se pueden descomponer en elementos más simples. C'stypedefLa función le permite crear nuevos nombres de tipo para los tipos existentes. Ada le permite crear nuevos tipos escalares que tienen restricciones sobre ellos. Por ejemplo, puede derivar un tipo de Latitud del tipo flotante incorporado, con la restricción de que no puede tomar valores fuera del rango [-90.0, 90.0]. Todavía es un tipo primitivo o básico en el sentido de que no puede desglosarse en ningún componente más simple, pero como está definido por el usuario, no se considera un tipo "incorporado".

Una vez más, estos conceptos son un poco confusos, y realmente depende del contexto. Por ejemplo, la noción de un tipo "incorporado" no tiene sentido para un lenguaje sin tipo como BLISS.

John Bode
fuente
¿Cuál es la diferencia entre los tipos de datos básicos y los integrados?
jsp99
1
¿Es "string" un tipo de datos primitivo en Java? (He visto el comentario de delnan a la respuesta de Jesper). Quiero saber tu opinión, porque en uno de tus comentarios dijiste "si el tipo primitivo depende o no de a quién le preguntes".
jsp99
@Appy: ver edición.
John Bode
3
@Appy String en Java no es primitivo porque es un tipo compuesto. Si observa el código fuente de la clase String (src.zip en la carpeta JDK) verá que internamente String se representa como una matriz de caracteres. Entonces puedes descomponer String en caracteres individuales. No puede descomponer el carácter en valores más pequeños, lo que hace que charun tipo primitivo y Stringun tipo compuesto.
Jacek Prucia
2
@Appy Te estás perdiendo el punto. Las cadenas SNOBOL4 no se pueden descomponer. Las cadenas de Java pueden. Esa es la diferencia. Ambos están integrados, pero solo las cadenas SNOBOL4 son primitivas.
Plataforma
19

Desde la perspectiva de Java :

En Java, hay una distinción muy clara entre tipos primitivos y no primitivos.

Una variable de un tipo primitivo contiene directamente el valor de ese tipo (en otras palabras, son tipos de valor ).

Una variable de tipo no primitivo no contiene el valor directamente; en cambio, es una referencia (similar a un puntero) a un objeto. (No es posible en Java crear tipos de valores definidos por el usuario).

Java tiene ocho tipos primitivos: byte, short, int, long, char, boolean, floaty double. Cualquier otra cosa es de tipo no primitivo.

Jesper
fuente
Por lo tanto, el tipo de datos de cadena no es primitivo en Java. En cada programa Java main () escribimos "public static void main (String args [])". ¿Por qué? ¿Por qué siempre tenemos que pasar un argumento String en main? Además, nunca necesitamos importar el tipo String en Java de la forma en que lo incluimos en C / C ++ (por ejemplo, #include <string> o usando std :: string). Por favor explique.
Maxood
77
@Maxood String hace tener un estatus especial en el idioma (se pone literales, está en la firma main, hay internar que supongo que se encuentra habilitado explícitamente por los JLS, es automágicamente disponible, etc.) pero no es un primitivo tipo de datos. Uno podría llamarlo incorporado .
@Jesper ¿Por qué los tipos primitivos son más rápidos para trabajar? ¿Simplemente por el hecho de que no tienen el envoltorio extra que no tienen los primitivos? Estoy tratando de descubrir la diferencia entre primitivas y no primitivas ... ya que ¿están las primitivas integradas en la CPU o algo así?
Abdul
De Wikipedia: "Dependiendo del idioma y su implementación, los tipos de datos primitivos pueden o no tener una correspondencia biunívoca con los objetos en la memoria de la computadora. Sin embargo, generalmente se espera que las operaciones con tipos de datos primitivos básicos sean el lenguaje más rápido construcciones hay ". --- Entonces, esta correspondencia 1 a 1 es la causa principal de que sea más rápida, mientras que con los objetos, no es 1 a 1. ¿Estoy en lo correcto?
Abdul
1
@Abdul no lo hagas demasiado complicado. La CPU tiene varios registros, que pueden contener diferentes tipos de valores primitivos (por ejemplo, un número entero de 32 bits o 64 bits o un número de coma flotante de precisión simple o doble) y la CPU tiene implementadas instrucciones en el hardware para realizar operaciones en Los valores en los registros. Su último comentario es esencialmente correcto.
Jesper
9

Un primitivo es un tipo de datos básico que no está construido a partir de otros tipos de datos. Solo puede representar un único valor. Todas las primitivas son tipos de datos incorporados por necesidad (el compilador tiene que saber sobre ellas), pero no todos los tipos de datos incorporados son primitivas.

En algunos idiomas, el compilador tiene un conocimiento incorporado de ciertos tipos que se basan en otras cosas, porque tiene que ser capaz de tratarlos de una manera especial. Ejemplos serían la variante en Delphi y Visual Basic (y el equivalente de Boo, "Duck") y la clase de objeto base en la mayoría de los lenguajes OO.

Mason Wheeler
fuente
Gracias :) Su respuesta es muy informativa, pero no puedo entender con claridad. ¿Puede dar algunos ejemplos (probablemente con C / C ++ / Java)?
jsp99
@Mason Wheeler Aquí es donde usamos el término tipeo suelto y tipeo fuerte. Como he escuchado a la gente decir que VB es un lenguaje de tipo suelto, mientras que Java es un tipo muy tipado. Por favor confirmar.
Maxood
3
@Appy C ++ se envía con clases para cadenas, vectores y mapas. Estos están incorporados, vienen con el lenguaje, están en la definición del lenguaje, etc. Sin embargo, están escritos en C ++, provienen de la biblioteca estándar. Podrías escribir el tuyo que se comporta de manera idéntica Compare esto con un int o un char. No puede definir su propio carácter en C ++. Podría sobrecargar a todos los operadores de una clase y obtener algo que se comporte de manera similar pero no idéntica. Esto es un primitivo. Básicamente algo definido en un idioma que no es implementable en ese idioma.
stonemetal
5

¿Por qué se considera el tipo "cadena" como un tipo primitivo en SNOBOL4 y no en Java?

Debido a que la Especificación del lenguaje Java especifica muy claramente lo que significa la palabra "primitivo" en el contexto de Java, y Java Stringno se ajusta a esta especificación, mientras que la Especificación del lenguaje SNOBOL4 define lo que significa "primitivo" en el contexto de la cadena SNOBOL4 y SNOBOL4 se ajusta a esa especificación.

Realmente no hay nada más. La especificación del idioma respectivo define lo que significan ciertas palabras y algo se ajusta a esa descripción o no. Por ejemplo, la Especificación del lenguaje C define el significado de la palabra "función" como algo que claramente no es lo que la palabra "función" generalmente significa, pero así es como se usa la palabra dentro de la comunidad C.

Jörg W Mittag
fuente
@Mittag Basado en su respuesta, busqué en Google algunas frases y encontré un enlace muy agradable que casi aclara todas las dudas sobre este tema en particular :).
jsp99
0

Un tipo de datos 'primitivo' significa que tiene un valor almacenado en la memoria; este valor no tiene métodos ni estructura interna. Un primitivo solo puede ser operado por operaciones externas.

En Java, las primitivas son números (int, long, etc.) y char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Si su valor tiene estructura (estoy pensando en puntales aquí), entonces no es primitivo. Si tiene métodos (un objeto o clase) no es un primitivo.

JoshRagem
fuente
2
Primitiva C # 's inttipo de datos hace tener métodos ...
Heinzi
¿Podrías dar un ejemplo?
JoshRagem
var myString = 3.ToString();(Ver Int32.ToString () ). Tenga inten cuenta que en C # es sinónimo de Int32, es decir, Int32 es un tipo primitivo (a diferencia de Java, donde Integeres diferente de int). Por lo tanto, 3.ToString()en C # no implica el boxeo!
Heinzi
Eso es muy interesante; el enlace que proporcionó indica que 'int' es realmente un objeto de la clase 'Int32' (o tal vez una combinación de la clase primitiva y una clase envolvente), por lo que según la definición que puse: 'int' no es una primitiva. :)
JoshRagem
1
@barlop: Java no desciende de C ++. Si Herbert Schildt ni siquiera puede aclarar un hecho tan simple, tampoco estoy seguro de confiar en el resto del libro. Patrick Naughton, diseñador original de Java, era un gran fanático de Objective-C. De hecho, ya había avisado para trabajar en Objective-C en NeXT, cuando Scott McNealy lo convenció de quedarse en Sun y diseñar un nuevo lenguaje. James Gosling, el otro diseñador original, estaba muy familiarizado con Smalltalk (antepasado directo de Objective-C) y Lisp (inspiración para Smalltalk). Más tarde, varios miembros del equipo de diseño de Objective-C se mudaron a Sun.
Jörg W Mittag
0

Encontré algo de información y sentí que ayudaría a las otras respuestas. Así que quiero compartirlo

Wikipedia dice:

En informática, el tipo de datos primitivos es uno de los siguientes:

Un tipo básico es un tipo de datos proporcionado por un lenguaje de programación como un bloque de construcción básico. La mayoría de los lenguajes permiten que los tipos compuestos más complicados se construyan recursivamente a partir de tipos básicos.
Un tipo incorporado es un tipo de datos para el cual el lenguaje de programación proporciona soporte incorporado.

En la mayoría de los lenguajes de programación, todos los tipos de datos básicos están integrados. Además, muchos idiomas también proporcionan un conjunto de tipos de datos compuestos (tipo "cadena" en Java).

Me gustaría decirlo de esta manera:
un tipo de datos básico es un tipo de datos que no se puede desglosar más (el tipo de "cadena" se puede hacer de "char", pero el char no se puede "desglosar" en ningún tipo de datos (en la mayoría de la programación idiomas). Entonces es un tipo de datos básico)

Tipo de cadena, en SNOBOL4 se considera primitivo. Aunque no sé la razón exacta por qué. Es tanto básico como integrado en SNOBOL4.

La especificación de Java menciona claramente la lista de tipos de datos que considera de tipo primitivo. Debido a que el tipo de cadena no está en su especificación , no es un tipo de datos primitivo en Java, a pesar de ser un tipo incorporado.

jsp99
fuente
-2

Las primitivas son tipos de datos fundamentales proporcionados por el propio lenguaje. Ejemplo en lenguaje C son los tipos de datos int, float, char. Se proporciona como parte fundamental del lenguaje.

Las no primitivas son variables u objetos definidos por el usuario. Por ejemplo, puede definir un objeto que almacene datos o puede usar struct en C para definir sus propias variables. Estos no son primitivos porque primero tenía que definirlos para poder usarlos.

Ejemplos: Empleado, Estudiante, a_very_large_number_that_you_defined_yourself

Edite con más explicaciones y aborde el comentario . Pienso que las primitivas son variables que vinieron originalmente con el lenguaje y no variables como String en C ++ que debe declarar usando la palabra clave New. Eso lo convierte en un objeto, por lo que una cadena no sería primitiva.

Responda su comentario: Probablemente tenga que ver con la implementación de la variable. Si era parte del núcleo del lenguaje, es primitivo. Si no, no lo es. El ejemplo es una cadena en C ++. Esta no es una variable central y se declara usando la nueva palabra clave. Entonces no es primitivo.

Sin nombre
fuente
Gracias por la respuesta . ¿La clasificación de un tipo de datos como "primitiva" depende de la implementación? Al igual que en C / C ++, almacenamos cadenas como matrices de caracteres. Pero necesitamos definirlas explícitamente. Entonces, si algún otro idioma tiene la misma implementación para almacenar una cadena pero la proporciona implícitamente, ¿la "cadena" del tipo de datos será primitiva en ese idioma en particular?
jsp99
@Appy - posiblemente. C no proporciona un stringtipo de datos como tal; Las cadenas se representan como agregados del tipo primitivo char. C ++ introdujo un stringtipo de datos adecuado , pero si es o no un tipo "primitivo" depende de a quién se le pregunte. Personalmente, no lo clasificaría como tal. Sin embargo, clasificaría un tipo de cadena BASIC de la vieja escuela como un tipo primitivo, por razones que probablemente sean completamente arbitrarias.
John Bode
Abordó su comentario en la pregunta misma. Por favor ver editar.
Noname
2
No es necesario crear cadenas en C ++ con new
jk.
@jk Estaba fuera de contacto con C ++. Tienes razón. Arreglará los ans.
Noname
-2

Para comprender mejor el concepto de tipos primitivos y tipos de datos definidos por el usuario, todo lo que falta a las otras respuestas es el concepto de compiler.

Si comprende el concepto de que los lexemas se seleccionen como tokens , sabrá que las primitivas son los únicos tipos de datos que un compilador conoce por sí mismo.

Amit
fuente