Está en la página 1de 57

Unidad 5:

Tipos de Datos
Estructura de los Lenguajes

Lic. en Ciencias Informáticas


Facultad Politécnica, Universidad Nacional de Asunción
Notas de lectura revisadas y adaptadas por los profesores:
• Prof. Derlis Zárate (dzarate@pol.una.py) • Prof. Gerardo González (jggonzalez@pol.una.py)
• Prof. Milciades Fernández (mfernandez@pol.una.py) • Prof. Saúl Zalimben (szalimben@pol.una.py)
Índice
1. Introducción: Definición de un Tipo de Dato
Sistema de Tipos de un Lenguaje
2. Tipos primitivos o simples
3. Tipos no primitivos
Cadenas de caracteres
Constructores de Tipos
Producto Cartesiano: Registros y Uniones
Conjuntos, Subconjuntos y Tipos Ordinales
Arreglos o Arrays
Arrays Heterogéneos
Slices
Arrays Asociativos
Vectores, Secuencias y Listas
Referencias y Punteros
Tipos Recursivos
4. Equivalencia, Chequeo y Conversión de Tipos
5. Conclusiones
6. Bibliografía y referencias
Introducción:
Definición de un Tipo de Dato
Sección 1
Introducción
Wirth, 1976:

Algoritmos + Estructuras de Datos = Programas

Datos .. estructuras de datos

Manipulados por estructuras


de control... algoritmos
Generan resultado
La manera en que un lenguaje de programación expresa los datos y el
control, determina significativamente cómo se escriben los programas en él.
Unidad 5: Tipos de Datos 4
Introducción
• Un tipo de dato define una colección de objetos de
datos y un conjunto de operaciones sobre dichos
objetos
• Aparecía como un atributo asociado a un
identificador en la tabla de símbolos.
• Una cuestión de diseño de todos los tipos de datos:
qué operaciones serán definidas y cómo serán
especificadas?

Unidad 5: Tipos de Datos 5


Introducción
• El atributo tipo de dato de un identificador posiblemente sea el
más importante.
• Si se computa estáticamente, puede mejorar:
– La eficiencia
– La seguridad
– La correctitud
– La legibilidad
de un programa.
• Si se computa dinámicamente, asociado a los valores en vez de
a identificadores, practicamente solo puede mejorar
– La seguridad
Unidad 5: Tipos de Datos 6
Definiendo un Tipo de Dato
• Listando todos sus valores:
enum RGBColor {Red, Green, Blue}; // C++
datatype RGBColor = Red|Green|Blue; (*ML*)

• Imitando las matemáticas (tipos predefinidos): double, int.

• Aplicando un constructor de tipos sobre tipos ya existentes:


type IntReal = int * real; (* ML built-in
Cartesian product type constructor *)
class IntReal {int x; double y;} // Java
union IntOrReal { int x; double y;};// C++
Unidad 5: Tipos de Datos 7
Definiendo un Tipo de Dato
• Importante de recordar: un contructor de tipos y tipos
predefinidos solo pueden imitar las matemáticas (hay
diferencias y limitaciones como valores infinitos y ciertas
operaciones).
• También es importante separar
– Constructores de tipo: función de tipo a tipo
– Constructores de valores: función de valor a valor
• Hay tipos que pueden o no tener nombres
– Tipos anónimos

Unidad 5: Tipos de Datos 8


Usando el Tipo de Dato en la Traducción
• Cada tipo almacena información acerca de su tamaño y estructura de sus datos
– Esto puede servir para generar un código eficiente.
• Los tipos pueden usarse para chequear si tiene sentido las operaciones que
quiere hacer el programa: chequeo de tipos.
• Durante el chequeo de tipos, emergen 2 cuestiones:
– Cómo comparar 2 tipos: equivalencia de tipos.
– Cómo construir un tipo que no está dado explícitamente: inferencia de
tipos.
• Hay varios algoritmos para hacer esto, los cuales se conocen en conjunto como:
sistema de tipos.
• Un lenguaje es fuertemente tipado si su sistema de tipos garantiza
estáticamente que no ocurrirán errores de corrupción de datos durante la
ejecución

