Rustの所有権モデル

rust-lang のメモリ安全性を、ガベージコレクタなしにコンパイル時の検査で保証する中心概念。

Shared XOR Mutable

  • 「参照の共有」も「参照を通じた変更」もできるが、両方を同時には許さない。共有可能な参照(&T)は不変、可変参照(&mut T)は排他的(同時に1つだけ)。
  • これが言語レベル(borrow checker)で強制され、データ競合を静的に排除する。よりハードウェアリソースを意識した安全設計といえる。

ライフタイム

  • すべての参照にはライフタイム(生存期間)が割り当てられる。匿名ライフタイム '_ は省略を明示する記法。
  • 省略ルール: (1)各引数に別々のライフタイム、(2)入力ライフタイムが1つならそれが返り値に、(3)&self/&mut self があればそのライフタイムが返り値に適用。
  • ライフタイム境界 <T: 'a>: すべての &T'a より長生きすることを要求する。
  • borrow checker の研究実装として Polonius がある。

内部可変性と共有所有

  • Rc/Arc: shared_ptr 相当の参照カウント。スレッド安全版が Arc
  • RefCell: borrow チェックを実行時に遅延させる(内部可変性パターン)。& からでも borrow_mut() でき、二重借用すると panic。Rc<RefCell<T>> で可変な共有グラフを、Arc<Mutex<T>> でスレッド間共有可変を表現する。

応用

  • これらの規律により parallel-computing のデータ競合を型で防ぐ。非同期は tokio / Rust async を参照。
  • ミッションクリティカル分野向けに Ferrocene(Rust の言語仕様策定・認証)が進む。

関連: _moc-systems / rust-lang