Articulo de referencia

Registro (informática)

En informática , un registro (también llamado estructura , struct , tipo definido por el usuario (UDT) o tipo de datos compuesto ) es una estructura de datos compuesta : una col...

En informática , un registro (también llamado estructura , struct , tipo definido por el usuario (UDT) o tipo de datos compuesto ) es una estructura de datos compuesta : una colección de campos , posiblemente de diferentes tipos de datos , generalmente fijos en número y secuencia. [ 1 ]

Por ejemplo, una fecha podría almacenarse como un registro que contenga un campo numérico para el año , un campo para el mes representado como una cadena de texto y un campo numérico para el día del mes . Un registro circular podría contener un radio numérico y un centro que sea un registro de punto con coordenadas x e y .

Entre las aplicaciones más destacadas se encuentran el tipo de registro del lenguaje de programación y, para el almacenamiento basado en filas, los datos organizados como una secuencia de registros, como una tabla de base de datos , una hoja de cálculo o un archivo de valores separados por comas (CSV). En general, un valor de tipo registro se almacena en memoria y el almacenamiento basado en filas se realiza en almacenamiento masivo .

Un tipo de registro es un tipo de dato que describe dichos valores y variables. La mayoría de los lenguajes de programación modernos permiten al programador definir nuevos tipos de registro. La definición incluye especificar el tipo de dato de cada campo y un identificador (nombre o etiqueta) mediante el cual se puede acceder a él. En la teoría de tipos , generalmente se prefieren los tipos de producto (sin nombres de campo) debido a su simplicidad, pero los tipos de registro propiamente dichos se estudian en lenguajes como System F-sub . Dado que los registros de la teoría de tipos pueden contener campos de primera clase con tipo de función además de datos, pueden expresar muchas características de la programación orientada a objetos .

Terminología

En el contexto del almacenamiento, como en una base de datos o una hoja de cálculo , un registro se suele denominar fila y cada campo se denomina columna . [ 2 ] [ 3 ] [ 4 ] [ 5 ]

En la programación orientada a objetos , un objeto es un registro que contiene campos de estado y de método.

Un registro es similar a una tupla matemática , aunque una tupla puede o no considerarse un registro, y viceversa, dependiendo de las convenciones y del lenguaje de programación. De igual modo, un tipo de registro puede verse como el análogo en lenguaje informático del producto cartesiano de dos o más conjuntos matemáticos , o la implementación de un tipo de producto abstracto en un lenguaje específico.

Un registro se diferencia de una matriz en que los elementos (campos) de un registro están determinados por la definición del registro y pueden ser heterogéneos, mientras que una matriz es una colección de elementos del mismo tipo. [ 6 ]

Los parámetros de una función pueden considerarse colectivamente como los campos de un registro, y el paso de argumentos a la función puede verse como la asignación de los parámetros de entrada a los campos del registro. A un nivel básico, una llamada a una función incluye un registro de activación o marco de llamada , que contiene los parámetros, así como otros campos como variables locales y la dirección de retorno.

Historia

Hoja de registro del censo de Estados Unidos de 1880 , que muestra datos tabulares con filas de datos, cada una de las cuales corresponde a un registro de una sola persona.

El concepto de registro se remonta a diversos tipos de tablas y libros de contabilidad utilizados desde tiempos remotos. La noción moderna de registros en informática, con campos de tipo y tamaño bien definidos, ya estaba implícita en las calculadoras mecánicas del siglo XIX, como la Máquina Analítica de Babbage . [ 7 ] [ 8 ]

Tarjeta perforada Hollerith (1895)

