メモリ管理のアプローチ
伝統的に、言語は大きく 2 つのカテゴリに分類されます。
- 手動でのメモリ管理による完全な制御: C、C++、Pascal など
- プログラマーがヒープメモリを割り当てまたは解放するタイミングを決定します。
- プログラマーは、ポインタがまだ有効なメモリを指しているかどうかを判断する必要があります。
- 調査によると、プログラマーは判断を誤ることがあります。
- 実行時の自動メモリ管理による完全な安全性: Java、Python、Go、Haskell など
- ランタイム システムにより、メモリは参照できなくなるまで解放されません。
- Typically implemented with reference counting or garbage collection.
Rust ではこの 2 つを融合することで、新たに以下の特徴を提供します。
コンパイル時の適切なメモリ管理の適用による、完全な制御と安全性。
これは、明示的な所有権の概念によって実現されます。
このスライドは、他の言語を習得済みの受講者に、その文脈の中で Rust を理解してもらうことを目的としています。
-
C では、
malloc
とfree
を使用してヒープを手動で管理する必要があります。よくあるエラーとしては、free
の呼び出しを忘れる、同じポインタに対して複数回呼び出す、ポイントしているメモリが解放された後にポインタを逆参照する、などがあります。 -
C++ にはスマート ポインタ(
unique_ptr
、shared_ptr
など)のツールがあり、デストラクタの呼び出しに関する言語保証を利用して、関数が戻ったときにメモリが解放されるようにします。これらのツールを誤用して C と同様のバグを作成することがよくあります。 -
Java、Go、Pythonでは、アクセスできなくなったメモリの特定と破棄をガーベジコレクタに依存します。これにより、あらゆるポインタの逆参照が可能になり、解放後の使用などのバグがなくなります。ただし、GC (ガーベジコレクション) にはランタイムコストがかかり、適切なチューニングが困難です。
Rust の所有権と借用モデルは、多くの場合、割り当てオペレーションと解放オペレーションを正確に必要な場所で行うことにより、ゼロコストで C のパフォーマンスを実現できます。また、C++ のスマートポインタに似たツールも用意されています。必要に応じて、参照カウントなどの他のオプションを利用できます。また、ランタイムガベージコレクションをサポートするためのサードパーティのクレートも使用できます(このクラスでは扱いません)。