Todos los siguientes comentarios se basan en la elección de una estrategia de implementación estándar que utiliza cierres para representar valores de función y un orden de evaluación de llamada por valor:
Para el cálculo lambda puro, la recolección de basura no es necesaria. Esto se debe a que no es posible formar ciclos en el montón: cada valor recientemente asignado solo puede contener referencias a valores asignados previamente, por lo que el gráfico de memoria forma un DAG, por lo que el recuento de referencias es suficiente para administrar la memoria.
La mayoría de las implementaciones no utilizan el recuento de referencias por dos razones.
- Admiten una forma de tipo puntero (por ejemplo, el
ref
constructor de tipos en ML), por lo que se pueden formar ciclos verdaderos en el montón.
- El conteo de referencias es mucho menos eficiente que la recolección de basura, ya que
- requiere mucho espacio adicional para mantener los recuentos de referencia, y
- actualizar los recuentos suele ser un trabajo perdido, y
- Las actualizaciones de los recuentos crean un montón de contención de escritura que mata el rendimiento paralelo.
Los lenguajes de tipo lineal pueden eliminar el recuento de referencia (esencialmente porque los recuentos son 0-1: el valor tiene una sola referencia o está inactivo y puede liberarse).
Sin embargo, la asignación de la pila aún no es suficiente. Esto se debe a que es posible formar valores de función que se refieren a variables libres (es decir, necesitamos implementar cierres de función), si asigna cosas en la pila, los valores vivos pueden entrelazarse con valores muertos, y esto causará una asintótica incorrecta. uso del espacio
Puede obtener los asintóticos correctos reemplazando una pila con una "pila de espagueti" (es decir, implemente la pila como una lista vinculada en el montón, de modo que pueda cortar los marcos muertos según sea necesario).
Si desea una disciplina de pila real, puede usar sistemas de tipos basados en "lógica ordenada" (esencialmente tipos lineales menos intercambio).