El soporte original legible por máquina utilizado para datos (a diferencia del control) fue la tarjeta perforada utilizada para los registros en el censo de los Estados Unidos de 1890 : cada tarjeta perforada era un registro individual. Compárese la entrada del diario de 1880 con la tarjeta perforada de 1895. Los registros estaban bien establecidos en la primera mitad del siglo XX, cuando la mayor parte del procesamiento de datos se realizaba utilizando tarjetas perforadas. Normalmente, cada registro de un archivo de datos se registraba en una tarjeta perforada, con columnas específicas asignadas a campos específicos. Generalmente, un registro era la unidad más pequeña que se podía leer desde un almacenamiento externo (por ejemplo, lector de tarjetas, cinta o disco). El contenido de los registros de tipo tarjeta perforada se denominaba originalmente "registros unitarios" porque las tarjetas perforadas tenían longitudes de documento predeterminadas. [ 9 ] Cuando los sistemas de almacenamiento se volvieron más avanzados con el uso de discos duros y cinta magnética , los registros de longitud variable se convirtieron en el estándar. Un registro de longitud variable es un registro en el que el tamaño del registro en bytes es aproximadamente igual a la suma de los tamaños de sus campos. Esto no era posible antes de que se inventaran dispositivos de almacenamiento más avanzados, ya que todas las tarjetas perforadas tenían que ajustarse a longitudes de documento predeterminadas que el ordenador pudiera leer, puesto que en aquel entonces las tarjetas tenían que introducirse físicamente en una máquina.

La mayoría de las implementaciones de lenguaje máquina y los primeros lenguajes ensamblador no tenían una sintaxis especial para los registros, pero el concepto estaba disponible (y se usaba ampliamente) mediante el uso de registros de índice , direccionamiento indirecto y código automodificable . Algunas computadoras antiguas, como la IBM 1620 , tenían soporte de hardware para delimitar registros y campos, e instrucciones especiales para copiar dichos registros.

El concepto de registros y campos fue fundamental en algunas de las primeras utilidades de clasificación y tabulación de archivos , como el Generador de Programas de Informes (RPG) de IBM .

COBOL fue el primerlenguaje de programaciónen admitir tipos de registro, [ 10 ] y sus funciones de definición de registros eran bastante sofisticadas para la época. El lenguaje permite definir registros anidados con campos alfanuméricos, enteros y fraccionarios de tamaño y precisión arbitrarios, y campos que formatean automáticamente cualquier valor que se les asigne (por ejemplo, inserción de símbolos de moneda, puntos decimales y separadores de grupos de dígitos). Cada archivo está asociado a una variable de registro donde se leen o escriben los datos. COBOL también proporciona unaMOVECORRESPONDINGinstrucción que asigna campos correspondientes de dos registros según sus nombres.

Los primeros lenguajes desarrollados para la computación numérica, como FORTRAN (hasta FORTRAN IV ) y ALGOL 60 , no admitían tipos de registro; pero versiones posteriores de esos lenguajes, como Fortran 90 y ALGOL 68, sí los agregaron. El lenguaje de programación Lisp original también carecía de registros (excepto por la celda cons integrada ), pero sus expresiones S proporcionaron un sustituto adecuado. El lenguaje de programación Pascal fue uno de los primeros lenguajes en integrar completamente los tipos de registro con otros tipos básicos en un sistema de tipos lógicamente consistente. El lenguaje PL/I proporcionó registros al estilo COBOL. El lenguaje C proporciona el concepto de registro usando structs . La mayoría de los lenguajes diseñados después de Pascal (como Ada , Modula y Java ), también admitían registros. Java introdujo registros en Java 17 y C# introdujo registros en C#. Los registros se introdujeron en Java para simplificar las clases de agregación de datos con menos código repetitivo, haciendo que todos los campos finaly private, generando automáticamente constructores con todos los argumentos, getters y los métodos , , y . Los registros Java extienden implícitamente todos .booleanequals()inthashCode()StringtoString()java.lang.Record

