Articulo de referencia

Tipo de datos

La jerarquía de tipos estándar de Python 3 En informática y programación , un tipo de dato (o simplemente tipo ) es una colección o agrupación de valores de datos , generalmente...

La jerarquía de tipos estándar de Python 3

En informática y programación , un tipo de dato (o simplemente tipo ) es una colección o agrupación de valores de datos , generalmente especificada por un conjunto de valores posibles, un conjunto de operaciones permitidas sobre estos valores y/o una representación de estos valores como tipos de máquina. [ 1 ] La especificación de un tipo de dato en un programa restringe los valores posibles que puede tomar una expresión , como una variable o una llamada a una función. En el caso de datos literales, indica al compilador o intérprete cómo el programador pretende utilizar los datos. La mayoría de los lenguajes de programación admiten tipos de datos básicos como números enteros (de diferentes tamaños), números de coma flotante (que se aproximan a los números reales ), caracteres y booleanos . [ 2 ] [ 3 ]

Concepto

Un tipo de dato puede especificarse por muchas razones: similitud, conveniencia o para centrar la atención. Con frecuencia, una buena organización facilita la comprensión de definiciones complejas. Casi todos los lenguajes de programación incluyen explícitamente la noción de tipo de dato, aunque los tipos de datos posibles suelen estar restringidos por consideraciones de simplicidad, computabilidad o regularidad. Una declaración explícita del tipo de dato generalmente permite al compilador elegir una representación de máquina eficiente, pero no debe subestimarse la organización conceptual que ofrecen los tipos de datos. [ 4 ]

Los distintos lenguajes pueden usar diferentes tipos de datos o tipos similares con semántica distinta. Por ejemplo, en el lenguaje de programación Python , intrepresenta un entero de precisión arbitraria que tiene las operaciones numéricas tradicionales como suma, resta y multiplicación. Sin embargo, en el lenguaje de programación Java , el tipo intrepresenta el conjunto de enteros de 32 bits que van desde -2.147.483.648 hasta 2.147.483.647, con operaciones aritméticas que se desbordan . En Rust , este tipo de entero de 32 bits se denota y provoca un pánico en caso de desbordamiento en modo de depuración. [ 5 ]i32

La mayoría de los lenguajes de programación también permiten al programador definir tipos de datos adicionales, generalmente combinando varios elementos de otros tipos y definiendo las operaciones válidas del nuevo tipo de dato. Por ejemplo, un programador podría crear un nuevo tipo de dato llamado " número complejo " que incluiría partes reales e imaginarias, o un tipo de dato de color representado por tres bytes que indican las cantidades de rojo, verde y azul, y una cadena que representa el nombre del color.

Los tipos de datos se utilizan dentro de los sistemas de tipos , que ofrecen diversas maneras de definirlos, implementarlos y usarlos. En un sistema de tipos, un tipo de dato representa una restricción impuesta a la interpretación de los datos, describiendo la representación, interpretación y estructura de los valores u objetos almacenados en la memoria de la computadora. El sistema de tipos utiliza la información del tipo de dato para verificar la corrección de los programas informáticos que acceden o manipulan los datos. Un compilador puede usar el tipo estático de un valor para optimizar el almacenamiento que necesita y la elección de algoritmos para las operaciones sobre dicho valor. En muchos compiladores de Cfloat , por ejemplo, el tipo de dato se representa en 32 bits , de acuerdo con la especificación IEEE para números de coma flotante de precisión simple . Por lo tanto, utilizarán operaciones de microprocesador específicas para coma flotante sobre esos valores (suma, multiplicación, etc.).

Definición

Parnas, Shore y Weiss (1976) identificaron cinco definiciones de "tipo" que se utilizaban —a veces implícitamente— en la literatura:

