Rustはよく「Cと同じくらい高速で、かつ安全」と紹介されます。その表現は正しいのですが、最も興味深い点が抜け落ちています。すなわち、Rustを安全にしている仕組みこそが、同時にプログラミング上のエラーの大部分を防ぐ仕組みでもあるのです。
3つの基本ルール
- 各値には、ちょうど1人の所有者がいる
- 所有者がスコープ外に出ると、その値は解放される — コンパイラがその処理を自動的に挿入する
- ある時点において、読み取り専用参照が複数存在するか、書き込み可能な参照がちょうど1つ存在するか、その両方が同時に存在することは決してない
3つ目のルールが最も重要なルールです
データ競合とは、2つのスレッドが同じメモリ領域に同時にアクセスし、少なくとも一方が書き込みを行う場合に発生する。 「複数の読み取りまたは1つの書き込み」というルールは、まさにその状況の否定的な定義である。
そのため、Rustのコンパイラは、データ競合を引き起こすプログラムを拒否します。たとえ、記述時にマルチスレッドを全く意識していなかったとしてもです。これはガベージコレクタにはできないことです。ガベージコレクタは、いつ解放するかを管理するだけで、誰がいつアクセスできるかを管理するわけではないからです。
代償
相互に多くのポインタが結びついているデータ構造(2次元リスト、グラフ、逆ポインタを持つ木など)は、表現が難しくなります。参照カウントや、ポインタの代わりにインデックスを使用するか、あるいは制御された範囲内でのみ安全でないコードを受け入れる必要があります。
学習の段階は確かに大変でした。しかし、「コンパイラが厄介だ」と感じたことの多くは、実はコンパイラが、他の言語なら実行時に、しかも最も都合の悪いタイミングで発生するようなエラーを指摘しているだけだったのです。
Thảo luận