لماذا لا يقوم Rust بتحسين الكود إذا كان المرجعان القابلان للتغيير (mutable references) لا يمكن أن يتداخلا؟
مرحبًا بالجميع! بدأت في تعلم Rust ووجدت نقطة مثيرة للاهتمام. أعلم أن القاعدة الأساسية للسلامة في Rust هي أنه لا يمكن أن يكون لدينا مرجعان قابلان للتغيير (`&mut T`) يشيران إلى نفس البيانات في نفس الوقت. يقوم المترجم بالتحقق من ذلك بدقة في مرحلة التجميع من خلال نظام الاقتراض.
ومع ذلك، لاحظت شيئًا غريبًا. عندما أكتب دالة بسيطة تجمع رقمين، مررًا إياهما كمرجعين قابلين للتغيير، لا يُنتج المترجم الكود الأمثل.
إليك مثال:
```rust
pub fn add(x: &mut u32, y: &mut u32) -> u32 {
*x + *y
}
```
توقعت أن يفهم المترجم (LLVM): بما أن `x` و `y` هما `&mut`، فإنهما مضمونان بعدم الإشارة إلى نفس منطقة الذاكرة (noalias). هذا يعني أنه يمكن ببساطة تحميل القيم من هذه العناوين وجمعها. ولكن عندما أنظر إلى مخرجات التجميع (على سبيل المثال، على godbolt.org)، أرى أن المترجم يُنتج كودًا يحتوي على تعليمات تحميل وإلغاء مرجعية صريحة، بدلاً من مجرد جمع السجلات.
لماذا يحدث هذا؟