Unidad 5: Tipos de Datos 9


Tipos Primitivos o Simples
Sección 2
Tipos de Datos Primitivos: TDP
• Casi todos los lenguajes de programación proveen
un conjunto de tipos de datos primitivos.
• Tipo de dato primitivo: es aquel que se define
únicamente en términos de sí mismo, es decir, no se
define en términos de otros tipos de datos.
• Algunos tipos primitivos son reflexiones del
hardware.
• Otros requieren un ligero soporte para su
implementación.
Unidad 5: Tipos de Datos 11
Tipos de Datos Primitivos: TDP
• Enteros
• Punto Flotante
• Complejos
• Decimal
• Boolean
• Character

Unidad 5: Tipos de Datos 12


TDP: Enteros
• Casi siempre es una reflexión exacta del hardware así que el
mapeo es trivial.
• Como mucho, podría haber hasta 8 diferentes tipos de integers
en un lenguaje
• Por ejemplo, en Java: byte, short, int, long

Unidad 5: Tipos de Datos 13


TDP: Punto Flotante
• Modelan números reales, pero solo como
aproximaciones.
• Los lenguajes para propósitos científicos soportan al
menos 2 tipos de punto flotante (float y
double); a veces más.
• Usualmente es exactamente igual al hardware, pero
no siempre.
• IEEE Floating-Point
Standard 754

Unidad 5: Tipos de Datos 14


TDP: Complejos
• Algunos lenguajes soportan tipos complejos, ej.: C99, Fortran,
y Python
• Cada valor consiste en 2 floats: la parte real y la parte
imaginaria.
• Foma literal (en Python):
(7 + 3j), donde 7 es la parte real y 3 es la parte imaginaria

Unidad 5: Tipos de Datos 15


TDP: Decimal
• Para aplicaciones de negocios (monetarias)
– Esencial para COBOL
– C# también nos ofrece un tipo decimal
• Almacena un número fijo de dígitos decimales en
una forma codificada (BCD)
• Ventaja: precisión.
• Desventaja: rango limitado, desperdicio de memoria.

Unidad 5: Tipos de Datos 16


TDP: Booleano
• El más simple de todos
• Rango de valores: 2 elementos, uno para true y otro
para false.
• Puede ser implementado como bits, pero
usualmente se lo implementa como bytes
– Ventaja: legibilidad

Unidad 5: Tipos de Datos 17


TDP: Carácter
• Almacenado como códigos numéricos
• Codificación más usada: ASCII
• Una alternativa, 16-bit: Unicode (UCS-2)
– Incluye carácteres de la mayoría de los lenguajes naturales
– Originalmente utilizado en Java
– C# y JavaScript también soportan Unicode
• 32-bit Unicode (UCS-4)
– Soportado por Fortran, desde el 2003

Unidad 5: Tipos de Datos 18


Tipos No Primitivos
Sección 3
Cadenas de Caracteres
• Los valores son secuencias de caracteres
• Cuestiones de diseño:
– Es un tipo primitivo o solo un tipo especial de array?
– La longitud de las cadenas debe ser estática o dinámica?

Unidad 5: Tipos de Datos 20


Constructores de Tipos
Un tipo de dato no primitivo, también conocido como
derivado o compuesto, se construye mediante un
constructor de tipos. Ejemplos de posibles constructores son:
• Producto Cartesiano
– Registros y Uniones

• Subconjuntos
• Arrays
• Secuencias / Listas
• Referencias y Punteros
• Tipos Recursivos
entre otros..
Unidad 5: Tipos de Datos 21
Producto Cartesiano
• Combinaciones finitas de tipos definidos previamente.
• En matemática: Los componentes son seleccionados por
su posición.
• En los lenguajes: Los componentes son seleccionados por
su nombre.
• Ejemplos
– ML tiene producto cartesiano en su forma pura:
• ("a",2): string * int
• #1 ("a",2) returns "a".
– Clases Java
– Structs en C
Unidad 5: Tipos de Datos 22
Registros
• Un registro es un agregado de datos posiblemente
heterogéneos, en los cuales cada elemento indivual
se identifica por un nombre.
• Cuestiones de diseño:
– Cuál es la forma sintáctica de las referencias a campos?
– Se permiten referencias elípticas?

