subrutinas y control de abstracción. agenda manejo de excepciones –definición –maneras...

23
Subrutinas y Control de Abstracción

Upload: jimena-montiel

Post on 23-Jan-2016

229 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Subrutinas y Control de Abstracción

Page 2: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Agenda• 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

Page 3: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo 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.

Page 4: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo 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.

Page 5: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo 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:

Page 6: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo de Errores

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.

• Propagación de excepciones Si una excepción es invocada (a través de C++)

Page 7: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo de Excepciones

• Ejemplo en C++

Void f(){ … try { g(); } catch(exc) { // Manejador de excepciones de tipo exc. } …}

Void g(){ … h(); …}

Void h(){ … if (…) throw exc(); …}

Page 8: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo 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.

Page 9: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Manejo 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).

Page 10: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Definició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.

Page 11: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Propagació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…}

Page 12: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Implementació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.

Page 13: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Implementació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.

Page 14: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Implementació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).

Page 15: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Iteradores

• 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.

Page 16: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Iteradoresfor 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 ii + := by

end else while i = to do

yield i i +:= by

end endend from_to_by

yield Retorna el contro el valor actual de i.

La siguiente iteración continuaDesde el punto donde quedo.

Page 17: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Iteradores

• 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 sobrecadena 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.

Page 18: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Iteradores

• 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

Ejemplo de recorrido de un árbol:

for n in TreeIterModule loop…end loop

El cual es equivalente a:

begin var ti: TreeIterModule loop

exit when ti.stopn:= ti.value…ti.next

end loopend

Page 19: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Corrutinas

• 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.

Ejemplo:

Transfer B

Transfer B

Transfer A

Trasnfer A

Código de la Corrutina A Código de la Corrutina B

Page 20: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Corrutinas

• 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

Page 21: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Corrutinas

• 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

Page 22: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Iteradores como Corrutinas

• Es fácil implementar iteradores con corrutinasfor 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)

Page 23: Subrutinas y Control de Abstracción. Agenda Manejo de Excepciones –Definición –Maneras Tradicionales para manejar excepciones Manejo de Errores –Propagación

Iteradores como Corrutinas• La corrutina que implemento el iterador

from_to_by es:Coroutine form_to_by (from, to, by: int, ref i:int, ref done : bool,

caller: coroutine)i:= fromif by 0 then done := from = to detach loop i +:= by

done := i = totransfer(caller) --yield i

else done := from = to detach loop i +:= by

done := i = totransfer(caller) --yield i