8.12

Entrega 5🔗

Deadline: 24 de Noviembre 2024

⚠ 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, pueden 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 recibieron en la entrega anterior. Por esta razón, después de crear la branch entrega5, lo único que necesitan obtener es el código base actualizado del runtime system (archivo rt/sys.c) que pueden 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🔗

Recuerden hacer un git commit cada vez que avanzan en su desarrollo, y subir el código a su repositorio Github para facilitar el acceso al código a los auxiliares en caso de que necesiten ayuda.

Para entregar su solución, hagan un release en Github con nombre entrega4 y entreguen el hash del commit correspondiente en el comentario de la tarea de U-cursos.

Recuerden documentar lo que intentaron y lograron hacer, y cualquier otro detalle relevante a su implementación (e.g. cuál spec avanzada eligieron, decisiones de diseño que tomaron, etc). Para esto tienen dos alternativas:

1.2 Testing🔗

Recuerden 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 quieren ejecutar sus programas directamente desde el terminal especificando valores para dichas variables de ambiente, pueden 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 pueden encontrar en la siguiente página de wikipedia, implementen el algoritmo de Cheney para hacer la recolección de basura de la memoria heap.

Comiencen 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🔗

Modifiquen 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 olviden hacer tests para comprobar que el GC limpia la memoria adecuadamente!