هناك العديد من نماذج إدارة الذاكرة التي تستخدمها لغات البرمجة المختلفة.

فمنها ما يعتمد على التفريغ اليدوي للذاكرة مثل لغة البرمجة سي ولغة البرمجة سي بلص بلص.

ومنها ما يعتمد على تفريغ مجمع القمامة أو المعروف اصطلاحاً ب Garbage Collector أو GC اختصاراً مثل لغة البرمجة سي شارب ولغة البرمجه جافا ومعظم اللغات الحديثة.

ومنها ما لا يعتمد على هذا أو ذاك – فهو يحاول بالقليل من القيود المفروضة على المطور أن يعطية أداء مقارب جداً للغات ذات الإدارة اليدوية للذاكرة بدون الحاجة إلى تعقيدات إدارة مثل هذة المهمة وأشهر اللغات الموجودة في تلك الساحة هي لغة البرمجة راست.

راست هي لغة برمجة غريبة – هي ليست سهلة بالتأكيد لتتعلمها حتى وإن ظهرت طريقة كتابتها سهلة للوهلة الأولى – وذلك يرجع ابتداءاً إلى مبدأ غريب تتبناة راست وهو أنها لغة آمنة في الوضع الافتراضي.

نموذج التملك والإستعارة الخاص براست

نموذج التملك والإستعارة الخاص براست

ونقصد هنا بالآمنة أن كل المتغيرات هي في الأصل ثوابت إلى أن تجعلها أنت متغيرة ( عكس كل لغات البرمجة الموجودة تقريباً ) وأيضاً لا يمكن التعديل على نفس قطعة البيانات من أكثر من مكان.

يمكنك بالتأكيد قراءة نفس قطعة البيانات من أكثر من قارئ بيانات ولكنك لا يمكنك التعديل إلا من مكان واحد فقط. هذا المكان هو المكان الذي ينتمي إلية المتغير المرغوب التعديل علية.

نجد في صورة الشاشة المرفقة دالة اسمها display_quantity تأخذ نوعاً اسمة GroceryItem كمعطى لها.

وفي الدالة الرئيسية نحاول استدعاء تلك الدالة وتمرير صنف لها لكي تقوم بعرض كميتة. نحاول أن نقوم باستدعاء أكثر من دالة على نفس المتغير أكثر من مرة ( مرتين تحديداً ).

ولكن هذة الشفرة المصدرية لن تقوم بالبناء أصلاً وسوف يقوم المفسر أو ال Compiler برفضها تماماً لو كتبتها بدون علامة ال &.

ولمعرفة لماذا قد يحدث ذلك لا بد أن نعرف كيف يتم تمرير البيانات في الطرق التقليدية أولاً ومقارنتها براست.

في كل لغات البرمجة الموجودة على ظهر الكوكب تقريباً يتم تمرير إحدى اثنتين:

  1. نسخة من البيانات/الكائن المراد العمل عليه.
  2. مرجع مباشر للتعديل على الكائن الأصلي.

راست لا تقم بذلك إطلاقاً – ففي الحالة الأولى نحن نهدر الموارد عن طريق خلق نسخ غير ضرورية فقط لإتمام عملية ما.

وفي الحالة الثانية نحن نعرض صحة البيانات للخطر كما ونعرض أنفسنا لمشاكل تسرب الذاكرة أو ال Memory Leaks وما يسمى بسباق البيانات أو ال Data Races.

في راست الكائن تنتقل ملكيتة إلى الدالة التي يتم تمريره لها – وكي لا تفهم كلامي بأنه يتم نقل مرجعة في الذاكرة فقط لتلك الدالة فهو لا يتم كذلك بالتأكيد.

وإنما يتم نقل ملكيتة إلى دالة جديدة – وهو مفهوم جديد تقدمة راست ولكن مفادة ومحصلتة بأن تلك الدالة الجديدة قبل أن تنتهي وترجع لابد أن تقوم بالتخلص من ذلك الكائن وتدميرة.

بتلك الطريقة لا نحتاج إلى مجمع قمامة أو Garbage Collector وأيضاً لا نقم بتفريغ الذاكرة يدوياً… ولكن هذا بالطبع تنشأ عنة مشكلات عدة من ضمنها أنه بمجرد تمريرك لكائن ما إلى دالة ما

فإنة تنتقل ملكيتة من الدالة الأم أو main لها – وذلك يعني أنه يصبح غير متاح لإجراء العمليات عليه فيما بعد.

ماذا إذا كنت فقط تريد استعارتة وإعادتة مرة أخرى؟ ماذا إن كنت حقاً تحتاج إلى ذلك؟

هنا يأتي الدور الجبار لنظام الاستعارة في راست – ذلك النظام العبقري الذي يمكنك من استعارة مرجع لكائن ما وتمريرة لدالة للقيام بعمليات عليه ثم عند الإنتهاء منه لا تقم بتدميرة لأن ملكيتة لم تنتقل لها أصلاً وإنما ظلت في الدالة الأم.

نظام الاستعارة ذلك ببساطة في طريقة كتابة اللغة يتم عن طريق كتابة علامة ال & قبل الكائن المراد استعارتة.

أيضاً لا يمكنك استعارة نفس الكائن في أكثر من مكان في نفس الوقت ( لا يمكنك الحصول على أكثر من مرجع للتعديل على نفس الكائن كما أسلفنا بالذكر ).

قواعد الأمان الافتراضية تلك لم تخترعها راست بالتأكيد – فهي كانت موجودة بالفعل في أوساط باحثي الدكتوراة ومنظري علوم البرمجة في الأكاديميات المختلفة حول العالم.

ولكن لم يسبق أن استطاعت لغة أن تحقق النجاح الذي حققتة راست في ذاك الإطار. ذلك أن عامل نجاح راست لم يكن فقط هذة النقطة – وإن كانت في رأيي كافية – وإنما أن راست لغة مليئة بأشياء محببة للمطورين. أشياء قد تزيد من وقت تطويرهم للأنظمة المختلفة من خلالها ولكنها أيضاً تزيد من صلابة شفراتهم المصدرية وسرعتها وتحسن من التطوير على الشفرة المصدرية في المستقبل وتتبع عيوب ومشاكل تسرب الذاكرة.

إن راست نجحت في تقديم باقة رائعة من كل شئ بأقل قدر ممكن من التنازلات. وأنا أعتقد أنها سوف تكون إحدى أهم لغات القرن الحادي والعشرين.

Categorized in:

Rust,

Last Update: 30/03/2024