Unidad 5: Tipos de Datos 23


Uniones
• Una union es un tipo cuyas variables pueden
almacenar diferentes valores de tipo en diferentes
momentos de la ejecución de un programa.
• Cuestiones de Diseño
– Se necesita chequeo de tipos?
– Pueden estar metidas dentro de registros?

Unidad 5: Tipos de Datos 24


Subconjuntos
• Un subconjunto puede ser una indicación explícita de un
subrango de valores de un tipo
• También podrías ser considerado como un subtipo
– Un tipo que implementa las operaciones de otro
• C enums son subrangos de int .
• La herencia de Java es una forma de subtipos.

Unidad 5: Tipos de Datos 25


Tipos Ordinales
• Un tipo ordinal es uno en el cual el rango de posibles
valores puede asociarse fácilmente con el conjunto
de enteros positivos.
• Ejemplos de tipos ordinales primitivos en Java
– integer
– char
– boolean

Unidad 5: Tipos de Datos 26


Tipos Enumeración
• Todos los posibles valores, los cuales son constantes
nombradas, se proveen en la definición
• Ejemplo en C#
enum days {mon, tue, wed, thu, fri, sat, sun};
• Cuestiones de diseño
– Una constante de enumeración puede aparecer en más de
una definición de tipos? Y si es así, cómo se chequeará la
ocurrencia del tipo?
– Existe cohesión entre los valores de la enumeración con
los integers?
– Algún otro tipo de cohesión con la enumeración?
Unidad 5: Tipos de Datos 27
Tipos Subrango
• Una subsequencia contigua de un tipo ordinal
– Ejemplo: 12..18 es un subrango del tipo integer.
• Diseño de Ada
type Days is (mon, tue, wed, thu, fri, sat, sun);
subtype Weekdays is Days range mon..fri;
subtype Index is Integer range 1..100;

Day1: Days;
Day2: Weekday;
Day2 := Day1;

Unidad 5: Tipos de Datos 28


Tipos Arreglo o Array
• Un array es un agregado de elementos de datos
homogéneos, en el cual cada elemento individual es
identificado por su posición, relativa al primer
elemento.
• Algunos lenguajes permiten definir arrays como
tipos con nombre y otros no.
– Ejemplo en C: typedef int[10] IntArray;

Unidad 5: Tipos de Datos 29


Cuestiones de Diseño de Arrays
• Qué tipos son válidos para subíndices?
• Se chequean el rango de los subíndices?
• Cuál es el nro. máximo de subíndices?
• Pueden inicializarse los arrays de objetos?
• Se soportará algún tipo de slice?
• Cuál es la sintaxis para acceder a los índices?

Unidad 5: Tipos de Datos 30


Indexado en Arrays
• El Indexado es un mapeo de índices a elementos
array_name (index_value_list) → an element
• Sintaxis de índices
– FORTRAN, PL/I, Ada usan ()
– La mayoría de los demás lenguajes usan []

Unidad 5: Tipos de Datos 31


Inicialización de Arrays
• Algunos lenguajes permiten inicializar el array
– C, C++, Java, C#
int list [] = {4, 5, 7, 83}
– Character strings en C and C++
char name [] = “freddie”;
– Arrays de strings en C and C++
char *names [] = {“Bob”, “Jake”, “Joe”];
– Arrays de Strings en Java
String[] names = {“Bob”, “Jake”, “Joe”};

Unidad 5: Tipos de Datos 32


Arrays Heterogéneos
• Un array heterogéneo es un array en el cual los
elementos no necesitan ser del mismo tipo.
• Soportado por Perl, Python, JavaScript, Ruby

