ポインターを備えた言語では、コンパイラーがコンパイル時にすべてのポインターが正しく使用されているかどうか、および/または有効である (生きているオブジェクトを参照する) かどうかをさまざまな理由で完全に判断することはできないことをどこかで読んだことがあります。本質的に停止問題の解決を構成します。この場合、この関連する質問で述べられていることと同様に、コンパイル時のプログラムの実行時の動作を推測できるため、直感的には驚くことではありません。
ただし、私が知る限り、Rust 言語では、ポインターのチェックをコンパイル時に完全に行う必要があります (ポインターに関連する未定義の動作はなく、少なくとも「安全な」ポインターはなく、「無効なポインター」または「null ポインター」のランタイムはありません)。いずれかの例外)。
Rust コンパイラが停止問題を解決しないと仮定すると、誤りはどこにあるのでしょうか?
- ポインターのチェックがコンパイル時に完全に行われるわけではなく、Rust のスマート ポインターは、たとえば C の生のポインターと比較して、実行時のオーバーヘッドをまだ導入しているのですか?
- それとも、Rust コンパイラが完全に正しい決定を下すことができず、おそらくライフタイム アノテーションの 1 つ (
<'lifetime_ident>
構文を持つもの) を使用して Just Trust The Programmer™ を使用する必要がある可能性はありますか? この場合、これはポインタ/メモリの安全性が 100% ではなく、プログラマが正しいコードを書くことに依拠しているということですか? - もう 1 つの可能性は、Rust ポインターが非「ユニバーサル」または何らかの意味で制限されているため、コンパイラーはコンパイル時にそれらのプロパティを完全に推測できますが、C の生のポインターや C++ のスマートポインターほど有用ではありません。
- あるいは、それはまったく別のもので、1 つまたは複数の を誤解しているのかもしれません
{ "pointer", "safety", "guaranteed", "compile-time" }
。