El recolector de basura Boehm–Demers–Weiser , a menudo conocido simplemente como Boehm GC o recolector Boehm , es un recolector de basura conservador para C y C++ [1] desarrollado por Hans Boehm, Alan Demers y Mark Weiser . [2] [3]
Boehm GC es un software libre distribuido bajo una licencia de software libre permisiva similar a la licencia X11 . El primer artículo que presentó este recopilador apareció en 1992. [4]
Hans Boehm describe el funcionamiento del colector de la siguiente manera:
El recopilador utiliza un algoritmo de barrido de marcas. Proporciona una recopilación incremental y generacional en sistemas operativos que proporcionan el tipo adecuado de soporte de memoria virtual. (Actualmente, esto incluye SunOS[45], IRIX, OSF/1, Linux y Windows, con diversas restricciones). Permite que se invoque el código de finalización cuando se recopila un objeto. Puede aprovechar la información de tipo para localizar punteros si se proporciona dicha información, pero generalmente se utiliza sin dicha información.
— http://www.hboehm.info/gc/#details
Boehm GC también puede ejecutarse en modo de detección de fugas [5], en el que la gestión de memoria se sigue realizando de forma manual, pero el Boehm GC puede comprobar si se ha realizado correctamente. De esta forma, un programador puede encontrar fugas de memoria y desasignaciones dobles.
Boehm GC también se distribuye con una biblioteca de manejo de cadenas de C llamada cords. Es similar a ropes en C++ ( árboles de pequeñas matrices constantes), pero en lugar de utilizar el conteo de referencias para una liberación adecuada, se basa en la recolección de basura para liberar objetos. Cords es bueno para manejar textos muy grandes, modificaciones a los mismos en el medio, segmentación, concatenación y mantenimiento del historial de cambios ( funcionalidad de deshacer /rehacer).
El recolector de basura funciona con la mayoría de los programas C sin modificar, simplemente reemplazando malloc() con llamadas GC_MALLOC() , reemplazando realloc() con llamadas GC_REALLOC() y eliminando las llamadas free() . [1] El fragmento de código a continuación muestra cómo se puede usar Boehm en lugar de los tradicionales malloc y free en C. [6]
#include <assert.h> #include <stdio.h> #include <gc.h> int main ( void ) { int i ; const int tamaño = 10000000 ; GC_INIT (); para ( i = 0 ; i < tamaño ; ++ i ) { int ** p = GC_MALLOC ( tamaño de * p ); int * q = GC_MALLOC_ATOMIC ( tamaño de * q ); afirmar ( * p == 0 ); * p = GC_REALLOC ( q , 2 * tamaño de * p ); si ( i == tamaño -1 ) printf ( "Tamaño del montón = %zu \n " , GC_get_heap_size ()); } devuelve 0 ; }
Para completar, Boehm admite la desasignación explícita a través de GC_FREE() . [7] Toda la sustitución se puede realizar utilizando macros de preprocesador.
El GC de Boehm es utilizado por muchos proyectos [8] que se implementan en C o C++ como Inkscape , así como por entornos de ejecución para varios otros lenguajes, incluyendo Crystal , el compilador de Python de alto rendimiento Codon, [9] el entorno de ejecución GNU Compiler para Java , el proyecto Portable.NET , Embeddable Common Lisp , GNU Guile , la implementación Mono de la plataforma Microsoft .NET (que también utiliza GC de compactación precisa desde la versión 2.8), GNUstep opcionalmente, y libgc-d [10] (un enlace a libgc para el lenguaje de programación D , utilizado principalmente en MCI). Es compatible con numerosos sistemas operativos , incluyendo muchas variantes de Unix (como macOS ) y Microsoft Windows , y proporciona una serie de características avanzadas que incluyen recopilación incremental, recopilación paralela y una variedad de semánticas de finalizador .