فهم إدارة الذاكرة بلغات البرمجة الحديثة

مرحبا يا هابر! أقدم لكم ترجمة مقال " إزالة الغموض عن إدارة الذاكرة في لغات البرمجة الحديثة " بقلم Deepu K Sasidharan.

في هذه السلسلة من المقالات ، أود أن أبدد حجاب التصوف على إدارة الذاكرة في البرمجيات (المشار إليها فيما يلي باسم البرمجيات) وأن أدرس بالتفصيل الإمكانيات التي توفرها لغات البرمجة الحديثة. آمل أن تساعد مقالاتي القارئ على النظر تحت غطاء هذه اللغات وتعلم شيء جديد لأنفسهم.

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

الجزء الأول: مقدمة في إدارة الذاكرة


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

ما هو استخدام ذاكرة الوصول العشوائي؟


عندما يعمل البرنامج على نظام تشغيل الكمبيوتر ، فإنه يحتاج إلى الوصول إلى ذاكرة الوصول العشوائي (RAM) من أجل:

  • تحميل الرمز الخاص بك للتنفيذ ؛
  • تخزين قيم المتغيرات وهياكل البيانات المستخدمة في العملية ؛
  • تحميل الوحدات الخارجية التي يحتاجها البرنامج لإكمال المهام.

بالإضافة إلى المساحة المستخدمة لتحميل الكود الخاص به ، يستخدم البرنامج منطقتين من ذاكرة الوصول العشوائي عند العمل - المكدس (المكدس) والكومة (الكومة).

كومة


يتم استخدام المكدس للتخصيص الثابت للذاكرة. وقد تم تنظيمه على أساس مبدأ "آخر يأتي - يخرج أولاً" ( LIFO ). يمكنك تخيل المكدس كمجموعة من الكتب - يُسمح بالتفاعل فقط مع الكتاب الأعلى: اقرأه أو ضع كتابًا جديدًا عليه.

  • بفضل المبدأ المذكور ، يتيح لك المكدس تنفيذ العمليات بسرعة باستخدام البيانات - يتم تنفيذ جميع عمليات التلاعب باستخدام "أفضل كتاب في المكدس". يضاف الكتاب إلى الأعلى إذا كنت بحاجة إلى حفظ البيانات ، أو يؤخذ من الأعلى إذا كانت هناك حاجة لقراءة البيانات ؛
  • , , , — ;
  • — . , , — , . , , , . , , , — , ;
  • ;
  • ; ;
  • ;
  • (stack overflow), . , ;
  • , ;



JavaScript. , .


يتم استخدام الكومة لتخصيص الذاكرة بشكل ديناميكي ، ولكن ، على عكس الرصة ، يجب أولاً العثور على البيانات في الكومة باستخدام "جدول المحتويات". يمكن للمرء أن يتخيل أن كومة الذاكرة المؤقتة هي مكتبة كبيرة متعددة المستويات ، حيث يمكنك العثور على الكتاب اللازم باتباع تعليمات معينة.

  • يتم تنفيذ العمليات على الكومة بشكل أبطأ إلى حد ما من المكدس ، لأنها تتطلب خطوة إضافية للبحث عن البيانات ؛
  • يخزن الكومة بيانات ذات أحجام ديناميكية ، على سبيل المثال ، قائمة يمكنك إضافة عدد عشوائي من العناصر إليها ؛
  • كومة مشتركة لكافة مؤشرات ترابط التطبيق ؛
  • بسبب طبيعتها الديناميكية ، فإن الكومة غير تافهة في الإدارة ومعها تنشأ معظم المشاكل والأخطاء المرتبطة بالذاكرة. يتم توفير طرق حل هذه المشاكل من خلال لغات البرمجة.
  • , — ( , ), , , ;
  • (out of memory), , ;
  • , , , .


?


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

مقاربات مختلفة


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

إدارة الذاكرة اليدوية


لا توفر اللغة آليات لإدارة الذاكرة التلقائية. يظل تخصيص وتحرير الذاكرة للكائنات التي تم إنشاؤها بالكامل على ضمير المطور. مثال على لغة من هذه - وC . ويوفر عددا من الطرق ( malloc ، realloc ، calloc و حرة ) لإدارة الذاكرة - المطور يجب استخدامها لتخصيص وتحرير الذاكرة في برنامجه. يتطلب هذا النهج دقة وعناية كبيرة. كما أنه صعب بشكل خاص للمبتدئين.