Aunque los registros ya no se usan con frecuencia en su contexto original (es decir, usándose únicamente para contener datos), influyeron en los lenguajes de programación orientados a objetos y los sistemas de gestión de bases de datos relacionales más recientes . Dado que los registros proporcionaban mayor modularidad en la forma en que se almacenaban y manejaban los datos, son más adecuados para representar conceptos complejos del mundo real que los tipos de datos primitivos proporcionados por defecto en los lenguajes. Esto influyó en lenguajes posteriores como C++ , Python , JavaScript y Objective-C , que abordan las mismas necesidades de modularidad de la programación. [ 11 ] Los objetos en estos lenguajes son esencialmente registros con la adición de métodos y herencia , lo que permite a los programadores manipular la forma en que se comportan los datos en lugar de solo el contenido de un registro. Muchos programadores consideran que los registros están obsoletos ahora, ya que los lenguajes orientados a objetos tienen características que superan con creces las capacidades de los registros. Por otro lado, muchos programadores argumentan que la baja sobrecarga y la capacidad de usar registros en lenguaje ensamblador hacen que los registros sigan siendo relevantes al programar con bajos niveles de abstracción . Hoy en día, los lenguajes más populares en el índice TIOBE , un indicador de la popularidad de los lenguajes de programación, se han visto influenciados de alguna manera por los registros debido a que son orientados a objetos. [ 12 ] Los lenguajes de consulta como SQL y Object Query Language también se vieron influenciados por el concepto de registros. Estos lenguajes permiten al programador almacenar conjuntos de datos, que son esencialmente registros, en tablas. [ 13 ] Estos datos se pueden recuperar utilizando una clave primaria . Las tablas mismas también son registros que pueden tener una clave foránea : una clave que hace referencia a datos en otra tabla.

Tipo de registro

Operaciones

Las operaciones para un tipo de registro incluyen:

  • Declaración de un tipo de registro, incluyendo la posición, el tipo y (posiblemente) el nombre de cada campo.
  • Declaración de un registro; una variable tipificada como un tipo de registro.
  • Construcción de un valor de registro; posiblemente con inicialización de valor de campo.
  • Leer y escribir el valor del campo del registro
  • Comparación de dos registros de igualdad
  • Cálculo de un valor hash estándar para el registro.

Algunos lenguajes proporcionan herramientas que permiten enumerar los campos de un registro. Esta herramienta es necesaria para implementar ciertos servicios como la depuración , la recolección de basura y la serialización . Requiere cierto grado de polimorfismo de tipos .

En contextos que admiten subtipos de registros, las operaciones incluyen agregar y eliminar campos de un registro. Un tipo de registro específico implica que está presente un conjunto específico de campos, pero los valores de ese tipo pueden contener campos adicionales. Un registro con los campos x , y y z pertenecería, por lo tanto, al tipo de registros con los campos x e y , al igual que un registro con los campos x , y y r . La razón es que pasar un registro ( x , y , z ) a una función que espera un registro ( x , y ) como argumento debería funcionar, ya que esa función encontrará todos los campos que necesita dentro del registro. Muchas formas prácticas de implementar registros en lenguajes de programación tendrían problemas para permitir tal variabilidad, pero este es un aspecto central de los tipos de registro en contextos más teóricos.

Tarea y comparación

La mayoría de los lenguajes permiten la asignación entre registros que tienen exactamente el mismo tipo (incluidos los mismos tipos y nombres de campos, en el mismo orden). Sin embargo, dependiendo del lenguaje, dos tipos de datos de registro definidos por separado pueden considerarse tipos distintos, incluso si tienen exactamente los mismos campos.

Algunos lenguajes también permiten la asignación entre registros cuyos campos tienen nombres diferentes, haciendo coincidir cada valor de campo con la variable de campo correspondiente según su posición dentro del registro; de modo que, por ejemplo, un número complejo con campos llamados realy imagpuede asignarse a una variable de registro de punto 2DX con campos y Y. En esta alternativa, los dos operandos aún deben tener la misma secuencia de tipos de campo. Algunos lenguajes también pueden requerir que los tipos correspondientes tengan el mismo tamaño y codificación, de modo que todo el registro pueda asignarse como una cadena de bits sin interpretar . Otros lenguajes pueden ser más flexibles en este sentido y solo requieren que cada campo de valor pueda asignarse legalmente al campo de variable correspondiente; de ​​modo que, por ejemplo, un campo entero corto puede asignarse a un campo entero largo , o viceversa.

