8.8

Entrega 5

Deadline: 26 de Noviembre 2023

⚠ Importante

Recuerde las reglas del código de conducta.

Objetivos básicos de la entrega:

La evaluación se hace con specs grading (vea los detalles aquí).

No hay spec extra para esta última entrega.

1 Para empezar

A partir de su rama entrega4, puede iniciar un nuevo branch en git con:

$ git checkout -b entrega5
Dado que en esta entrega no haremos cambios en el lenguaje, el intérprete de referencia es el mismo que recibió en la entrega anterior. Por esta razón, después de crear la branch entrega5, lo único que necesita obtener es el código base actualizado del runtime system (archivo rt/sys.c) que puede encontrar aquí. Este incluye cambios necesarios para implementar el GC, y pone a su disposición funciones útiles para el debugging.

1.1 Desarrollo y entrega del código

Recuerde hacer un git commit cada vez que avanza en su desarrollo, y subir el código a su repositorio github para facilitar el acceso al código para los auxiliares en caso de que necesite ayuda.

Para entregar su solución, haga un release en github con nombre entrega5 y entregue el hash del commit en U-cursos.

No olvide explicar lo que entrega en un archivo ENTREGA5.md. En particular, describa las decisiones de diseño que haya tomado durante el desarrollo.

1.2 Testing

Recuerde que la documentación para escribir los tests se encuentra en bbctester/README.md.

El código C entregado para partir ocupa variables de ambiente (STACK_SIZE, HEAP_SIZE, USE_GC) para inicializar los recursos del programa. Se puede cambiar estos parámetros directamente desde un archivo .bbc con el campo PARAMS:. Este campo acepta una lista de pares IDENTIFICADOR=VALOR separada por comas ",".

Por ejemplo:

PARAMS: USE_GC=0, STACK_SIZE=64

Los 3 parámetros empleados en rt/sys.c tienen la semántica siguiente:

Si quiere ejecutar sus programas directamente desde el terminal especificando valores para dichas variables de ambiente, puede anteponerlas al path del ejecutable separadas por espacios. Por ejemplo:

$ USE_GC=1 HEAP_SIZE=16 ./examples/prog1.run

2 Extensión del compilador con un GC

2.1 Implementación del algoritmo de Cheney

Siguiendo las notas del curso y el pseudo-código que puede encontrar en la siguiente página de wikipedia, implemente el algoritmo de Cheney para hacer la recolección de basura de la memoria heap.

Comience con el código dado en rt/sys.c, completando la función collect y añadiendo las subrutinas necesarias.

2.2 Alocación de memoria con GC

Modifique su compilador para que se llame al GC con la función C try_gc de rt/sys.c cada vez que se aloca memoria en el heap (alocación de tuplas y clausuras).

¡No olvide hacer tests para comprobar que el GC limpia la memoria adecuadamente!