جامع القمامة


تجميع البيانات المهملة هي عملية إدارة الذاكرة التلقائية في كومة الذاكرة المؤقتة ، والتي تتكون من العثور على أجزاء غير مستخدمة من الذاكرة التي كانت مشغولة سابقًا لاحتياجات البرنامج. يعد هذا أحد الخيارات الأكثر شيوعًا لإدارة الذاكرة في لغات البرمجة الحديثة. عادة ما يبدأ روتين جمع البيانات المهملة في فترات زمنية محددة مسبقًا ويحدث أن يتزامن إطلاقه مع العمليات المستهلكة للموارد ، مما يؤدي إلى تأخير في التطبيق. JVM ( Java / Scala / Groovy / Kotlin ) ، JavaScript ، Python ، C # ، Golang ، OCaml وروبي هي أمثلة على اللغات الشائعة التي تستخدم جامع القمامة.

  • جامع القمامة Mark & ​​Sweep: هذه خوارزمية تعمل على مرحلتين: أولاً ، تحدد الكائنات الموجودة في الذاكرة التي يتم الرجوع إليها ، ثم تحرر الذاكرة من الكائنات التي لم يتم وضع علامة عليها. يتم استخدام هذا النهج ، على سبيل المثال ، في JVM و C # و Ruby و JavaScript و Golang. هناك العديد من خوارزميات جمع القمامة المختلفة للاختيار من بينها في JVM ، وتستخدم محركات JavaScript مثل V8 خوارزمية وضع العلامات بالإضافة إلى حساب الارتباط. يمكن توصيل جامع القمامة هذا في C و C ++ كمكتبة خارجية.

    تصور خوارزمية وضع العلامات: يتم وضع علامة على الكائنات المرتبطة بالارتباطات ، ثم يتم حذف الكائنات التي لا يمكن الوصول إليها
  • : — , . . , , , , PHP, Perl Python. C++;


(RAII)


RAII هي لغة برمجية في OOP ، بمعنى أن منطقة الذاكرة المخصصة لكائن مرتبطة بصرامة بعمرها. يتم تخصيص الذاكرة في المنشئ وتحريرها في المدمر. تم تنفيذ هذا النهج لأول مرة في C ++ ، ويستخدم أيضًا في Ada و Rust .

عد الارتباط التلقائي (ARC)


هذا النهج يشبه إلى حد كبير جمع القمامة مع العد المرجعي ، ومع ذلك ، بدلاً من بدء عملية الحساب في فترات زمنية معينة ، يتم إدراج تعليمات تخصيص الذاكرة وتحريرها مباشرة في الرمز الثانوي في مرحلة التجميع. عندما يصل العداد المرجعي إلى الصفر ، يتم تحرير الذاكرة كجزء من تدفق البرنامج العادي.

لا يزال العد المرجعي التلقائي لا يسمح بمعالجة الروابط الدائرية ويتطلب من المطور استخدام كلمات رئيسية خاصة للمعالجة الإضافية لهذه المواقف. ARC هي إحدى ميزات مترجم Clang ، وبالتالي فهي موجودة في اللغتين Objective-C و Swift . أيضا ، يتوفر العد المرجعي التلقائي للاستخدام في الصدأ.ومعايير C ++ الجديدة مع مؤشرات ذكية .

ملكية


هذا مزيج من RAII مع مفهوم الملكية ، عندما يجب أن يكون لكل قيمة في الذاكرة متغير مالك واحد فقط. عندما يغادر المالك منطقة التنفيذ ، يتم تحرير الذاكرة على الفور. يمكننا القول أن هذا يشبه تقريبًا عد الروابط في مرحلة التجميع. يتم استخدام هذا النهج في Rust وفي نفس الوقت لم أجد أي لغة أخرى تستخدم آلية مماثلة.




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

اقرأ أيضًا الأجزاء الأخرى من السلسلة:



المراجع





إذا أعجبك المقال ، فيرجى وضع علامة زائد أو كتابة تعليق.

يمكنك الاشتراك في مؤلف المقال على Twitter و LinkedIn .

الرسوم التوضيحية:
التصور المكدس باستخدام pythontutor .
توضيح مفهوم الملكية: Link Clark ، فريق Rust تحت ترخيص Creative Commons Attribution Share-Alike v3.0 .

لإثبات الترجمة، شكر خاص ل الكسندر Maksimovsky و كاترينا Shibakova

All Articles