Otros lenguajes (como COBOL ) pueden hacer coincidir campos y valores por sus nombres, en lugar de por sus posiciones.

Estas mismas posibilidades se aplican a la comparación de dos valores registrados para determinar su igualdad. Algunos lenguajes también permiten comparaciones de orden (' < ' y ' > '), utilizando el orden lexicográfico basado en la comparación de campos individuales.

PL/I permite ambos tipos de asignación anteriores, y también permite expresiones de estructura , como por ejemplo a = a+1;donde "a" es un registro o una estructura en la terminología de PL/I.

Selección de campo distributiva de Algol 68

En Algol 68, si Ptsera una matriz de registros, cada uno con campos enteros Xy Y, se podía escribir para obtener una matriz de enteros, que consistía en los campos de todos los elementos de . Como resultado, las instrucciones y tendrían el mismo efecto.Y of PtsYPtsY of Pts[3] := 7(Y of Pts)[3] := 7

La declaración "con" de Pascal

En Pascal , el comando with R do Sejecutaría la secuencia de comandos Scomo si todos los campos del registro Rse hubieran declarado como variables. De forma similar a entrar en un espacio de nombres diferente en un lenguaje orientado a objetos como C# , ya no es necesario usar el nombre del registro como prefijo para acceder a los campos. Así que, en lugar de escribir se podría escribir .Pt.X := 5; Pt.Y := Pt.X + 3withPtdobeginX:=5;Y:=X+3end

Representación en la memoria

La representación de un registro en memoria varía según el lenguaje de programación. A menudo, los campos se almacenan en ubicaciones de memoria consecutivas, en el mismo orden en que se declaran en el tipo de registro. Esto puede resultar en que dos o más campos se almacenen en la misma palabra de memoria; de hecho, esta característica se usa frecuentemente en la programación de sistemas para acceder a bits específicos de una palabra. Por otro lado, la mayoría de los compiladores agregan campos de relleno, generalmente invisibles para el programador, para cumplir con las restricciones de alineación impuestas por la máquina; por ejemplo, que un campo de punto flotante debe ocupar una sola palabra.

Algunos lenguajes pueden implementar un registro como una matriz de direcciones que apuntan a los campos (y, posiblemente, a sus nombres y/o tipos). Los objetos en los lenguajes orientados a objetos a menudo se implementan de maneras bastante complejas, especialmente en lenguajes que permiten la herencia de múltiples clases .

Registros autodefinitorios

Un registro autodefinitivo es un tipo de registro que contiene información para identificar el tipo de registro y localizar información dentro del mismo. Puede contener los desplazamientos de los elementos; por lo tanto, los elementos pueden almacenarse en cualquier orden o pueden omitirse. [ 14 ] La información almacenada en un registro autodefinitivo puede interpretarse como metadatos para el registro, similares a los que se encontrarían en los metadatos UNIX de un archivo, que contienen información como la hora de creación del registro y su tamaño en bytes . Alternativamente, varios elementos del registro, cada uno con un identificador de elemento, pueden simplemente seguirse en cualquier orden.

Campo clave

Un registro, especialmente en el contexto del almacenamiento basado en filas, puede incluir campos clave que permiten indexar los registros de una colección. Una clave primaria es única en todos los registros almacenados; solo existe una de estas claves. [ 15 ] En otras palabras, no puede existir ninguna clave primaria duplicada. Por ejemplo, un archivo de empleados podría contener el número de empleado, el nombre, el departamento y el salario. El número de empleado será único en la organización y será la clave primaria. Dependiendo del medio de almacenamiento y la organización del archivo, el número de empleado podría estar indexado , es decir, almacenado en un archivo separado para agilizar la búsqueda. El código del departamento no es necesariamente único; también puede estar indexado, en cuyo caso se consideraría una clave secundaria o alternativa . [ 16 ] Si no está indexado, habría que escanear todo el archivo de empleados para obtener una lista de todos los empleados de un departamento específico. Las claves suelen elegirse de forma que se minimicen las posibilidades de que una misma clave pueda asignar varios valores. Por ejemplo, el campo de salario normalmente no se consideraría útil como clave, ya que es probable que muchos empleados tengan el mismo salario.

