3 Sistemas de Tipos de Datos
3 Sistemas de Tipos de Datos
3 Sistemas de Tipos de Datos
Equipo de Profesores:
Gabriel Carmona Tabja - Jorge Díaz Matte – Roberto Díaz Urra
José Luis Martí Lara – Rodrigo Salas Fuentes
1
Unidad 3
Tipos de Datos
3
Sistema de Tipos de Datos
4
Tipos de Datos
5
Tipos de Datos
Ejemplos:
• Primitivos (ej.: enteros, punto flotante y caracteres)
• Estructurados (ej.: arreglos y registros)
• Definidos por usuario (más legible y seguro)
• Abstractos (modulariza datos y código)
6
Taxonomía de Tipos de Datos
Numérico
Booleano Primitivo
Lista
Ordenadas
Caracter
Ordinal Tupla
Subrango Colecciones
Definido por Conjunto
usuario
Enumerado
No Arreglo
ordenadas Asociativo
TIPOS DE
….
Arreglo
DATOS
String Puntero
Estructurado
Registro Direcciones
Union Referencia
7
Conceptos básicos
DEFINICIONES:
• Chequeo o Verificación de tipo: asegurar que los operandos de un
operador son de tipos compatibles.
• Tipo compatible: es un tipo legal, o que mediante reglas del lenguaje
puede ser convertido en uno legal.
• Conversión de tipos: se denomina coerción a la conversión automática y
casting a la conversión definida por el programador.
• Error de tipo: la aplicación de un operador a un tipo inapropiado.
8
Equivalencia de Tipos
10
Compatibilidad de Tipos en Estructuras
==========================================================
TYPE
celsius = real;
fahrenheit = real;
{otro ejemplo}
TYPE
tipo1 = ARRAY [1..10] OF integer;
tipo2 = ARRAY [1..10] OF integer; {tipo1 <> tipo2}
tipo3 = tipo2; {equivalencia declarativa} 11
Compatibilidad de Tipos en Estructuras
s1 x;
s2 y = x; /* error de compatibilidad */
========================================================
char* p3 = p1;
12
Taxonomía de los Tipos de Datos: Tipificación
15
Tipificación Fuerte vs. Débil (1)
Tipificación estática:
• Eficiencia de ejecución: permite al compilador asignar memoria y
generar código que manipule los datos eficientemente.
• Seguridad y confiabilidad: permite detectar mayor número de errores, y
por lo tanto reducir errores de ejecución. También permite verificar
mejor compatibilidad de interfaces en la integración de
módulos/componentes de programa.
Tipificación explícita:
• Legibilidad: se mejora, al documentar bien los tipos usados en el
programa.
• Ambigüedad: permite eliminar ambigüedades que podrían surgir en el
proceso de traducción.
17
Tipificación Fuerte vs. Débil (3):
19
Numérico
Booleano Primitivo
Lista
Ordenadas
Caracter
Ordinal Tupla
Subrango Colecciones
Definido Conjunto
por usuario
Enumerado
No Arreglo
ordenadas Asociativo
TIPOS DE
….
Arreglo
DATOS
String Puntero
Estructurado
Registro Direcciones
Union Referencia
20
Tipo Ordinal o simple
21
Tipos Primitivos (1)
22
Tipos Primitivos (2)
• Caracter:
• Tamaño de un byte; típicamente código ASCII (ej.: ISO 8859)
• Tamaño variable (UTF-8 hasta 6 Bytes)
• Unicode con 16b (UTF-16) usado en Java, o 32b (UTF-32)
23
Tipos Primitivos: Representación de Números (1)
CARACTERÍSTICAS:
• Conjunto finito y una aproximación al concepto matemático.
• Rango de representación y precisión depende del largo del registro.
• Soporte directo del hardware para varios tipos básicos.
24
Tipos Primitivos: Representación de Números (2)
TIPOS:
• Números enteros (ej.: representación C-2, C-1).
• Números de punto flotante: representa una aproximación a números
reales (ej.: estándar IEEE 754).
• Decimal: Típicamente para aplicaciones de negocios (ej.: COBOL usa 4
bits en código BCD). Es más preciso para manipular números en base
10, pero ocupa más memoria.
• Complejo. Algunos lenguajes lo soportan y lo representan como dos
números de punto flotante (ej.: Python y Scheme).
25
Tipos Primitivos: Representación de Números (3)
s e m
26
Tipos Primitivos: Representación del Tipo Caracter
28
Tipos Definidos por el Usuario (2): Enumerado
Ejemplos en C y C++
Sintaxis:
Código:
enum color {rojo, amarillo, verde=20, azul};
color col = rojo;
color* cp = &col;
Booleano Primitivo
Lista
Ordenadas
Caracter
Ordinal Tupla
Subrango Colecciones
Definido Conjunto
por usuario
Enumerado
No Arreglo
ordenadas Asociativo
TIPOS DE
….
Arreglo
DATOS
String Puntero
Estructurado
Registro Direcciones
Union Referencia
31
Tipo Arreglo
32
Tipo Arreglo: índices
33
Tipo Arreglo: índices
34
Tipo Arreglo: ligado (1)
35
Tipo Arreglo: ligado (2)
37
Tipo Arreglo: ligado (4)
• Java int[] unArreglo = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
String[] nombres = {"Pedro", "Maria", "Jose"};
39
Tipo Arreglo: multidimensionales
• C y C++:
real matriz [DIM1][DIM2];
40
Tipo Arreglo: operadores
41
Tipo Arreglo: implementación
42
Tipo String (1)
43
Tipo String (2)
Operaciones típicas:
• Asignación, copia y concatenación
• Largo y comparación
• Referencia a substring
• Reconocimiento de patrón
44
Tipo String (3)
…
if (strcmp(str, "Hola")){
…
else {
…
}
Ejemplo: Java
45
Tipo String (4): largo
46
Numérico
Booleano Primitivo
Lista
Ordenadas
Caracter
Ordinal Tupla
Subrango Colecciones
Definido Conjunto
por usuario
Enumerado
No Arreglo
ordenadas Asociativo
TIPOS DE
….
Arreglo
DATOS
String Puntero
Estructurado
Registro Direcciones
Union Referencia
47
Tipo Registro
48
Tipo Registro: ejemplos
COBOL: el tipo registro fue introducido por COBOL, que forma parte de la
DATA DIVISION del programa; usa números de nivel para definir una
jerarquía estructurada del registro.
01 EMP-REC.
02 EMP-NAME.
05 FIRST PIC X(20).
05 MID PIC X(10).
05 LAST PIC X(20).
02 HOURLY-RATE PICTURE IS 99V99.
49
Tipo Registro: ejemplos
Emp_Rec: Emp_Rec_Type;
50
Tipo Registro: ejemplos
Pascal:
TYPE empleado_t = RECORD
nombre : RECORD
primer: PACKED ARRAY [1.10] OF char;
paterno: PACKED ARRAY [1.10] OF char;
materno: PACKED ARRAY [1.10] OF char;
END {nombre};
sueldo : real
END;
VAR empleado1 : empleado_t;
BEGIN
…
empleado1.sueldo := 550000.00;
…
END. 51
Tipo Registro: ejemplos
C, C++:
typedef struct {
struct {
char primer[10];
char paterno[10];
char materno[10];
} nombre;
float sueldo;
} empleado_t;
empleado_t empleado1;
empleado1.sueldo = 550000.00;
strcpy(empleado.nombre.primer, “Juan”);
52
Referencias Elípticas
55
Tipo Union: ejemplos
C y C++:
union dirección
{ IP
char dominio[20];
Dominio
int IP[4];
};
56
Tipo Union: ejemplos
typedef enum {CARTESIANO, POLAR} coordenada_t;
struct complejo_t {
coordenada_t tipo_coord; // discriminadores
union {
struct{real rad,ang;} p;
struct{real x,y;} c;
} tag;
} u,v;
if (u.tipo_coord == POLAR) {
u.tag.p.ang = PI/2; // más engorroso
u.polar.rad = 34.7; // mejor lectura
}
57
Tipo Union: ejemplos
ADA:
type Colors is (Red, Green, Blue);
58
Numérico
Booleano Primitivo
Lista
Ordenadas
Caracter
Ordinal Tupla
Subrango Colecciones
Definido Conjunto
por usuario
Enumerado
No Arreglo
ordenadas Asociativo
TIPOS DE
….
Arreglo
DATOS
String Puntero
Estructurado
Registro Direcciones
Union Referencia
3.5 Colecciones
59
Colecciones
61
Tipo Conjunto: ejemplos (1)
Operadores:
[…], +, *, -, [ ] (conjuntos)
Pascal: >=, <= (relacionales)
IN (inclusión)
TYPE caracter = SET OF char;
VAR vocal, letras, no_vocal: caracter;
c : char;
BEGIN
vocal := ['A', 'E', 'I', 'O', 'U'] + ['a', 'e', 'i', 'o', 'u'];
letras := [‘A'..’Z'] + ['a'..'z'];
no_vocal := letras – vocal;
IF (c IN vocal) THEN
…
62
Tipo Conjunto: ejemplos (2)
Operadores:
in ()
Python: | ()
>>> A & B & ()
>>> A = {1, 2, 3, 4, 5} -
>>> B = { 4, 5, 6, 7, 8, 9} {4, 5} ^ (exclusión mutua)
>>> 0 in A >>> A - B
False {1, 2, 3}
>>> 4 in A >>> A ^ B
True {1, 2, 3, 6, 7, 8, 9}
>>> A | B
{1, 2, 3, 4, 5, 6, 7, 8, 9}
63
Tipo Conjunto: ejemplos (3)
64
Tipo Conjunto: ejemplos (4)
import java.util.LinkedList
queue1.add("elemento 1");
queue1.add("elemento 2");
queue1.add("elemento 3");
66
Tipo Arreglo Asociativo
Ejemplo: Python
>>> tel = {'Pedro':123453, 'Maria':234534, 'Juan':453345, 'Ana':645342}
>>> tel
{'Juan': 453345, 'Pedro': 123453, 'Ana': 645342, 'Maria': 234534}
>>> tel['Juan']
453345 >>> 'Pedro' in tel
>>> list(tel.keys()) True
>>> ‘Catalina' in tel
['Juan', 'Pedro', 'Ana', 'Maria']
False
>>> sorted(tel.keys()) >>> del tel['Maria']
['Ana', 'Juan', 'Maria', 'Pedro'] >>> tel
{'Juan': 453345, 'Pedro': 123453, 'Ana': 645342}
67
Numérico
Booleano Primitivo
Lista
Ordenadas
Caracter
Ordinal Tupla
Subrango Colecciones
Definido Conjunto
por usuario
Enumerado
No Arreglo
ordenadas Asociativo
TIPOS DE
….
Arreglo
DATOS
String Puntero
Estructurado
Registro Direcciones
Union Referencia
68
Tipo Puntero
69
Tipo Puntero: Operaciones
CLASES DE OPERADORES:
• Asignación: asigna como valor a una variable la dirección a algún objeto
de memoria del programa.
• Desreferenciación: entrega el valor almacenado en el objeto apuntado.
Puede ser explícito o implícito.
Ejemplo en C: 7023
432
int *ptr, j;
ptr = (int*) malloc(sizeof(int)); 2145
ptr
*ptr = 432;
j = *ptr; 2127
j 432
70
Tipo Puntero: C y C++
72
Tipo Puntero: C y C++
pa = &a[0];
pa = a; /* hace lo mismo que la línea anterior */
for (int i=0; i<10; i++) /* los tres for hacen lo mismo */
printf(a[i]);
for (int i=0; i<10; i++) /* los tres for hacen lo mismo */
printf(*(pa+i));
for (int i=0; i<10; i++) /* los tres for hacen lo mismo */
printf(*(a+i));} 73
Administrador de memoria simple,
Tipo Puntero: C que maneja un stack en memoria estática
75
Tipo Referencia: C++
Características:
• Variable de referencia se inicializa con una dirección en el momento de
declararla o definirla.
• Referencia permanece constante, actuando como un alias.
• Cuando se realiza una asignación, no se requiere desreferenciar la
variable.
• Ejemplo:
int valor = 3;
int &ref_valor = valor; /* inicializa */
ref_valor = 100;
76
Tipo Referencia: C++ y Parámetros en Funciones
void swap(int *a, int *b) void swap(int &a, int &b)
{ {
int tmp = *a; int tmp = a;
*a = *b; a = b;
*b = tmp; b = tmp;
} }
... ...
int a, b; int a, b;
swap(&a,&b); swap(a,b);
... ...
77
Tipo Referencia: Java
Comentarios:
• En Java las referencias son variables que apuntan a objetos, y no
permiten otro uso (sólo tipos primitivos de datos usan semántica de
valor para las variables).
• No existe operador de desreferenciación.
• Una asignación provoca que apunte a nuevo objeto.
Ejemplo:
Punto a;
a = new Punto(3, 4);
Punto b = a;
Punto c = new Punto(7, 5);
a = c;
78
Gestión del Heap
79
Gestión del Heap
Basura
• Pérdida de acceso a un objeto de memoria asignado en el heap, por no
existir variables que apunten a él. Sucede porque se asigna una nueva
dirección a la variable puntero que permitía el acceso.
• Produce pérdida o fuga de memoria, que puede causar inestabilidad en
la ejecución del programa.
82
Gestión del Heap : Basura
Basura
• Ejemplo en C:
tipo* p;
p = (tipo *) malloc(sizeof(tipo));
...
p = (tipo *) malloc(sizeof(tipo)); /* se pierde la variable asignada anteriormente */
83
Gestión del Heap : Recolección de Basura
Marcar y barrer:
void* allocate (int n)
{
if (!hay_espacio) { /* aplicar mark&sweep */
1) marcar todos los objetos del heap como basura;
2) for (todo puntero p) { /* barrer */
if (p alcanza objeto o en el heap)
marcar o como NO basura;
} /* for */
3) liberar todos los objetos marcados como basura
}
if (hay_espacio) {
asignar espacio;
return puntero al objeto;
} else return NULL;
} 85
Gestión del Heap : Recolección de Basura
Contadores de referencia:
• Requiere bastante memoria para mantener contadores.
• Asignaciones a punteros requieren de más tiempo de ejecución para mantener
contadores.
• Produce una liberación gradual de la memoria, tan pronto se deja de usarla.
Marcar y barrer:
• Basta un bit por celda para marcar basura, siendo económico.
• Puede producir tiempos muertos significativos que afectan al funcionamiento del
programa.
• Mal desempeño cuando queda poca memoria.
• Desventaja se mitiga si aumenta frecuencia de llamado.
86
Gestión del Heap : Dangling
Dangling
• Un puntero apunta a una localización de memoria del heap que ha sido
liberada (e incluso nuevamente asignada).
• Se pueden producir efectos indeseados y peligrosos para el correcto
funcionamiento del programa.
87
Gestión del Heap : Dangling
p = (ptipo) malloc(sizeof(tipo));
...
q = p;
...
free(p); /* q aun mantiene referencia al heap */
...
*q = x; /* puede que variable de heap sea reasignada */
...
88
Gestión del Heap : Dangling
Métodos de Resolución:
• No permitir liberar memoria explícitamente.
• Lápida sepulcral (tombstone).
• Cerradura y Llave (lock & key).
89
Gestión del Heap : Dangling
Lápida sepulcral:
• Acceso se realiza indirectamente a través de una lápida.
• Si un objeto es liberado, la lápida permanece.
• Son costosos en tiempo y memoria.
Heap
Variables
Tombstones Dinámicas
90
Gestión del Heap : Dangling
Cerradura y Llave:
• Puntero es un par <clave, dirección>.
• Cada objeto de memoria en el heap mantiene una cabecera (cerradura)
que almacena un valor.
• El acceso sólo es permitido si la clave del puntero o referencia coincide
con el valor de la cerradura.
key1 address
Heap
key2 address
lock data
key1 = lock
key2 lock
91
Gestión del Heap : ideas finales
92
Unidad 3
Tipos de Datos
FIN
3.1 Sistemas de Tipos
3.2 Tipos de Datos Ordinales o Simples
3.3 Arreglos y Strings
3.4 Registros y estructuras relacionadas
3.5 Colecciones
3.6 Tipo Puntero y Referencias
93