Entrega 5
Deadline: 26 de Noviembre 2023
⚠ 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
, puede iniciar un nuevo branch en git con:
$ git checkout -b entrega5
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:
USE_GC
es 1 para emplear el GC y 0 para ejecutar sin GCHEAP_SIZE
es el tamaño 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 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!