9.1

Entrega 5🔗

Deadline: 22 de Noviembre 2026

⚠ 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
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:

  • 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 GC

  • HEAP_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!