Sintáctico
Un tipo es una etiqueta puramente sintáctica asociada a una variable en el momento de su declaración. Si bien resulta útil para sistemas de tipos avanzados, como los sistemas de tipos subestructurales , estas definiciones no proporcionan un significado intuitivo de los tipos.
Representación
Un tipo se define en términos de una composición de tipos más primitivos, a menudo tipos de máquina.
Representación y comportamiento
Un tipo se define como su representación y un conjunto de operadores que manipulan dichas representaciones.
Espacio de valor
Un tipo es un conjunto de valores posibles que una variable puede poseer. Estas definiciones permiten hablar de uniones ( disjuntas ) o productos cartesianos de tipos.
Espacio de valores y comportamiento
Un tipo es un conjunto de valores que una variable puede poseer y un conjunto de funciones que se pueden aplicar a esos valores.

La definición en términos de representación se realizaba a menudo en lenguajes imperativos como ALGOL y Pascal , mientras que la definición en términos de espacio de valores y comportamiento se utilizaba en lenguajes de alto nivel como Simula y CLU . Los tipos que incluyen comportamiento se alinean más estrechamente con los modelos orientados a objetos , mientras que un modelo de programación estructurada tiende a no incluir código y se denominan estructuras de datos simples .

Clasificación

Los tipos de datos se pueden clasificar según varios factores:

  • Los tipos de datos primitivos o integrados son aquellos que vienen incorporados a la implementación de un lenguaje. Los tipos de datos definidos por el usuario no son primitivos. Por ejemplo, los tipos numéricos de Java son primitivos, mientras que las clases son definidas por el usuario.
  • Un valor de tipo atómico es un único elemento de datos que no se puede dividir en partes componentes. Un valor de tipo compuesto o agregado es una colección de elementos de datos a los que se puede acceder individualmente. [ 6 ] Por ejemplo, un entero se considera generalmente atómico, aunque consta de una secuencia de bits, mientras que una matriz de enteros es sin duda compuesta.
  • Los tipos de datos básicos o fundamentales se definen axiomáticamente a partir de nociones fundamentales o mediante la enumeración de sus elementos. Los tipos de datos generados o derivados se especifican, y se definen parcialmente, en términos de otros tipos de datos. Todos los tipos básicos son atómicos. [ 7 ] Por ejemplo, los enteros son un tipo básico definido en matemáticas, mientras que un array de enteros es el resultado de aplicar un generador de arrays al tipo entero.

La terminología varía: en la literatura, los términos primitivo, incorporado, básico, atómico y fundamental pueden usarse indistintamente. [ 8 ]

Ejemplos

Tipos de datos de máquina