Unidad 5: Tipos de Datos 33


Slices
• Un slice es una subestructura de un array.
• Son útiles en lenguajes que tienen operaciones
sobre arrays

Unidad 5: Tipos de Datos 34


Ejemplos de Slices en Fortran 95

Unidad 5: Tipos de Datos 35


Arrays Asociativos
• Un array asociativo es una colección desordenada
de datos que están indexados por un igual número
de valores, llamados claves.
– El usuario define las claves a ser almacenadas
• Cuestiones de Diseño:
- Cómo referenciamos a los elementos?
- Tamaño estático o dinámico?
• Como tipos definidos en Perl, Python, Ruby, y Lua

Unidad 5: Tipos de Datos 36


Vectores, Listas y Secuencias
• Algunos lenguajes también tienen vectores, son como arrays,
pero más flexibles, especialmente en la redimensión del
tamaño.
• Listas son similares a vectores, excepto que solo pueden ser
accedidos a partir del primer elemento
– Todos los lenguajes funcionales soportan listas.
– Es un tipo recursivo.
• Secuencias son como los arrays, pero potencialmente
infinitos.
– A veces son conocidos también como streams o flujos.
– Aparecen mucho en el mundo de lenguajes funcionales
Unidad 5: Tipos de Datos 37
Tipos Referencia y Punteros
• Una variable de tipo puntero tiene un rango de
valores que consiste en direcciones de memoria y un
valor especial, NIL
• Provee el direccionamiento indirecto
• Provee un mecanismo para administrar
dinámicamente la memoria
• Un puntero puede usarse para accesar a áreas del
heap.

Unidad 5: Tipos de Datos 38


Tipos Referencia
• C++ incluye un tipo especial de puntero llamado tipo
referencia, usado primeramente para los parámetros
formales
– Ventajas de poder pasar por valor y referencia
• Java extiende esto, permitiendo variables referencia
de manera a reemplazar totalmente a los punteros
– Referencias son referencias a objetos, en vez de
direcciones
• C# incluye ambos enfoques: referencias de Java y
Punteros de C

Unidad 5: Tipos de Datos 39


Tipos Recursivos
• Un tipo recursivo es un tipo que tiene alguna referencia a
sí mismo
– Ejemplo:
public class Nodo {
– int dato;
– Nodo siguiente;
}

Unidad 5: Tipos de Datos 40


Ejemplo: Estructuras de Tipos en Java

Unidad 5: Tipos de Datos 41


Ejemplo: Estructuras de Tipos en C

Unidad 5: Tipos de Datos 42


Equivalencia, Chequeo y
Conversión de Tipos
Sección 4
Equivalencia de Tipos
• Qué es?

• Equivalencia estructural

• Equivalencia por nombres

Unidad 5: Tipos de Datos 44


Equivalencia de Tipos
• Históricamente, lenguajes como Fortran y Algol usaban
equivalencia estructural.
– 2 tipos son equivalentes si tienen la misma estructura.
– Ejemplo en Java
class A { int x; double y;}
class B { int x; double y;}
– Son equivalentes?. Pero Java no permite esto.
• La equivalencia estructural no especifica si el orden de
una estructura importa, o si los nombres de campos
importan, o ambas cosas.

Unidad 5: Tipos de Datos 45


Equivalencia de Tipos
• Una alternativa estricta a la equivalencia estructural es la
equivalencia por nombres.
– 2 tipos son equivalentes si y solo si tienen el mismo
nombre.
• Más fácil de implementar, pero depende que los tipos tengan
nombre.
• Si no hay nombres de tipos, debe usarse equivalencia
estructural.
• Ejemplos
– Java usa equivalencia de nombres para las clases e
interfaces, estructural para arrays.
– C también usa un enfoque híbrido, para la mayoría usa
Unidad 5: Tipos de Datos equivalencia de nombres y para tipos anónimos, estructural. 46
Equivalencia de Tipos
• Ejemplo en C: aplicando struct construye un nuevo tipo, aplicando typedef no:
struct A { char x; int y; };
struct B { char x; int y; };
typedef struct A C;
typedef C *P;
typedef struct A *R;
typedef int S[10];
typedef int T[5];
typedef int Age;

