Rust:所有権は、GCでは解決できないどのような問題を解決するのか
写真:Wikimedia Commons

Rust:所有権は、GCでは解決できないどのような問題を解決するのか

単に処理が速くなるというわけではありません。重要なのは、コンパイル時に一連のエラーをまとめて検出できるという点です。

Rustはよく「Cと同じくらい高速で、かつ安全」と紹介されます。その表現は正しいのですが、最も興味深い点が抜け落ちています。すなわち、Rustを安全にしている仕組みこそが、同時にプログラミング上のエラーの大部分を防ぐ仕組みでもあるのです。

3つの基本ルール

  • 各値には、ちょうど1人の所有者がいる
  • 所有者がスコープ外に出ると、その値は解放される — コンパイラがその処理を自動的に挿入する
  • ある時点において、読み取り専用参照が複数存在するか、書き込み可能な参照がちょうど1つ存在するか、その両方が同時に存在することは決してない

3つ目のルールが最も重要なルールです

データ競合とは、2つのスレッドが同じメモリ領域に同時にアクセスし、少なくとも一方が書き込みを行う場合に発生する。 「複数の読み取りまたは1つの書き込み」というルールは、まさにその状況の否定的な定義である。

そのため、Rustのコンパイラは、データ競合を引き起こすプログラムを拒否します。たとえ、記述時にマルチスレッドを全く意識していなかったとしてもです。これはガベージコレクタにはできないことです。ガベージコレクタは、いつ解放するかを管理するだけで、誰がいつアクセスできるかを管理するわけではないからです。

代償

相互に多くのポインタが結びついているデータ構造(2次元リスト、グラフ、逆ポインタを持つ木など)は、表現が難しくなります。参照カウントや、ポインタの代わりにインデックスを使用するか、あるいは制御された範囲内でのみ安全でないコードを受け入れる必要があります。

学習の段階は確かに大変でした。しかし、「コンパイラが厄介だ」と感じたことの多くは、実はコンパイラが、他の言語なら実行時に、しかも最も都合の悪いタイミングで発生するようなエラーを指摘しているだけだったのです。

Chia sẻ

Thảo luận