GC付き言語
GC(ガベージコレクタとは)
前提として
プログラムを動かすとき必ず変数やオブジェクトに対してメモリが必要ですよね。
プログラム実行時に任意のタイミングで確保と開放ができる領域をヒープ領域といいます。
しかしメモリは無限にあるわけではないので必要な分だけ確保、使わなくなったら開放して他がその領域を使えるようにしなければなりません。
では確保と開放はどのように行うのでしょうか?ここでGCの話になってきます。
GCとは
GCとはプログラム実行上まだ確保しておきたいオブジェクトと不要なオブジェクトを判断し、不要なオブジェクトの領域を開放します。これにより不必要なオブジェクトがメモリを占領し続けることを防止できます。
GCの仕組みメリット・デメリット(簡単に)
GCはルート集合と呼ばれる参照の基となるオブジェクトから参照をたどっていき、参照でつながっているオブジェクト群を必要なオブジェクト(ライブオブジェクト)と判断します。非ライブオブジェクトのメモリ領域はGCによって解放されます。
プログラマが明示的にメモリの確保・開放を指示しなくてもよいことはメリットです。しかしGCによる必要・不必要の判断は絶対ではなく、またGCがその判断をする分処理コストがかかります。GC付き言語だから遅いとまで言われるときがあります。
GCがない言語は?
GCによるメモリ管理をしていない言語
C/C++,RustなどGCを利用していない言語はいくつもあります。
上に上げた言語は実行速度が早いと言われていますがその一因はGCを使用していないことにあるでしょう。
GCを使用しないと?
プログラマが明示的にメモリの確保・開放を指示したり、メモリの返還タイミングに厳密な規則を設けることで対応しています。前者はC/C++,後者はRustです。
プログラマがメモリ管理を意識しなくていいことはメリットたり得ますが、メモリ管理を意識したコードを書くこともまた莫大なメリットたり得ます。ぜひRust書きましょう(宣伝)
Discussion