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