例えば、プログラミング言語のRustでは、メモリ管理について、所有権・借用・ライフタイムという独特な仕組みを採用しています。
この仕組みがあるため、プログラマがメモリ管理をコントロールすることができます。
そのため、開発する上で制約の多いOSやコンパイラなどのソフトウェアを開発することができますし、高速に動作するプログラムも書くこともできます。
この独特なメモリ管理の所有権について説明します。
変数の場合で考えてみましょう。
所有権とは、変数の中身を所有する権利です。
変数の中身とはなんでしょう?
変数は、イメージでいうと箱のことです。
変数の中身は、箱に入っているデータのことです。
Rustでは変数から変数に代入すると、変数の中身の所有権ごと相手に渡します。
これをムーブと言います。
一方、JavaやC#などの他の言語の場合は、値や参照のコピーになります。
JavaとRustの比較
RustとJavaのコードを比較して、Rustの特徴を見てみましょう。
まずJavaの場合で書いてみます。
public static void main(String[] args) { String a = new String("hello"); String b = a; System.out.println(a); System.out.println(b); } |
このところで、変数bに変数aを代入しています。
コンパイルして実行してみましょう。
結果はこうなります。
hello hello |
Rustで書いてみます。
main(){ let a = "hello".to_string(); let b = a; //★ println!("{}", a); println!("{}", b); } |
このコードは、Javaと同じく、このところで変数bに変数aを代入して、最後にaとbを順番に表示させるコードです。
コンパイルして実行してみましょう。
error[E0382]: borrow of moved value: |
Rustではエラーになっています。
一体なぜなのでしょうか?
これは、変数aのデータの所有権がなくなってしまっているからです。
変数aの所有権は変数bに移動(ムーブ)してしまっているので、aはもう参照できませんと言われています。
b = a は、JavaやC#など、他の言語の場合は値や参照のコピーであり、Rustの場合は所有権のムーブになるのです。
この所有権の概念があることにより、確保したメモリ領域が解放されず、メモリが確保されたままになることが起きにくくなるメリットがあります。
また、メモリ管理のガベージコレクションを採用しないことにより、メモリに対する処理や負荷を減らすメリットもあります。