Odśmiecacz Boehm

Boehm – Demers – Weiser Garbage Collector
Inne nazwy bdwgc
Oryginalni autorzy Hansa-Juergena Boehma
Deweloperzy Iwan Majdański i in.
Pierwsze wydanie 1988 ; 35 lat temu ( 1988 )
Wersja stabilna
8.0.6 / 28 września 2021 ; 17 miesięcy temu ( 2021-09-28 )
Wersja podglądu
8.2.0 / 29 września 2021 ; 17 miesięcy temu ( 29.09.2021 )
Magazyn
Napisane w C
Typ Śmieciarz
Licencja podobny do X11 ( wolne oprogramowanie )
Strona internetowa www .hboehm .info /gc / Edit this at Wikidata

Moduł wyrzucania elementów bezużytecznych Boehm-Demers-Weiser , często znany po prostu jako Boehm GC , jest konserwatywnym modułem wyrzucania elementów bezużytecznych dla C i C++ opracowanym przez Hansa Boehma, Alana Demersa i Marka Weisera .

Boehm GC jest wolnym oprogramowaniem rozpowszechnianym na podstawie liberalnej licencji wolnego oprogramowania, podobnej do licencji X11 . Pierwsza praca przedstawiająca tego kolekcjonera ukazała się w 1992 roku.

Projekt

Hans Boehm tak opisuje działanie kolektora:

Kolektor wykorzystuje algorytm mark-sweep. Zapewnia gromadzenie przyrostowe i generacyjne w systemach operacyjnych, które zapewniają odpowiedni rodzaj obsługi pamięci wirtualnej. (Obecnie obejmuje to SunOS[45], IRIX, OSF/1, Linux i Windows, z różnymi ograniczeniami.) Pozwala na wywołanie kodu finalizacji, gdy obiekt jest zbierany. Może skorzystać z informacji o typie, aby zlokalizować wskaźniki, jeśli takie informacje są dostarczone, ale zwykle jest używany bez takich informacji.

Boehm GC może również działać w trybie wykrywania nieszczelności , w którym zarządzanie pamięcią jest nadal wykonywane ręcznie, ale Boehm GC może sprawdzić, czy jest to zrobione poprawnie. W ten sposób programista może znaleźć wycieki pamięci i podwójne zwolnienia.

Boehm GC jest również dystrybuowany z biblioteką obsługi łańcuchów C zwaną cords. Jest to podobne do ropes w C++ ( drzewa stałych małych tablic), ale zamiast używać liczenia referencji do prawidłowego zwolnienia, polega na wyrzucaniu elementów bezużytecznych do wolnych obiektów. Cordy dobrze radzą sobie z bardzo dużymi tekstami, modyfikacjami ich w środku, krojeniem, łączeniem i przechowywaniem historii zmian ( cofania /ponawiania).

Operacja

Garbage collector działa z większością niezmodyfikowanych programów C, po prostu zastępując malloc() wywołaniami GC_MALLOC() , zastępując realloc() wywołaniami GC_REALLOC() i usuwając wywołania free() . Poniższy fragment kodu pokazuje, jak można używać Boehm zamiast tradycyjnego malloc i za darmo w C.

 
 
 

 

     
        

    
       0    
    
            
            

          0
              
           
             
    

     0
 #include  <assert.h>  #include  <stdio.h>  #include  <gc.h>  int  main  (  void  )  {  int  i  ;  const  int  size  =  10000000  ;  GC_INIT  ();  for  (  ja  =  ;  i  <  rozmiar  ;  ++  ja  )  {  int  **  p  =  GC_MALLOC  (  rozmiar  *  p  );  int  *  q  =  GC_MALLOC_ATOMIC  (  rozmiar  *  q  );  potwierdzić  (  *  p  ==  );  *  p  =  GC_REALLOC  (  q  ,  2  *  sizeof  *  p  );  if  (  i  ==  size  -1  )  printf  (  "Rozmiar sterty = %zu  \n  "  ,  GC_get_heap_size  ());  }  powrót  ;  } 

Dla kompletności Boehm obsługuje jawne zwalnianie za pomocą GC_FREE() . Wszystkie podstawienia można wykonać za pomocą makr preprocesora.

Zastosowania i porty

Boehm GC jest używany w wielu projektach zaimplementowanych w C lub C++, takich jak Inkscape , a także w środowiskach wykonawczych dla wielu innych języków, w tym Crystal , wysokowydajny kompilator Pythona Codon, GNU Compiler dla środowiska wykonawczego Java, Projekt Portable.NET , Embeddable Common Lisp , GNU Guile , implementacja Mono platformy Microsoft .NET (również wykorzystująca precyzyjne kompaktowanie GC od wersji 2.8), opcjonalnie GNUstep i libgc-d (powiązanie z libgc dla języka programowania D , używany głównie w MCI). Obsługuje wiele systemów operacyjnych , w tym wiele wariantów systemu Unix (takich jak macOS ) i Microsoft Windows , i zapewnia szereg zaawansowanych funkcji, w tym gromadzenie przyrostowe, gromadzenie równoległe i różnorodne semantyki finalizatora .

Linki zewnętrzne