Subrutinas y Control de Abstracci - PowerPoint PPT Presentation

1 / 23
About This Presentation
Title:

Subrutinas y Control de Abstracci

Description:

Condici n inusual detectada a tiempo de ejecuci n. ... Tal vez se quiera un manejador local justo para limpiar algunos recursos. ... – PowerPoint PPT presentation

Number of Views:96
Avg rating:3.0/5.0
Slides: 24
Provided by: Edga9
Category:

less

Transcript and Presenter's Notes

Title: Subrutinas y Control de Abstracci


1
Subrutinas y Control de Abstracción
2
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

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

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

5
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
6
Manejo 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.
7
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()
8
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.

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

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

11
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
12
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.

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

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

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

16
Iteradores
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.
17
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
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.
18
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

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

Código de la Corrutina A
Código de la Corrutina B
Ejemplo
Transfer B
Transfer A
Trasnfer A
Transfer B
20
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

21
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

22
Iteradores 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)

23
Iteradores 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
Write a Comment
User Comments (0)
About PowerShow.com