En las computadoras basadas en electrónica digital, todos los datos se representan como bits (alternativas 0 y 1) en el nivel más bajo. La unidad de datos direccionable más pequeña suele ser un grupo de bits llamado byte (normalmente un octeto , que son 8 bits). La unidad procesada por las instrucciones del código máquina se llama palabra ( a partir de 2026(normalmente de 32/64 bits).

Los tipos de datos de máquina exponen o ponen a disposición un control granular sobre el hardware, pero esto también puede exponer detalles de implementación que hacen que el código sea menos portable. Por lo tanto, los tipos de máquina se utilizan principalmente en la programación de sistemas o en lenguajes de programación de bajo nivel . En lenguajes de alto nivel, la mayoría de los tipos de datos están abstraídos , ya que no tienen una representación de máquina definida por el lenguaje. El lenguaje de programación C , por ejemplo, proporciona tipos como booleanos, enteros, números de punto flotante, etc., pero las representaciones de bits precisas de estos tipos dependen de la implementación. El único tipo de C con una representación de máquina precisa es el chartipo que representa un byte. [ 9 ]

Tipo booleano

El tipo booleano representa los valores verdadero y falso . Aunque solo son posibles dos valores, se suelen representar como un byte o una palabra en lugar de un bit individual, ya que almacenar y recuperar un bit requiere más instrucciones de máquina. Muchos lenguajes de programación no tienen un tipo booleano explícito, sino que utilizan un tipo entero e interpretan (por ejemplo) el 0 como falso y otros valores como verdadero. Los datos booleanos se refieren a la estructura lógica de cómo se interpreta el lenguaje para el lenguaje máquina. En este caso, un 0 booleano se refiere a la lógica Falso. Verdadero siempre es distinto de cero, especialmente el uno, que se conoce como 1 booleano.

Tipos numéricos

Casi todos los lenguajes de programación proporcionan uno o más tipos de datos enteros . Pueden ofrecer un número reducido de subtipos predefinidos restringidos a ciertos rangos (como `int` shorty ` longint` y sus unsignedvariantes correspondientes en C/C++); o permitir a los usuarios definir libremente subrangos como 1..12 (por ejemplo, Pascal / Ada ). Si no existe un tipo nativo correspondiente en la plataforma de destino, el compilador lo descompondrá en código utilizando tipos que sí existen. Por ejemplo, si se solicita un entero de 32 bits en una plataforma de 16 bits, el compilador lo tratará tácitamente como una matriz de dos enteros de 16 bits.

Los tipos de datos de punto flotante representan ciertos valores fraccionarios ( números racionales , matemáticamente hablando). Aunque tienen límites predefinidos tanto en sus valores máximos como en su precisión, a veces se les denomina erróneamente números reales (en alusión a los números reales matemáticos ). Normalmente se almacenan internamente en el formato a × 2 b (donde a y b son números enteros), pero se muestran en el formato decimal habitual .

Los tipos de datos de punto fijo son convenientes para representar valores monetarios. A menudo se implementan internamente como números enteros, lo que conlleva límites predefinidos.

Para independizarse de los detalles de la arquitectura, se puede proporcionar un tipo Bignum o de precisión arbitrarianumeric . Este representa un entero o un número racional con una precisión limitada únicamente por la memoria y los recursos computacionales disponibles en el sistema. Las implementaciones de Bignum de operaciones aritméticas sobre valores del tamaño de la máquina son significativamente más lentas que las operaciones de máquina correspondientes. [ 10 ]

Enumeraciones

El tipo enumerado tiene valores distintos que se pueden comparar y asignar, pero que no necesariamente tienen una representación concreta en la memoria del ordenador; los compiladores e intérpretes pueden representarlos arbitrariamente. Por ejemplo, los cuatro palos de una baraja de cartas pueden ser cuatro enumeradores llamados CLUB , DIAMOND , HEART y SPADE , pertenecientes a un tipo enumerado llamado suit . Si se declara una variable V con suit como tipo de dato, se le puede asignar cualquiera de esos cuatro valores. Algunas implementaciones permiten a los programadores asignar valores enteros a los valores de enumeración, o incluso tratarlos como equivalentes a enteros.

Tipos de cadena y texto

Las cadenas son secuencias de caracteres que se utilizan para almacenar palabras o texto plano , generalmente lenguajes de marcado textual que representan texto formateado . Los caracteres pueden ser letras de algún alfabeto , dígitos, espacios en blanco, signos de puntuación, etc. Los caracteres se extraen de un conjunto de caracteres como ASCII o Unicode . Los tipos de caracteres y cadenas pueden tener diferentes subtipos según la codificación de caracteres. Se descubrió que el ASCII original de 7 bits era limitado y fue reemplazado por conjuntos de 8, 16 y 32 bits, que pueden codificar una amplia variedad de alfabetos no latinos (como el hebreo y el chino ) y otros símbolos. Las cadenas pueden tener longitud variable o fija, y algunos lenguajes de programación tienen ambos tipos. También pueden subtiparse según su tamaño máximo.

Dado que la mayoría de los conjuntos de caracteres incluyen los dígitos , es posible tener una cadena numérica, como "1234". Estas cadenas numéricas generalmente se consideran distintas de los valores numéricos como 1234, aunque algunos lenguajes convierten automáticamente entre ellos.

Tipos de sindicatos

La definición de un tipo de unión especificará cuál de los subtipos permitidos puede almacenarse en sus instancias, por ejemplo, "float" o "long integer". A diferencia de un registro , que podría definirse para contener un float y un integer, una unión solo puede contener un subtipo a la vez.

Una unión etiquetada (también llamada variante , registro de variante, unión discriminada o unión disjunta) contiene un campo adicional que indica su tipo actual para una mayor seguridad de tipos.

Tipos de datos algebraicos

Un tipo de dato algebraico (TDA) es un tipo suma posiblemente recursivo de tipos producto . Un valor de un TDA consta de una etiqueta de constructor junto con cero o más valores de campo, cuyo número y tipo están determinados por el constructor. El conjunto de todos los valores posibles de un TDA es la unión disjunta (suma) de los conjuntos de todos los valores posibles de sus variantes (producto de campos). Los valores de los tipos algebraicos se analizan mediante la coincidencia de patrones, que identifica el constructor de un valor y extrae los campos que contiene.

Si solo hay un constructor, entonces el TAD corresponde a un tipo de producto similar a una tupla o registro. Un constructor sin campos corresponde al producto vacío (tipo de unidad). Si todos los constructores no tienen campos, entonces el TAD corresponde a un tipo enumerado .

Un ADT común es el tipo de opción , definido en Haskell como . [ 11 ]dataMaybea=Nothing|Justa

Estructuras de datos

Algunos tipos son muy útiles para almacenar y recuperar datos y se denominan estructuras de datos . Las estructuras de datos comunes incluyen:

  • Un array (también llamado vector, lista o secuencia) almacena varios elementos y proporciona acceso aleatorio a cada uno de ellos. Los elementos de un array suelen ser del mismo tipo (aunque no siempre). Los arrays pueden ser de longitud fija o expandibles. Los índices de un array suelen ser enteros (si no, se puede enfatizar esta flexibilidad hablando de un array asociativo ) dentro de un rango específico (si no todos los índices de ese rango corresponden a elementos, puede tratarse de un array disperso ).
  • Registro (también llamado tupla o estructura) Los registros son una de las estructuras de datos más simples . Un registro es un valor que contiene otros valores, generalmente en número y secuencia fijos, y normalmente indexados por nombres. Los elementos de los registros se denominan generalmente campos o miembros .
  • Un objeto contiene varios campos de datos, como un registro, y también ofrece una serie de subrutinas para acceder a ellos o modificarlos, llamadas métodos .
  • the singly linked list, which can be used to implement a queue and is defined in Haskell as the ADT dataLista=Nil|Consa(Lista), and
  • the binary tree, which allows fast searching, and can be defined in Haskell as the ADT dataBTreea=Nil|Node(BTreea)a(BTreea)[12]

Abstract data types

An abstract data type is a data type that does not specify the concrete representation of the data. Instead, a formal specification based on the data type's operations is used to describe it. Any implementation of a specification must fulfill the rules given. For example, a stack has push/pop operations that follow a Last-In-First-Out rule, and can be concretely implemented using either a list or an array. Abstract data types are used in formal semantics and program verification and, less strictly, in design.

Pointers and references

The main non-composite, derived type is the pointer, a data type whose value refers directly to (or "points to") another value stored elsewhere in the computer memory using its address. It is a primitive kind of reference. (In everyday terms, a page number in a book could be considered a piece of data that refers to another one). Pointers are often stored in a format similar to an integer; however, attempting to dereference or "look up" a pointer whose value was never a valid memory address would cause a program to crash. To ameliorate this potential problem, a pointer type is typically considered distinct from the corresponding integer type, even if the underlying representation is the same.

Function types

Functional programming languages treat functions as a distinct datatype and allow values of this type to be stored in variables and passed to functions. Some multi-paradigm languages such as JavaScript also have mechanisms for treating functions as data.[13] Most contemporary type systems go beyond JavaScript's simple type "function object" and have a family of function types differentiated by argument and return types, such as the type Int -> Bool denoting functions taking an integer and returning a Boolean. In C, a function is not a first-class data type but function pointers can be manipulated by the program. Java and C++ originally did not have function values but have added them in C++11 and Java 8.

Type constructors

Un constructor de tipos crea nuevos tipos a partir de otros ya existentes, y puede considerarse como un operador que recibe cero o más tipos como argumentos y produce un tipo. Los tipos producto, los tipos función, los tipos potencia y los tipos lista pueden convertirse en constructores de tipos.

Tipos cuantificados

Los tipos cuantificados universalmente y existencialmente se basan en la lógica de predicados . La cuantificación universal se escribe comoincógnita.F(incógnita){\displaystyle \forall xf(x)}o forall x. f xy es la intersección sobre todos los tipos xdel cuerpo f x, es decir, el valor es de tipo f xpara cada x. Cuantificación existencial escrita comoincógnita.F(incógnita){\displaystyle \exists xf(x)}o exists x. f xy es la unión sobre todos los tipos xdel cuerpo f x, es decir, el valor es de tipo f xpara algunos x.

En Haskell, se suele utilizar la cuantificación universal, pero los tipos existenciales deben codificarse mediante una transformación exists a. f aa forall r. (forall a. f a -> r) -> run tipo similar.

Tipos de refinamiento

Un tipo de refinamiento es un tipo dotado de un predicado que se supone que se cumple para cualquier elemento del tipo refinado. Por ejemplo, el tipo de números naturales mayores que 5 se puede escribir como{nortenorte|norte>5}{\displaystyle \{n\in \mathbb {N} \,|\,n>5\}}

Tipos dependientes

Un tipo dependiente es aquel cuya definición depende de un valor. Dos ejemplos comunes de tipos dependientes son las funciones dependientes y los pares dependientes. El tipo de retorno de una función dependiente puede depender del valor (no solo del tipo) de uno de sus argumentos. Un par dependiente puede tener un segundo valor cuyo tipo depende del primero.

Tipos de intersección

Un tipo de intersección es un tipo que contiene aquellos valores que son miembros de dos tipos especificados. Por ejemplo, en Java la clase Booleanimplementa tanto la interfaz Serializablecomo la Comparableinterfaz. Por lo tanto, un objeto de tipo Booleanes un miembro del tipo Serializable & Comparable. Considerando los tipos como conjuntos de valores, el tipo de intersecciónστ{\displaystyle \sigma \cap \tau }es la intersección de la teoría de conjuntos deσ{\displaystyle \sigma }yτ{\displaystyle \tau }. También es posible definir un tipo de intersección dependiente, denotado(incógnita:σ)τ{\displaystyle (x:\sigma )\cap \tau }, donde el tipoτ{\displaystyle \tau }puede depender de la variable del términoincógnita{\displaystyle x}. [ 14 ]

Metatipos

Algunos lenguajes de programación representan la información de tipo como datos, lo que permite la introspección de tipos y la programación reflexiva (reflexión). En cambio, los sistemas de tipos de orden superior , si bien permiten construir tipos a partir de otros tipos y pasarlos a funciones como valores, generalmente evitan basar las decisiones computacionales en ellos.

Tipos de conveniencia

Para mayor comodidad, los lenguajes de alto nivel y las bases de datos pueden proporcionar tipos de datos "del mundo real" ya hechos, por ejemplo, horas, fechas y valores monetarios (moneda). [ 15 ] [ 16 ] Estos pueden estar integrados en el lenguaje o implementados como tipos compuestos en una biblioteca. [ 17 ]

Véase también

Referencias

  1. Parnas, Shore y Weiss 1976 .
  2. escribir en el Diccionario en línea gratuito de informática
  3. Shaffer, CA (2011). Estructuras de datos y análisis de algoritmos en C++ (3.ª  ed.). Mineola, NY: Dover. 1.2. ISBN 978-0-486-48582-9.
  4. Scott, Dana (septiembre de 1976). "Tipos de datos como retículos". SIAM Journal on Computing . 5 (3): 540– 541. doi : 10.1137/0205037 .
  5. "Rust RFCs - Desbordamiento de enteros" . El lenguaje de programación Rust. 12 de agosto de 2022.
  6. Dale, Nell B.; Weems, Chip; Headington, Mark R. (1998). Programación en C++ . Jones & Bartlett Learning. pág. 349. ISBN  978-0-7637-0537-4.
  7. ISO/IEC 11404 , 6.4
  8. BHATNAGAR, SEEMA (19 de agosto de 2008). LIBRO DE TEXTO DE CIENCIAS DE LA COMPUTACIÓN PARA EL 11.º GRADO . PHI Learning Pvt. Ltd. pág. 182. ISBN  978-81-203-2993-5.
  9. "SC22/WG14 N2176" (PDF) . Wayback Machine. Sección 6.2.6.2. Archivado del original (PDF) el 30 de diciembre de 2018. Cuál de [signo y magnitud, complemento a dos, complemento a uno] se aplica depende de la implementación.
  10. "Pruebas de rendimiento con enteros — documentación de mp++ 0.27" . bluescarni.github.io .
  11. "6 tipos y clases predefinidos" . www.haskell.org . Consultado el 15 de junio de 2022 .
  12. Suresh, S P. "Programación en Haskell: Lección 22" (PDF) . Instituto Matemático de Chennai . Consultado el 10 de agosto de 2022 .
  13. Flanagan, David (1997). "6.2 Funciones como tipos de datos". JavaScript: la guía definitiva (2.ª ed.). Cambridge: O'Reilly & Associates. ISBN  9781565922341.
  14. Kopylov, Alexei (2003). "Intersección dependiente: una nueva forma de definir registros en la teoría de tipos". 18.º Simposio IEEE sobre Lógica en Ciencias de la Computación . LICS 2003. IEEE Computer Society. pp. 86–95 . CiteSeerX 10.1.1.89.4223 . doi : 10.1109/LICS.2003.1210048 .  
  15. West, Randolph (27 de mayo de 2020). "Cómo almacena SQL Server los tipos de datos: money" . Born SQL . Recuperado el 28 de enero de 2022. Hace algún tiempo describí MONEY como un tipo de datos de "conveniencia" que es, en efecto, lo mismo que DECIMAL(19,4), [...]
  16. "Introducción a los tipos de datos y propiedades de campo" . support.microsoft.com . Consultado el 28 de enero de 2022 .
  17. Wickham, Hadley (2017). "16 Fechas y horas" . R para la ciencia de datos: importar, ordenar, transformar, visualizar y modelar datos . Sebastopol, CA. ISBN 978-1491910399Consultado el 28 de enero de 2022 .{{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace )

Lecturas adicionales

  • Parnas, David L.; Shore, John E.; Weiss, David (1976). "Tipos abstractos definidos como clases de variables". Actas de la conferencia de 1976 sobre Datos  : Abstracción, definición y estructura . pp. 149–154 . doi : 10.1145/800237.807133 . S2CID 14448258 .  
  • Cardelli, Luca ; Wegner, Peter (diciembre de 1985). "Sobre la comprensión de los tipos, la abstracción de datos y el polimorfismo" ( PDF) . ACM Computing Surveys . 17 (4): 471–523 . CiteSeerX 10.1.1.117.695 . doi : 10.1145/6041.6042 . ISSN 0360-0300 . S2CID 2921816. Archivado (PDF) del original el 3 de diciembre de 2008 .   
  • Cleaveland, J. Craig (1986). Introducción a los tipos de datos . Addison-Wesley. ISBN 978-0201119404.
  • Logotipo de Wikimedia CommonsContenido multimedia relacionado con los tipos de datos en Wikimedia Commons