لو الكومبايلر بتاع Rust بيرفض كودك بأخطاء غريبة زي "value borrowed here after move"، إنت مش بتقابل bug — إنت بتقابل أهم ميزة في اللغة. الـ Ownership هو السبب اللي بيخلّي Rust أسرع من Go وأأمن من C++ بدون garbage collector. في الـ 8 دقايق الجاية هتفهم المفهوم ده بمثال بسيط من حياتك اليومية، وبعدين بشكل علمي دقيق، وهتعرف ليه كل مهندس باكاند جاد بيتعلمه سنة 2026.
Rust Ownership: المفهوم اللي بيغيّر طريقة تفكيرك في الذاكرة
المشكلة باختصار
أي لغة برمجة محتاجة طريقة تتحكم بيها في الذاكرة. لغات زي C و C++ بتسيب القرار للمبرمج، فبتحصل أخطاء كارثية زي use-after-free و double-free. تقرير رسمي من Microsoft Security Response Center سنة 2019 رصد إن 70% من ثغرات الأمان في كود Microsoft أصلها memory safety. لغات زي Java و Python و Go بتحلّ المشكلة بـ Garbage Collector، بس بتدفع التمن في pause times و memory overhead.
Rust اخترع طريقة تالتة: Ownership. بدل ما تسيب الذاكرة للمبرمج (خطر) أو لـ GC (بطء)، الكومبايلر نفسه بيتأكد إن كل byte في الذاكرة ليه مالك معروف، وبيحرّرها أوتوماتيكي لمّا المالك يخلص شغله.
المثال البسيط: الكتاب اللي إنت اشتريته
تخيّل إنك اشتريت كتاب من المكتبة. الكتاب ده ملكك إنت. لو صديقك سألك "ممكن أقراه؟" قدامك خياران:
- تديهوله وتقوله "خد، بقى ملكك" — في اللحظة دي إنت مش قادر تقراه تاني، لأنك ادّيته. النسخة دلوقتي عند صديقك بس.
- تسلّفه الكتاب لمدة محددة — صديقك بيقرا، وإنت ممكن تستنى ترجع تاخده. لكن لو حاولتوا تكتبوا فيه ملاحظات في نفس اللحظة، الكلام هيتلخبط.
القاعدة الواقعية بسيطة: الكتاب لازم يبقى عند شخص واحد بصلاحية الكتابة في كل لحظة. لو نسخت الكتاب وادّيته لـ 10 أصحاب، وكل واحد فيهم عدّل في النص، مفيش طريقة تعرف أنهي نسخة هي الصح.
Rust بيطبّق نفس القاعدة دي على الذاكرة بالظبط: كل قيمة في البرنامج ليها مالك واحد فقط (owner) في كل وقت. لما المالك يخرج من scope، الذاكرة بتتحرّر تلقائياً. مفيش garbage collector، مفيش free() يدوي، مفيش حتى ثانية واحدة في تشغيل البرنامج بتتصرف على إدارة الذاكرة.
التعريف العلمي الدقيق
Ownership في Rust هو نموذج لإدارة الذاكرة مبني على ثلاث قواعد ثابتة، مكتوبة حرفياً في توثيق Rust الرسمي (The Rust Programming Language Book — Chapter 4):
- كل قيمة في Rust ليها متغير واحد بيُسمّى الـ owner.
- القيمة ليها owner واحد فقط في كل وقت (no aliasing of mutable state).
- لما الـ owner يخرج من الـ scope، القيمة بتتحرّر (dropped) تلقائياً.
القواعد دي بتُفحص compile-time بواسطة جزء من الكومبايلر اسمه borrow checker. يعني الأخطاء بتطلع قبل ما البرنامج يشتغل أصلاً. ده بيختلف جذرياً عن Garbage Collection اللي بيشتغل runtime ويوقف البرنامج لحظات (stop-the-world pauses) عشان يلمّ الذاكرة المهجورة.
]]>