لماذا لا يحسّن Rust الكود بافتراض عدم وجود aliasing بين مرجعين قابلين للتغيير؟
مرحبًا بالجميع! أنا أدرس Rust وأحاول فهم كيف يستخدم المترجم ضمانات الأمان لتحسين الكود. من المعروف أن المراجع القابلة للتغيير (`&mut T`) في Rust فريدة: في أي لحظة، يمكن أن يوجد مرجع قابل للتغيير واحد فقط للبيانات. هذه القاعدة مضمونة من قبل المترجم في مرحلة التحقق من الاقتراض (borrow checking). يبدو أن هذا يجب أن يعطي LLVM تلميحات قوية للتحسين، مشابهة لـ `restrict` في C/C++. لكنني لاحظت أن Rust في بعض المعايير البسيطة (benchmarks) يُنشئ كودًا لا يستخدم هذا الافتراض.
إليك مثال بسيط:
```rust
pub fn add_assign(x: &mut u32, y: &mut u32) {
*x += *y;
*x += *y;
}
```
توقعت أن يحسّن المترجم هذا إلى `*x += *y * 2`، لأن `x` و `y` لا يمكن أن يشيرا إلى نفس الذاكرة. لكن في الكود المُجمّع المُنشأ (مثلًا على Compiler Explorer)، أرى عمليتي قراءة وجمع. لماذا لا يستخدم Rust ضمان عدم وجود aliasing لمثل هذا التحسين؟ أليس هذا واحدًا من