| その他の名前 | 翻訳 |
|---|---|
| 原作者 | ハンス・ユルゲン・ベーム |
| 開発者 | Ivan Maidanski 他 |
| 初回リリース | 1988年 |
| 安定版リリース | 8.2.4 / 2023年5月26日 |
| リポジトリ |
|
| 書かれた | C |
| タイプ | ガベージコレクター |
| ライセンス | X11に類似(フリーソフトウェア) |
| Webサイト | ホームページ |
Boehm -Demers-Weiserガベージコレクターは、単にBoehm GCまたはBoehmコレクターとも呼ばれ、 Hans Boehm、Alan Demers、Mark Weiserによって開発されたCおよびC++用の保守的な ガベージコレクターです。[1 ] [2] [3]
Boehm GCは、X11ライセンスに似た寛容なフリーソフトウェアライセンスの下で配布されるフリーソフトウェアです。このコレクターを紹介する最初の論文は1992年に発表されました。[4]
デザイン
Hans Boehm はコレクターの動作を次のように説明しています。
コレクターはマークスイープアルゴリズムを使用します。適切な種類の仮想メモリサポートを提供するオペレーティングシステムで、増分コレクションと世代別コレクションを提供します。(現在、これにはさまざまな制限がありますが、SunOS[45]、IRIX、OSF/1、Linux、およびWindowsが含まれます。) オブジェクトが収集されるときに、ファイナライズコードを呼び出すことができます。そのような情報が提供されている場合は、ポインターを見つけるために型情報を利用できますが、通常はそのような情報なしで使用されます。
— http://www.hboehm.info/gc/#details
Boehm GCはリーク検出モード[5]でも実行できます。このモードではメモリ管理は手動で行われますが、Boehm GCはメモリ管理が適切に行われているかどうかをチェックできます。この方法で、プログラマはメモリリークや二重割り当ての解放を見つけることができます。
Boehm GC は、cords と呼ばれるC 文字列処理ライブラリとともに配布されます。これはC++ のロープ(定数の小さな配列のツリー) に似ていますが、適切な割り当て解除に参照カウントを使用する代わりに、ガベージ コレクションを使用してオブジェクトを解放します。cords は、非常に大きなテキスト、その途中でのテキストの変更、スライス、連結、および変更履歴の保持 (元に戻す/やり直し機能) の処理に適しています。
手術
ガベージコレクターは、malloc()をGC_MALLOC()呼び出しに置き換え、 realloc() をGC_REALLOC()呼び出しに置き換え、free()呼び出しを削除するだけで、ほとんどの変更されていない C プログラムで動作します。[1]以下のコードは、C で従来のmallocと free の代わりに Boehm を使用する方法を示しています。 [6]
#include <assert.h> #include <stdio.h> #include <gc.h>
int main ( void ) { int i ; const int size = 10000000 ;
GC_INIT ();
for ( i = 0 ; i < size ; ++ i ) { int ** p = GC_MALLOC ( sizeof * p ); int * q = GC_MALLOC_ATOMIC ( sizeof * q );
assert ( * p == 0 ); * p = GC_REALLOC ( q , 2 * sizeof * p ); if ( i == size -1 ) printf ( "ヒープサイズ = %zu \n " , GC_get_heap_size ()); }
0 を返す; }
完全性のために、BoehmはGC_FREE()を介した明示的な解放をサポートしています。[7]すべての置換はプリプロセッサマクロを使用して行うことができます。
用途とポート
Boehm GCは、InkscapeのようなCやC++で実装された多くのプロジェクト[8]や、Crystal、高性能PythonコンパイラCodon [9] 、 GNU Compiler for Javaランタイム環境、Portable.NETプロジェクト、Embeddable Common Lisp、GNU Guile、Microsoft .NETプラットフォームのMono実装(バージョン2.8以降は精密圧縮GCも使用)、オプションのGNUstep、libgc-d [10] ( Dプログラミング言語用のlibgcへのバインディング、主にMCIで使用)など、他の多くの言語のランタイム環境でも使用されています。Boehm GCは、多くのUnixバリアント( macOSなど)やMicrosoft Windowsを含む多数のオペレーティングシステムをサポートし、増分コレクション、並列コレクション、さまざまなファイナライザセマンティクスなどの高度な機能を提供します。
参考文献
- ^ ab Koranne, Sandeep (2011)、オープンソースツールハンドブック、Springer、pp. 151–154、Bibcode :2011hoos.book.....K、ISBN 978-1441977199。
- ^ Hans Boehm、C および C++ 用のガベージ コレクター
- ^ Andrew W. Appel (1998)、C での最新のコンパイラ実装- 「Boehm Conservative Garbage Collector」、
- ^ HJ Boehm および D. Chase、「ガベージ コレクターに安全な C コンパイルの提案」、C 言語翻訳ジャーナル、第 4 巻第 2 号、1992 年 12 月、126-141 ページ
- ^ ガベージコレクターをリーク検出器として使用する
- ^ ガベージコレクターの使用: 簡単な例
- ^ 「ガベージコレクターインターフェース」www.hboehm.info。
- ^ BDWGCの既知の用途
- ^ 「Exaloop/Codon」。GitHub。
- ^ libgc-d
外部リンク
- 公式サイト
- SourceForgeの Boehm ガベージ コレクター
- GitHub上の BoehmGC 開発用 Git リポジトリ
- C++ 向け透過的なプログラマ主導のガベージ コレクション、Hans-J. Boehm および Michael Spertus
- ドブス博士の C および C++ 用 Boehm コレクター、ジーン マイケル ストーバー、2003 年 3 月 1 日
