Rust では移動が左辺値に適用され、移動元オブジェクトが使用されないように静的に強制されていることに気付きました。
これらのセマンティクスは、Clean と Mercury に見られる一意性型付けとどのように関連していますか? それらは同じ概念ですか?そうでない場合、それらはどのように異なりますか?
Rust では移動が左辺値に適用され、移動元オブジェクトが使用されないように静的に強制されていることに気付きました。
これらのセマンティクスは、Clean と Mercury に見られる一意性型付けとどのように関連していますか? それらは同じ概念ですか?そうでない場合、それらはどのように異なりますか?
Rust の所有権の概念は、Mercury と Clean の一意性と同じではありませんが、どちらも静的チェックによって安全性を提供することを目的としており、スコープ内の参照の数によって定義されているという点で関連しています。主な違いは次のとおりです。
一意性はより抽象的な概念です。Rust のlvaluesのように、メモリ位置への参照は一意であると解釈できますが、極端ではあるが典型的な例を挙げると、宇宙のすべてのオブジェクトの状態などの抽象的な値にも適用できます。そのような値に対応するポインターはありません。デバッガーなどで開いて検査することはできませんが、他の抽象型と同様にインターフェイスを介して使用できます。目的は、ステートフルネスの存在下で一貫性を維持する値指向のセマンティクスを提供することです。
Mercury では、少なくとも (Clean については言えません)、一意性は所有権よりも制限された概念であり、参照は 1 つだけ存在する必要があります。Rust でできるように、それらが書き込まれないことを条件に、参照の複数のコピーを共有することはできません。また、参考文献を執筆用に貸与することはできませんが、借りた人がそれを使い終わった後でそれを取り戻すことができます。
Mercury で一意のものを宣言しても、参照への書き込みが行われることは保証されません。コンパイラが書き込みが安全かどうかを確認するだけです。その場で更新するのではなく、一意の参照の内容をコピーする実装は引き続き有効です。コンパイラは、指定された最適化レベルで適切であると判断した場合、その場で更新を手配します。あるいは、抽象型の作成者は、同様の (または場合によっては大幅に優れた) 最適化を手動で実行することができます。これは、ユーザーが抽象型を自分と一致する方法で使用することを余儀なくされることを知っていれば安全です。一方、Rust の所有権は、メモリ モデルに直接関係しており、動作についてより強力な保証を提供します。