المستوى المطلوب: متوسط — تحتاج تعرف أساسيات لغة برمجة فيها مؤشرات أو references (C/C++/Go/JavaScript)، ومش لازم تكون كتبت Rust قبل كده.
الـ Borrow Checker في Rust مش عقوبة، هو أمن مجاني للذاكرة بدون Garbage Collector. لو عمرك اتكسر تطبيقك بسبب null pointer أو use-after-free أو data race، Rust بتمنع التلاتة دول قبل ما الكود يكمّل compile. القصة كلها في 3 قواعد بس.
Rust Ownership: 3 قواعد بتمنع 70% من Memory Bugs قبل الـ Compile
المشكلة باختصار
عندك خياريّن في معظم اللغات. الأول: Garbage Collector زي Java أو Go، بياكل CPU عشوائيًا في pause times وبيخفي تكلفته في الـ runtime. الثاني: malloc وfree اليدوي زي C، سريع لكن طلقة في الرجل عند أول غلطة (use-after-free, double free, dangling pointer).
Microsoft Security Response Center نشرت في 2019 إن ~70% من CVEs الأمنية في منتجاتها كانت memory safety bugs. Google قالت في تقرير Android Security 2024 إن نسبة memory safety vulnerabilities في Android نزلت من 76% في 2019 لـ 24% في 2024 بعد ما بدأوا يكتبوا طبقات النظام بـ Rust بدل C++. الأرقام دي مش تسويق، دي اللي خلّت Linux Kernel 7.0 (نزل 12 أبريل 2026) يعتمد Rust كـ stable داخل الـ kernel.
Rust بتختار طريق ثالث: تمنع الغلطات وقت الـ compile، بدون runtime cost. القواعد بتشتغل عبر مفهوم اسمه Ownership.
مثال بسيط جدًا: مفتاح البيت
تخيل بيت معاه مفتاح واحد بس. لو معاك المفتاح، أنت "المالك"، تقدر تستخدم البيت كيف ما تشاء. لو ادّيت المفتاح لصاحبك، هو بقى المالك، وأنت ما تقدرش تدخل تاني إلا لما يردّه. تقدر "تعير" المفتاح لشخص علشان يبص بس على البيت ويرجعه (ده اسمه borrow)، لكن وأنت معيره ما تقدرش تعدّل في البيت في نفس الوقت. لو فيه كذا واحد عايز يبص (قراءة فقط)، تمام، اعمل نسخ متعددة من مفتاح القراءة. لكن لو واحد بيكتب وواحد بيقرا في نفس اللحظة، فيه احتمال تخبيص بيانات.
دي بالظبط فلسفة Ownership في Rust، الفرق إن الـ compiler هو اللي بيراقب القواعد بدل ما تعتمد على ذاكرتك.
التعريف العلمي: 3 قواعد ملزمة
- كل قيمة (value) ليها مالك واحد بس في أي لحظة من حياة البرنامج.
- لما المالك يخرج من نطاقه (scope)، القيمة بتتحرر تلقائيًا عن طريق دالة اسمها
drop. ده مش GC، ده deterministic destruction معروف وقت الـ compile. - تقدر تعمل borrow غير قابل للتعديل (
&T) كم ما تحب في نفس الوقت، أو borrow قابل للتعديل واحد فقط (&mut T)، لكن مش الاتنين معًا.
القاعدة التالتة هي اللي بتمنع data races في الكود متعدد الـ threads قبل ما يشتغل أصلًا. ده مكسب فعلي مش متوفر في C++ ولا Go.