Véase también

Referencias

  1. ^ Felleisen, Matías (2001). Cómo diseñar programas . Prensa del MIT. págs.53 , 60. ISBN  978-0262062183.
  2. "Definiciones del diccionario de informática" . Estudiantes de informática . Consultado el 22 de enero de 2018 .
  3. Radványi, Tibor (2014). Sistemas de gestión de bases de datos . Colegio Eszterházy Károly. pag. 19. Archivado desde el original el 23 de septiembre de 2018 . Consultado el 23 de septiembre de 2018 . 
  4. Kahate, Atul (2006). Introducción a los sistemas de gestión de bases de datos . Pearson. pág. 3. ISBN  978-81-317-0078-5Consultado el 23 de septiembre de 2018 .
  5. Connolly, Thomas (2004). Soluciones de bases de datos: Guía paso a paso para la creación de bases de datos (2.ª ed.). Pearson. pág . 7. ISBN   978-0-321-17350-8.
  6. Pape, Tobias; Kirilichev, Vasily; Bolz, Carl Friedrich; Hirschfeld, Robert (2017-01-13). "Estructuras de datos de registro en racket: análisis de uso y optimización" . ACM SIGAPP Applied Computing Review . 16 (4): 25– 37. doi : 10.1145/3040575.3040578 . ISSN 1559-6915 . S2CID 14306162 .  
  7. Bromley, Allan (octubre de 1998). "La máquina analítica de Charles Babbage, 1838" . IEEE Annals of the History of Computing . 20 (4): 29– 45. doi : 10.1109/85.728228 . S2CID 2285332. Recuperado el 23 de septiembre de 2018 . 
  8. Swade, Doron. "Computación automática: Charles Babbage y el método computacional" . The Rutherford Journal . Consultado el 23 de septiembre de 2018 .
  9. Edwin D. Reilly; Anthony Ralston; David Hemmendinger, eds. (2003). Enciclopedia de informática (4.ª ed.). Chichester, Reino Unido: Wiley. ISBN  978-1-84972-160-8OCLC 436846454 
  10. Sebesta, Robert W. (1996). Conceptos de lenguajes de programación (Tercera ed.). Addison-Wesley Publishing Company, Inc. pág . 218. ISBN   0-8053-7133-8.
  11. Leavens, Gary T.; Weihl, William E. (1990). «Razonamiento sobre programas orientados a objetos que utilizan subtipos» . Actas de la conferencia europea sobre programación orientada a objetos: Sistemas, lenguajes y aplicaciones de programación orientada a objetos - OOPSLA/ECOOP '90 . Nueva York, Nueva York, EE. UU.: ACM Press. págs. 212–223 . doi : 10.1145/97945.97970 . ISBN  0-201-52430-9. S2CID 46526 . 
  12. "Índice: La empresa de calidad de software" . TIOBE.com . Consultado el 1 de marzo de 2022 .
  13. "¿Qué es una base de datos relacional (RDBMS)?" . Oracle . Consultado el 28 de febrero de 2022 .
  14. Kraimer, Martin R. "Guía del desarrollador de aplicaciones del controlador de entrada/salida (IOC) de EPICS" . Laboratorio Nacional Argonne . Consultado el 25 de noviembre de 2015 .
  15. "Agregar o cambiar la clave principal de una tabla en Access" . support.microsoft.com . Consultado el 1 de marzo de 2022 .
  16. "Clave alternativa - Preguntas frecuentes de Oracle" . www.orafaq.com . Consultado el 1 de marzo de 2022 .