• Los tipos struct A y C son equivalentes, pero no son equivalentes a struct B;


• Los tipos P y R son equivalentes;
• Los tipos S y T son equivalentes;
• int y Age son equivalentes.

Unidad 5: Tipos de Datos 47


Chequeo de Tipos
• Type checking es la actividad de asegurar que los operandos de un
operador sean de tipos compatibles

• Un tipo compatible es un tipo válido para el operador, o es uno que puede


convertirse implícitamente mediante reglas del lenguaje a un tipo válido
– A esta conversión automática se le conoce como coercion.
– También pueden convertirse los tipos de forma explícita, mediante el casting

• Un error de tipo es la aplicación de un operador a un operando de un tipo


inapropiado

• En el chequeo de tipos, se generaliza el concepto de operandos y


operadores para incluir subprogramas y asignaciones

Unidad 5: Tipos de Datos 48


Chequeo de Tipos
• El chequeo de tipos involucra actividades de
– Inferencia de tipos
– Equivalencia de tipos

• Si el tipo es polimórfico, debe inferirse primero cuál de sus


variantes está siendo aplicada.

• Se aplican varias reglas de compatibilidad de tipos y reglas


de compatibilidad de asignación.

Unidad 5: Tipos de Datos 49


Conversión de Tipos
• La conversión puede clasificarse en 2 grupos
– Las que requieren código para hacerlo
– Las que modifican la representación interna o solo el tipo
• Según el primer grupo, tenemos 2 categorías:
– Conversión automática o implícita (no código)
– Conversión manual o explícita (sí código)
• El segundo grupo nos da también 2 categorías:
– El valor representado en memoria cambia
– El valor representado en memoria no cambia, solo el tipo
de dato
• Se puden dar combinaciones de estas 4 alternativas.
Unidad 5: Tipos de Datos 50
Conversión de Tipos
• Las conversiones a su vez pueden ser ampliantes o
limitantes
– Depende de si el tipo va de un rango menor a otro
mayor
– O está siendo truncado de un rango mayor a otro
menor

Unidad 5: Tipos de Datos 51


Conclusiones
Sección 5
Conclusiones
• Un tipo de dato es una colección de valores junto con las operaciones soportadas
sobre esa colección.
• Un lenguaje de programación tiene un conjunto de tipos de datos primitivos y un
conjunto de constructores de tipo para crear tipos no primitivos.
• El sistema de tipos de un lenguaje determina reglas que permiten realizar:
• Equivalencia de tipos
• Inferencia de tipos
• Chequeo de tipos
• Conversiones de Tipos
• Un lenguaje fuertemente tipado si su sistema de tipos garantiza estáticamente
que no ocurrirán errores de corrupción de datos durante la ejecución.
Unidad 5: Tipos de Datos 53
Bibliografía y referencias
Sección 6
Bibliografía y referencias adicionales
El contenido de estas notas de lectura está basado en los libros de textos oficiales de la materia:
• Lenguajes de Programación, principios y prácticas. Kenneth C. Louden.
Ed. Thompson, 2da Edición. Capítulo 6
• Concepts of Programming Languages. Robert W. Sebesta.
Ed. Addison Wesley, 5ta Edición. Capítulo 6.

Y fue adaptado por los profesores:


• Derlis Zárate (dzarate@pol.una.py)
• Juan Gerardo González (jggonzalez@pol.una.py)
• Milciades Ramón Fernández González (mfernandez@pol.una.py)
• Saúl Zalimben (szalimben@pol.una.py)

Unidad 5: Tipos de Datos 55


¿Consultas? ¿Dudas?
Puedes escribir tus consultas o dudas en
el Foro de la Unidad 5, que estaremos
respondiendo entre todos.

Unidad 5: Tipos de Datos 56


Unidad 5: Tipos de Datos
Fin de la presentación

También podría gustarte