2. Desarrollo de tipos de datos
1957-1960 FORTRAN, ALGOL – datos primitivos que
emulaban el hardware
1960-1963 COBOL, PL/I – Datos primitivos extendidos con
colecciones de objetos y registros primitivos.
1968-1970 Pascal, ALGOL-68 – Extiende la funcionalidad
con nuevos tipos. Crea funciones que usan los nuevos
tipos.
1972--1976 Edad de la encapsulación (Parnas)-
Ocultamiento de la información
• Crea firmas de tipos de datos
• Sobrecarga
• Herencia
• Nuevos lenguajes:
Alphard (Wulf, Shaw, LondonU) Euclid (Toronto)
CLU (Liskov) Modula (Wirth)
Smalltalk (Kay) Ada (DoD)
Eiffel (Meyer)
1980--1985 Orientación a Objetos - Smalltalk-80, C++,
Miranda, ML, FORTRAN-90, Ada-95
2
5. Tipos
Un tipo (tipo de dato) es un conjunto de valores que un
objeto puede tener.
Un tipo abstracto de datos (ADT) es un:
• Tipo de datos
• Conjunto de funciones (operaciones) que operan sobre
datos de ese tipo
• Cada función es definida por su firma.
• Puede también especificar operaciones formales
5
6. Ejemplo ADT
ADT estudiante:
• Operaciones:
PonerNombre: nombre x estudiante estudiante
ConseguirNombre: estudiante nombre
PonerCurso: curso x estudiante estudiante
Obtener curso: estudiante curso *
ObtenerCreditos: estudiante integer
En este ejemplo, Nombre y Curso son ADT indefinidos.
Ellos están definidos por alguna otra abstracción.
Ocultamiento de Información: No tenemos idea de COMO el
objeto estudiante es almacenado, ni tampoco nos
importa. Todo lo que nos interesa es el
comportamiento de los datos de acuerdo con las
funciones definidas.
6
7. Ocultamiento de Información
Ocultamiento de información puede ser construido en
cualquier lenguaje
Ejemplo en C:
typedef struct {i:int; ... } TipoA;
typedef struct { ... } TipoB;
P1 (TipoA X, otros datos) { ... } - P1:otros datos
TipoA
P2 (TipoB U, TipoA V) { ... } - P2:TipoA TipoB
Problemas con esta infraestructura:
• No obligación de ocultamiento de la información. En P2
se puede escribir V.i para acceder componente i del
objeto de TipoA en vez de llamar a P1.
• El éxito depende de las convenciones
• Pero la ventaja es que puede ser hecho en Pascal o C.
Veremos más tarde mecanismos para obligar al ocultamiento
de la información (Smalltalk, C++, Java, Ada).
Llamaremos a esto encapsulación.
7
8. Implementación de almacenamiento de
subprogramas
Antes de estudiar a los ADT en detalle, necesitaremos
entender el método usual de los subprogramas para
crear objetos locales.
Cada subprograma tiene un bloque de almacenamiento
conteniendo esa información, denominado un registro
de activación.
Considere el siguiente subprograma en C:
float FN( float X, int Y)
const valinic=2;
#define valfinal 10
float M(10); int N;
N = valinic;
if(N<valfinal){ ... }
return (20 * X + M(N)); }
Información sobre el procedimiento FN esta contenido en
sus registros de activación.
8
9. Registros de activación
Arriba izquierda: Código producido por el compilador para la
ejecución del procedimiento FN.
Arriba derecha: Almacenamiento de datos necesario para el
procedimiento FN durante la ejecución. El compilador une
cada identificador en FN con una posición de
almacenamiento en un registro de activación.
9
10. Naturaleza dinámica de los registros de activación
Cada llamada a FN causa que un nuevo registro de
activación sea creado.
Por lo que el código estático generado por el
compilador para FN estará asociado con un nuevo
registro de activación cada vez que FN sea llamado.
Como veremos posteriormente, una estructura de pila es
utilizada para el almacenamiento de los registros de
activación.
10
11. Administración del almacenamiento
Los datos locales son almacenados en un área llamada
registro de activación (también llamada marco de pila
- stack frame).
Dirección de datos es un proceso de dos pasos:
1. Obtener un puntero al registro de activación
relevante que contiene las declaraciones.
2. Encontrar el desplazamiento en el registro de
activación para ese dato.
11
12. Tiempo de vida
IMPORTANTE:
1. El puntero del registro de activación es determinado
durante la ejecución del programa. Ocurre
frecuentemente, por lo que debe ser un calculo
eficiente.
2. El desplazamiento dentro del registro de activación
es fijo y determinado durante la compilación. Debe
requerir un calculo mínimo.
El tiempo de vida de una variable es el periodo
durante la ejecución del programa cuando el
almacenamiento para la variable declarada existe en
algún registro de activación (por Ej. desde el tiempo
en que el registro de activación es creado por la
declaración hasta que el registro de activación es
destruido).
El ámbito (scope) de una variable es la porción del
programa fuente donde el dato puede ser accesado (por
Ej. el nombre es una referencia legal en ese punto
del programa).
12
13. Tiempos de vida (continuación)
Dos modelos de tiempos de vida de datos:
Estático: Basado en la estructura estática del
programa
Dinámico: Basado en la ejecución de un programa
En general, tiempos de vida estáticos son implementados
en pilas.
13
14. Tiempos de vida de variables
Tiempo de vida de variable X es el periodo cuando el
registro de activación para P existe.
Note que podemos cambiar el ámbito, pero no el tiempo
de vida de una variable al anidar procedimientos:
14