Entrega 5
Deadline: 24 de Noviembre 2024
⚠ Importante
Recuerde las reglas del código de conducta.
Objetivos básicos de la entrega:
Implementación de un GC
La evaluación se hace con specs grading (vea los detalles aquí).
4pts por la spec básica
1pto para el testing
1pto para la calidad del código
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
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:
Agregar la documentación en el texto descriptivo del release de Github
Dejar la documentación en un archivo Entrega5.md en su repositorio
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:
USE_GC
es 1 para emplear el GC y 0 para ejecutar sin GCHEAP_SIZE
es el tamaño (en QWORDS) de la memoria que el programa puede emplear (el algoritmo de Cheney necesita el doble de este espacio en memoria)STACK_SIZE
fija el tamaño de la pila
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!