Tipos de Datos
(Data Types)
Agenda
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Tipos de Datos
Propósito de los tipos
Reglas para Corroborar Tipos
Sistemas de Tipos en un Lenguaje
¿Qué es un Tipo?
Clasificación de los Tipos
Tipos Predefinidos
Enumeración
Subrangos
Unión, Apuntadores y Tipos Recursivos
Tipos Compuestos y Ortogonalidad
Equivalencia de Tipos
Equivalencia Estructural
Nombres Equivalentes
Tipo de Conversión y Cast
Tipo de Compatibilidad y Coerción
Tipos de Datos
• Los computadores manipulan secuencias de
bits.
• Los lenguajes de programación que poseen
tipos de datos aumentan el nivel de abstracción
desde bits a datos.
• La mayoría de los programas manipulan los
datos más generales:
– Números, cadena de caracteres, listas…
Propósito de los Tipos (I)
1. Los tipos proveen un contexto implícito.
2. Lenguajes de alto nivel tienen sistemas de
datos.
3. Los tipos proveen un conjunto de
operaciones semánticamente validas.
4. Un sistema de tipo consiste de:
•
•
Un mecanismo para definir tipos y asociaciones
entre ellas, con constructores del lenguaje.
Un conjunto de reglas para corroborar tipos.
Propósito de los Tipos (II)
• Mejora la legibilidad.
• Ayuda a conseguir errores.
Permiten declarar la “intención de uso” de los objetos
(variables, parámetros, etc.)
Permiten al procesador del lenguaje (compilador o
interpretador) tomar decisiones.
Permiten detección de usos incorrectos de los objetos
(aplicación de operaciones inadecuadas).
Reglas para Corroborar Tipos
Equivalencia: donde dos valores tienen el mismo
tipo
Compatibilidad: donde un valor puede ser usado
en un contexto dado.
Inferencia: son los tipos de expresiones basadas
en partes.
Sistema de Tipo en un Lenguaje
• Los tipos corroboran si el proceso de aseguramiento que un
programa obedece las reglas de compatibilidad de tipos entre
las cuales se encuentran:
Fuertemente Tipeado: Si las reglas del lenguaje permiten
verificar que toda posible aplicación de operación a
objetos sea adecuada.22
Lenguajes
Estáticamente Tipeados: es lo mismo que fuertemente
tipeado, sólo que adicionalmente todas las verificaciones
pueden ser hechas antes de la ejecución de los programas,
o sea, a tiempo de compilación.
Dinámicamente tipeados: algunos lenguajes hacen el
Chequeo a tiempo de ejecución.
¿Qué es un Tipo?
• Declaración: introduce nombres, alcances.
• Definición: describe un tipo de valores para el
cual el nombre esta limitado.
• 3 puntos de vista:
– Denotacional: el tipo es un conjunto de valores.
– Constructivo: es un predefinido (built-in) o un tipo
compuesto.
– Basado en Abstracción: un tipo es una interfaz
que define un conjunto de
operaciones consistentes.
Clasificación de los Tipos
• Predefinidos
Simples
• Enumeración
• Enteros
• Reales
• Booleanos
• Caracteres
• Subrango
Compuestos
• Arreglos
• Registros
• Uniones o Registros Variantes
• Apuntadores y Tipos Recursivos
• Otros
Tipos Predefinidos
• La mayoría de los lenguajes soporta enteros y
flotantes.
– El rango de valores depende de la implementación.
• No todos los lenguajes soportan otros tipos
numéricos
– Números complejos, racionales, de punto fijo, etc.
• Algunos lenguajes distinguen los tipos
numéricos dependiendo de su precisión.
– Simples Vs. De precisión doble.
Enumeración
• Mejora la legibilidad de los programas y el
chequeo de errores.
• La primera vez fue introducida en Pascal
Ej. type diaSemana = (lunes, martes...domingo);
Otros lenguajes usan constantes para definir la
enumeración
• C dispone de una característica similar
Ej. enum diaSemana {lunes, martes…domingo};
Subrangos
• Mejora la lectura de los programas y el
chequeo de errores.
• La primera vez fue introducida en Pascal
Ej.
type test_score = 0..100;
type minuscula = ‘a’..’z’;
• Ellos definen un orden, por tanto pueden ser
usados en enumeraciones de ciclos
controlados.
Unión, Apuntadores y Tipos
Recursivos
Unión: Toma un tipo u otro. En C struct
{
int i
char c;
}
Apuntadores: en Java el uso de apuntadores es implícito
Tipos Recursivos: árboles y listas (Haskell)
data ArbolBinario = vacio Nodo int AB AB
data color = rojo azul negro
Tipos Compuestos y Ortogonalidad
• Los tipos compuestos son creados aplicando
un constructor a uno o más tipos simples.
Ej. Records, listas, archivos, conjuntos, cadenas
de caracteres, arreglos…
• La ortogonalidad es una propiedad importante
en el diseño de sistema de tipo.
• Mientras más un lenguaje soporte
ortogonalidad, tendrá más flexibilidad en los
tipos compuestos.
Equivalencia de Tipos
Definición: noción de que 2 tipos sean exactamente el mismo.
La equivalencia es definida de dos maneras principalmente:
- Equivalencia estructural
- Nombres equivalentes
Dos tipos son estructuralmente equivalentes si ellos tienen tipos de
estructuras idénticas (deben poseer los mismos componentes)
En nombres equivalentes cada definición introduce un nuevo tipo
Equivalencia Estructural (I)
Indique cual de lo siguiente fragmentos de
código son equivalente?
type T1 = record
a,b : integer
end;
type T2 = record
a : integer
b : integer
end;
type T3 = record
b : integer
a : integer
end;
Respuesta: T1 y T2 son equivalentes, pero, T2 y T3 en ML no lo son,
en otros lenguajes si es equivalente.
Equivalencia Estructural (II)
type student = record
name, address : string
age : integer
type school = record
name, address : string
age : integer
x : students
y : school
x := y;
¿Esta asignación sería
considerada un error?
Respuesta: probablemente si, aunque los tipos son
estructuralmente equivalentes.
Nombres Equivalentes (I)
En líneas generales: diferentes nombres
tipos diferentes
TYPE stack_element = INTEGER;
MODULE stack;
IMPORT stack_element;
EXPORT push, pop;
PROCEDURE push (elem : stack_element);
….
PROCEDURE pop () : stack_element;
….
VAR x : stack_element
X = pop +1;
En este ejemplo stack_element y integer podrían ser equivalentes
Nombres Equivalentes (II)
Variantes
- Estricta
- Relajada (loose)
La cantidad de lenguajes que usan loose ha aumentado (Pascal)
Ada – permite a los programadores decidir entre cual alias escoger
un tipo derivado o un subtipo
subtype stack_element is integer;
type celsius_temp is new real;
type fahrenheit_temp is new real;
Los subtipo son equivalentes a el tipo de sus padres y a sus hermanos tipos
Los tipos derivados son nuevos tipos
Tipo de Conversión y Cast (I)
- Los tipos pueden ser estructuralmente equivalentes, pero el lenguaje
usa nombres equivalentes
- Los tipos tienen diferentes conjunto de valores, pero la misma
representación.
- Los tipos tienen diferentes representaciones
a:=expr
a + b
F (arg1, arg2, …, argN)
Asuma que el tipo que provee y el tipo esperado es
requerido para ser el mismo
Necesita usar un cast (conversión explicita)
Tipo de Conversión y Cast (II)
Ejemplo (Ada):
n : integer;
r : real;
t : test_score;
c : celsius_temp;
t : test_score(n)
n : integer (t);
r : real (n);
n : integer (r);
r : real (c);
c: celsius_temp (r)
-- 0..100
-- real
-- el chequeo es a tiempo de ejecución
-- nada
-- conversión
-- conversión y chequeo
-- nada
-- nada
Tipo de Conversión y Cast (III)
type peso = real
type altura = real
var
p : peso
a : altura
p := a
X
p := (peso)a
Equivalencia
estructural, el lenguaje
lo prohíbe a menos de
que explícitamente la
hagamos.
type edad = 0..150
var
e : edad
i : int
e := i
X
i := e
X
e := (edad) i
i := (int) e
Equivalencia estructural
pero solo en alguna
intersección.
Entero y reales, generar
Código que cambie la
representación y también
chequear que no se
salga de rango
Estructuras son diferentes
y hay que hacer una
conversión o cambiar
la representación
Tipo de Compatibilidad y Coerción
Cada vez, más lenguajes no requieren de equivalencias de tipos en
cada contexto, pero apenas compatibilidad.
Coerción – es una conversión implícita, si los tipos con compatibles.
-En Ada:
El tipo S es compatible con el tipo T si y solo si:
- S y T son equivalentes
- Uno de los subtipos es del otro
- Ambos son subtipos del mismo tipo
- Ambos son arreglos, con el mismo número y tipo de elementos
en cada dimensión
- En C:
Porciones de coerciones, algunos implican menor precisión (truncar)
Descargar

Tipos de Datos (Data Types)