"設計とは、宇宙の法則をコードの文法に埋め込むことである。"
並行処理とは、複数の文脈が同時に存在する宇宙の設計にほかならない。
Rustはこの複雑な宇宙を、Send
と Sync
というわずか2つのトレイトによって支配する。
その支配は暴力ではない。型の意味と振る舞いによる、静かな秩序の確立である。
この章では、Send
と Sync
を単なる「スレッド安全の属性」としてではなく、
**Rustの型システムにおける“宇宙の物理法則”**として捉え直す。
並行性という時空において、なぜこの2つのトレイトが必然であり、また不可避なのかを、設計論の視点から探る。
Send
:転送できるという責任
fn spawn<T: Send + 'static>(f: T) {
std::thread::spawn(move || {
// ...
});
}
Send
トレイトは、「この値をスレッド間でムーブしても良い」という約束である。
単に「コピーしてよい」ではない。これは「責任を他の宇宙に渡してよい」という哲学的判断を型に託している。
String
や Vec<T>
のように所有権を持つ構造体は Send
を実装しており、
一方で Rc<T>
や RefCell<T>
は Send
を実装していない。
これは、「それはひとつの世界でしか生きられない存在である」という、言語からの設計的警告である。
Sync
:同時に読めるという信頼
Sync
トレイトは、「参照が複数スレッドから同時に読まれても壊れない」という保証を意味する。
より正確には、「&T
が Sync
なら、&T
は &T
を他のスレッドに渡せる」というルールだ。
この設計は、「値そのものが不変かどうか」ではなく、**“型として不変であることを語れるか”**が鍵となる。
例:
-
i32
,bool
:Sync(複数スレッドから読んでもOK) -
Cell<T>
:非Sync(内部で可変性を持つため) -
Mutex<T>
:Sync(制御された可変性のための型)
つまり、Syncであることは「構造が同時性に耐えるように設計されている」ことの証明である。
なぜトレイトで制御するのか?:設計の証明を型に委ねるため
Rustでは、Send
や Sync
をトレイトとして表現することで、構文上の柔軟性と構造上の安全性を両立している。
- ユーザー定義型に対して、自動導出か手動での制御が可能
- 一部の構造に関しては、明示的に
!Send
/!Sync
を設計可能(PhantomDataなど)
これは「どんな型も自由に並行処理に投げ込んでよいわけではない」という設計の歯止めであり、
“自由を与える前に、構造を検証させる”というRustの型哲学そのものだ。
並行性の安全は、型の宇宙に委ねられている
C++では「安全であるかどうかはプログラマの設計力に依存する」。
Goでは「goroutineが全てを隠してくれる」。
だがRustは言う。**「設計そのものが安全を証明できなければ、その構造は成立しない」**と。
これは、型がただの制約ではなく、“スレッドという別宇宙に耐えられる構造体”として振る舞えることを求めているということ。
"型とは、宇宙の中で保証されるべき意味の境界である。SendとSyncはその恒星系を定める法則である。"
例外を許す構文:unsafeによる明示的な逸脱
Rustでは、Send/Syncの境界を意図的に破ることも可能だ。
だがそれは unsafe impl Send for MyType {}
のような明示的な宣言を必要とする。
これは「あなたは設計上の信頼の外に出ようとしている」という旗であり、
その時点から、その型にまつわるすべての安全は設計者に委ねられる。
この仕組みは、型安全の境界を越えることは構文で“告白”されなければならないという、設計上の倫理的要求である。
宇宙論としてのSend/Sync:並行性の“見えないルール”を言語化する
Rustにおいて、Send/Syncとは:
- 型の責任範囲を“宇宙単位”で定義する構文
- 並行性における動的バグを静的に封じる機構
- コンパイル時に未来のスレッド間干渉を“予言し、拒絶する”設計的予防線
この二つのトレイトは、**言語が設計に介入し、未来の安全性を先取りするための“時間軸への介入装置”**なのだ。
結語:型は宇宙であり、SendとSyncはその重力である
スレッドという並行宇宙の中で、安全に設計された構造だけが信頼を持って渡されるべきである。
Rustはその信頼の判定を、開発者の思考ではなく、型と構文の体系に委ねることを選んだ。
SendとSyncは、「安全とは計算ではなく、“構造の内側に埋め込まれた哲学”である」ことを示す構文であり、
宇宙のように複雑な並行性を、構文によって制御するための最小にして最大の発明である。
"並行性に安全を求めるならば、それはまず型の内部構造に問うべきである。Rustはその構造を、SendとSyncという名で体系化した。"