المستوى المطلوب: مبتدئ — هذا المقال موجّه للمطورين اللي بيبدأوا في Rust لأول مرة أو سمعوا عنها بس عمرهم ما فهموا ليه الكومبايلر بيتعب معاهم. مش محتاج خبرة سابقة في Rust، بس محتاج تكون كاتبت كود قبل كده في أي لغة (JavaScript، Python، Java، أو حتى C).
لو شغّلت أول مشروع Rust ولقيت الـ Compiler بيرجّعلك خطأ cannot borrow `x` as mutable more than once at a time، انت مش بتعمل حاجة غلط. انت بتقابل النظام اللي بيخلّي Rust أسرع من Go وأأمن من C في نفس الوقت: الـ Borrow Checker.
Borrow Checker في Rust: المفتاح اللي بيخلّي اللغة آمنة بدون GC
الـ Borrow Checker مش عقبة في طريقك، هو الميزة الأساسية في Rust. هيمنعك من 70% من bugs الذاكرة قبل ما الكود يشتغل، حسب تقرير Microsoft Security Response Center سنة 2019 على CVEs ربع قرن في منتجات الشركة.
المشكلة باختصار: ليه اللغات الموجودة مش كفاية
قبل ما نفهم Rust، لازم نفهم المشكلة اللي بيحلها. فيه 3 طرق شائعة لإدارة الذاكرة، وكل واحدة فيها مشكلة:
- إدارة يدوية (C و C++): انت اللي بتعمل malloc و free يدوي. ميزة: أسرع أداء ممكن. عيب: bug واحد في الإدارة (use-after-free، double-free، buffer overflow) ممكن يكلّفك ثغرة أمنية في الإنتاج.
- Garbage Collector (Java، Python، Go): الـ runtime بيمسح الذاكرة تلقائياً. ميزة: ما بتفكّرش فيها. عيب: pauses عشوائية (Go GC pause بين 100µs و 1ms على heap كبير)، واستهلاك RAM أعلى بـ 2× إلى 3× من اللازم.
- Reference Counting (Swift، Python): كل قيمة بتعدّ كام reference بتشير لها. ميزة: deterministic. عيب: مش بيحل cycles بدون weak references يدوية.
Rust جابت طريق رابع جديد: الـ Compiler يفحص قواعد الـ Ownership وقت الـ build، وبيرفض أي كود ممكن يعمل مشكلة ذاكرة. النتيجة zero-cost abstraction حقيقية: مفيش GC، مفيش runtime overhead، مفيش pauses.
المفهوم بمثال يومي: مفتاح الشقة
قبل ما ندخل في التعريف العلمي، خد المثال ده ببساطة شديدة. تخيّل إنك ساكن في شقة وعندك مفتاح واحد بس لها:
- المالك واحد فقط: المفتاح في إيد شخص واحد في كل لحظة. مينفعش انت وأخوك تكونوا ماسكين نفس المفتاح في نفس الثانية.
- الاستعارة (Borrow): لو صاحبك عايز يدخل الشقة، انت بتديله المفتاح يستعيره. لما يخلّص، المفتاح يرجع لك. هو ما اشتراش الشقة، هو بس استعار المفتاح.
- قاعدة الاستعارة الذهبية: لو حد ماسك المفتاح علشان يغيّر القفل (mutable)، مينفعش حد تاني ياخد المفتاح في نفس الوقت. أما لو هو بس بيتفرّج على الشقة (immutable)، يقدر يكون فيه 100 ناس ماخدين نسخة من نفس المفتاح في نفس الوقت — ما داموا كلهم بيتفرّجوا بس.
دي بالظبط القواعد الـ3 الأساسية في Rust:
- كل قيمة ليها مالك واحد فقط (Owner).
- لما المالك يخرج من نطاقه (scope)، القيمة تتمسح من الذاكرة تلقائياً.