Title: Subrutinas y Control de Abstracci
1Subrutinas y Control de Abstracción
2Agenda
- Manejo de Excepciones
- Definición
- Maneras Tradicionales para manejar excepciones
- Manejo de Errores
- Propagación de excepciones
- Ejemplo del manejo de excepciones
- Usos de los mecanismos de manejadores de
excepciones. - Ventajas en el manejo de excepciones
- Definición de Excepciones
- Implementación de Excepciones
- Solución Alternativa
- Propiedades
- Iteradores
- Corrutinas
- Iteradores como Corrutinas
3Manejo de Excepciones
- Excepciones
- Condición inusual detectada a tiempo de
ejecución. - Tal vez requiere un Back-out de muchos niveles
de llamadas a subrutinas - Ejemplos
- Desbordamiento (overflow) aritmético.
- Fin de archivo sobre una entrada.
- Tipo incorrecto para la entrada de datos.
- Definiciones de usuario en condiciones (no
necesariamente erróneas) invocadas explícitamente.
4Manejo de Excepciones
- Maneras tradicionales para manejar dichas
situaciones - Retorna un valor por defecto cuando no produce
uno aceptable. - Retorna (o tiene un parámetro extra) un explicito
estatus del valor, para ser inspeccionado después
de cada llamada. - Pasar una cláusula para el manejo de errores,
para ser llamado en caso de algún problema.
5Manejo de Errores
- C, Ada, Java, ML
- Los manejadores son léxicamente delimitados por
bloques de código protegido. Ej. En C y en Java
el bloque de código se delimita por las palabras
try y catch.
try Catch () finally
Ejemplo de Java
6Manejo de Errores
- Propagación de excepciones
- Si una excepción es invocada (a través de C)
Si la excepción no es manejada en la subrutina
actual, retorna abruptamente de la subrutina.
Retorna abruptamente por cada subrutina en la
cadena dinámica de llamadas, hasta encontrar un
manejador.
Si lo encuentra ejecuta el manejador, entonces
continua con la ejecución de código luego del
manejador.
Si no es encontrada hasta el nivel más superior
(programa principal), el programa termina.
7Manejo de Excepciones
Void f() try g() catch(exc)
// Manejador de excepciones de tipo
exc.
Void g() h() Void h() if
() throw exc()
8Manejo de Excepciones
- Usos de los mecanismos de manejadores de
excepciones. - Realiza operaciones de recuperación y entonces
continua con la operación. - Asigna mayor cantidad de memoria.
- Recupera de errores en un compilador.
- No se puede recuperar localmente, pero
- Tal vez se quiera un manejador local justo para
limpiar algunos recursos. - Invocar la excepción para ser manejada por la
autoridad superior. - Termina, pero primero imprime una ayuda en el
mensaje de error.
9Manejo de Excepciones
- Ventajas
- Manera uniforme de manejar los errores.
- Maneja los errores exactamente como queremos, sin
chequear para ellas explícitamente todo lo que
debe ocurrir. - Documentar la subrutina especifica que
excepciones pueden ser invocadas por una
subrutina (el usuario de la subrutina tal vez
quiera atraparlos).
10Definición de Excepciones
- Excepciones parametrizadas el código con el cual
es invocado la excepción, pueden pasar
información adicional con ellas. - Ej.
- - C
- class duplicate_int_set
-
- int dup
-
- Throw duplicate_in_set(d)
- - Ada, Common Lisp las excepciones son solo
etiquetas no existe otro tipo de información que
el nombre de la excepción.
11Propagación de Excepciones
- C (Excepciones predefinidas)
try // Bloque de código protegido
catch(end_of_file) // Derivado por un
error de E/S catch(io_error e) //
Cualquier io_error aparte del end_of_file catch
() // Todas las demás excepciones
12Implementación de Excepciones
- Cómo podemos hacer para mantener una traza de
manejadores? - Mantener una pila separada de manejadores
- Cuando se ingrese una subrutina, en el prologo,
colocar todos sus manejadores de excepciones en
la pila de excepciones. - Cuando se retorne de una subrutina, (en el
epilogo) sacar todos los manejadores de
excepciones de la pila de excepciones. - Problemas
- Sobrecarga (overhead) a tiempo de ejecución.
13Implementación de Excepciones
- Solución Alternativa
- A tiempo de compilación, construir una tabla de
manejadores. - Cada entrada tendrá dos campos las cuales
corresponden a - La dirección de código protegido.
- La dirección del manejador correspondiente.
- Si una excepción es invocada
- Realizar una búsqueda binaria para la dirección
del bloque actual en la tabla. - Si se encuentra y el manejador corresponde con la
excepción, se ejecuta el manejador. - De los contrario retorna y repite el código del
llamador.
14Implementación de Excepciones
- Propiedades
- Si una excepción ocurre
- Aumenta el costo a tiempo de ejecución en la
solución previamente planteada (búsqueda por la
dirección en la tabla). - En casos comunes (donde ninguna excepción
ocurre) - El costo a tiempo de ejecución es cero (la tabla
construida a tiempo de compilación).
15Iteradores
- Definición control de abstracción que permite
enumerar los elementos de un tipo abstracto de
datos. - Recorrer un arreglo
- Calcula el máximo número de elementos, promedio
de todos los elementos, despliega los elementos,
etc. - Recorres un árbol
- Calcula el máximo número de nodos, saca el
promedio de todos los nodos, cuenta el número de
nodos, etc.
16Iteradores
for i in from_to_by (first, last, step) do end
from_to_by iter ( from, to, by int ) yields
(int) i int from if by 0 then
while i to do yield i i by
end else while i to do yield i i
by end end end from_to_by
yield
Retorna el contro el valor actual de i.
La siguiente iteración continua Desde el punto
donde quedo.
17Iteradores
- Icon son iteradores que son llamados
generadores. - La enumeración es controlada por un ciclo en
icon
every i first to last by step do - to
by generador construido con notación infija
Otros generadores de tipo Icon (usualmente operan
sobre cadena de caracteres)
find (substr, str) genera las posiciones en la
palabra str donde substr aparezca. upto
(chars, str) genera la posición en la palabra
str donde cuqlquier carácter chars aparezca.
18Iteradores
- Euclid son aquellos iteradores que son
emulados. - La sintaxis de un ciclo for permite usar un
módulo generador - El módulo debe exportar
- Las variables llamadas value y stop
- Un procedimiento llamado next
El cual es equivalente a begin var ti
TreeIterModule loop exit when ti.stop n
ti.value ti.next end loop end
Ejemplo de recorrido de un árbol for n in
TreeIterModule loop end loop
19Corrutinas
- Definición rutinas que no están subordinadas
sino que trabajan cooperativamente, pero se
ejecutan una a la vez. - Transfieren el control de una a la otra
explícitamente por nombre.
Código de la Corrutina A
Código de la Corrutina B
Ejemplo
Transfer B
Transfer A
Trasnfer A
Transfer B
20Corrutinas
- Implementación
- Clausura la dirección a código y una referencia
al ambiente. - Transfer salto a través de un no-local goto,
después de grabar el estado actual. - Lenguajes que proveen corrutinas Simula,
Modula-2 - Son útiles para la implementación de
- - Iteradores - Simulación de eventos discretos
- - Threads - Juegos de 2 personas
- - Servers
21Corrutinas
- Ejemplo de un programa protector de pantalla
- Muestra una imagen
- En el fondo, chequea el disco para conseguir
archivos maliciosos o corruptos. - Sin corrutinas (loop)
- Actualizar una porción de la imagen de pantalla.
- Ejecuta el siguiente paso del chequeo de archivos
del sistema. - Problemas
- No todas las tareas pueden ser divididas en
pasos. - El código adquiere una estructura compleja
22Iteradores como Corrutinas
- Es fácil implementar iteradores con corrutinas
- for i from_to_by (first, last, step) do
-
- end
- El compilador traduce esto como
- It new form_to_by(first, last, step, i, done,
current_coroutine) - While not done do
-
- trasfer(it)
- destroy (it)
23Iteradores como Corrutinas
- La corrutina que implemento el iterador
from_to_by es
Coroutine form_to_by (from, to, by int, ref
iint, ref done bool, caller
coroutine) i from if by 0 then done
from to detach loop i
by done i to transfer(caller
) --yield i else done from
to detach loop i by done i
to transfer(caller) --yield i