القمامة (علوم الحاسوب)
في علم الحاسوب ، تشمل البيانات المهملة البيانات ، والكائنات ، أو أي مناطق أخرى من ذاكرة نظام الحاسوب (أو موارد النظام الأخرى)، والتي لن تُستخدم في أي عملية حسابية مستقبلية من قِبل النظام، أو من قِبل أي برنامج يعمل عليه. ولأن كل نظام حاسوب يمتلك مقدارًا محدودًا من الذاكرة، ولأن معظم البرامج تُنتج بيانات مهملة، فغالبًا ما يكون من الضروري تحرير الذاكرة التي تشغلها هذه البيانات المهملة وإعادتها إلى كومة الذاكرة، أو مجمع الذاكرة، لإعادة استخدامها.
تصنيف
تُصنّف البيانات المهملة عمومًا إلى نوعين: البيانات المهملة التركيبية ، وهي أي كائن أو بيانات موجودة ضمن مساحة ذاكرة البرنامج ولكن لا يمكن الوصول إليها من مجموعة جذر البرنامج ؛ والبيانات المهملة الدلالية ، وهي أي كائن أو بيانات لا يتم الوصول إليها مطلقًا من قِبل برنامج قيد التشغيل لأي مجموعة من مدخلات البرنامج. أما الكائنات والبيانات التي لا تُصنّف كبيانات مهملة فتُسمى بيانات حية .
بصورة مبسطة، البيانات المهملة التركيبية هي بيانات لا يمكن الوصول إليها، بينما البيانات المهملة الدلالية هي بيانات لن يتم الوصول إليها. وبشكل أدق، البيانات المهملة التركيبية هي بيانات لا يمكن الوصول إليها بسبب مخطط المرجع (لا يوجد مسار إليها)، ويمكن تحديد ذلك بواسطة العديد من الخوارزميات، كما هو موضح في تتبع عملية جمع البيانات المهملة ، ولا يتطلب الأمر سوى تحليل البيانات نفسها، وليس تحليل الكود. أما البيانات المهملة الدلالية فهي بيانات لن يتم الوصول إليها، إما لأنها غير قابلة للوصول (وبالتالي تُصنف أيضاً ضمن البيانات المهملة التركيبية)، أو لأنها قابلة للوصول ولكن لن يتم الوصول إليها؛ ويتطلب تحديد الحالة الأخيرة تحليل الكود، وهي في الغالب غير قابلة للحسم .
تعتبر القمامة النحوية مجموعة فرعية (عادة ما تكون صارمة) من القمامة الدلالية، حيث أنه من الممكن تمامًا أن يحتفظ كائن ما بمرجع لكائن آخر دون استخدام ذلك الكائن على الإطلاق.
مثال
في تطبيق المكدس البسيط التالي في جافا، يصبح كل عنصر يتم إخراجه من المكدس عديم القيمة بمجرد عدم وجود أي مراجع خارجية له: [ a ]
public class Stack { private Object [] elements ; private int size ;public Stack ( int capacity ) { elements = new Object [ capacity ] ; } public void push ( Object e ) { elements [ size ++] = e ; } public Object pop () { return elements [-- size ] ; } }وذلك لأنّ elements[]المتغير لا يزال يحتوي على مرجع للكائن، ولكن لن يتم الوصول إلى الكائن مرة أخرى من خلال هذا المرجع، لأنّه elements[]خاص بالفئة، popولا تُعيد الدالة سوى مراجع للعناصر التي لم يتم حذفها بعد. (بعد إنقاص قيمة المتغير ، لن تتمكنsize هذه الفئة من الوصول إلى ذلك العنصر مرة أخرى). مع ذلك، فإنّ معرفة ذلك تتطلب تحليلًا لشيفرة الفئة، وهو أمر غير قابل للتقرير بشكل عام.
إذا قام استدعاء لاحق pushبإعادة نمو المكدس إلى الحجم السابق، مما يؤدي إلى الكتابة فوق هذا المرجع الأخير، فسيصبح الكائن قمامة نحوية، لأنه لا يمكن الوصول إليه مرة أخرى، وسيكون مؤهلاً لجمع القمامة.
جمع القمامة الآلي
يمكن إنتاج مثال على التجميع التلقائي للنفايات النحوية، عن طريق تجميع النفايات باستخدام عد المراجع ، باستخدام مترجم سطر أوامر بايثون :
>>> class Foo : ... """هذه فئة اختبار فارغة.""" ... pass ... >>> bar = Foo () >>> bar <__main__.Foo object at 0x54f30> >>> del barفي هذه الجلسة، يتم إنشاء كائن، وعرض موقعه في الذاكرة، ثم يتم حذف المرجع الوحيد للكائن - فلا توجد طريقة لاستخدام الكائن مرة أخرى من هذه النقطة فصاعدًا، حيث لا توجد أي مراجع له. ويتضح هذا الأمر عندما نحاول الوصول إلى المرجع الأصلي:
>>> bar Traceback (most recent call last): File "<stdin>" , line 1 , in ? NameError : name 'bar' is not definedبما أنه أصبح من المستحيل الآن الإشارة إلى الكائن، فقد أصبح الكائن عديم الفائدة؛ إنه بيانات مهملة. ولأن بايثون تستخدم خاصية جمع البيانات المهملة، فإنها تقوم تلقائيًا بتحرير الذاكرة التي كان يستخدمها الكائن حتى يمكن استخدامه مرة أخرى.
>>> class Bar : ... """هذه فئة اختبار أخرى.""" ... pass ... >>> baz = Bar () >>> baz <__main__.Bar object at 0x54f30>يوجد الآن كائن Bar في موقع الذاكرة 0x54f30 ، وهو نفس موقع الكائن السابق Foo . وبما أن كائن Foo قد تم حذفه، مما أدى إلى تحرير الذاكرة التي كان يشغلها، يقوم المفسر بإنشاء كائن Bar في نفس موقع الذاكرة السابق، مستفيدًا من الموارد المتاحة.
الآثار
تستهلك البيانات المهملة ذاكرة الكومة، وبالتالي يرغب المرء في جمعها (لتقليل استخدام الذاكرة، والسماح بتخصيص الذاكرة بشكل أسرع، ومنع أخطاء نفاد الذاكرة عن طريق تقليل تجزئة الكومة واستخدام الذاكرة).
مع ذلك، تستغرق عملية جمع البيانات المهملة وقتًا، وإذا تمت يدويًا، فإنها تتطلب جهدًا برمجيًا إضافيًا. علاوة على ذلك، يؤدي جمع البيانات المهملة إلى تدمير الكائنات، وبالتالي قد يتسبب في استدعاء دوال الإنهاء ، مما يؤدي إلى تنفيذ تعليمات برمجية قد تكون عشوائية في أي نقطة من نقاط تنفيذ البرنامج. ينتج عن جمع البيانات المهملة بشكل غير صحيح (تحرير ذاكرة غير مهملة)، والذي يعود أساسًا إلى أخطاء في عملية الجمع اليدوي (وليس أخطاء في خوارزميات جمع البيانات المهملة)، انتهاكات تتعلق بسلامة الذاكرة (والتي غالبًا ما تُنشئ ثغرات أمنية) بسبب استخدام المؤشرات المعلقة .
يمكن جمع البيانات المهملة التركيبية تلقائيًا، وقد خضعت أدوات جمع البيانات المهملة لدراسات وتطويرات مكثفة. أما البيانات المهملة الدلالية، فلا يمكن جمعها تلقائيًا بشكل عام، مما يؤدي إلى تسرب الذاكرة حتى في اللغات التي تستخدم جمع البيانات المهملة. ويتم عادةً اكتشاف البيانات المهملة الدلالية وإزالتها باستخدام أداة تصحيح أخطاء متخصصة تُسمى محلل أداء الذاكرة ، والتي تتيح معرفة الكائنات النشطة وكيفية الوصول إليها، مما يمكّن من إزالة المراجع غير المقصودة.
التخلص من القمامة
تُعدّ مشكلة إدارة تحرير الذاكرة غير المستخدمة مشكلة معروفة في علوم الحاسوب. وتُتّبع عدة مناهج في هذا الشأن:
- تستعيد العديد من أنظمة التشغيل الذاكرة والموارد التي يستخدمها برنامج أو عملية ما عند انتهاء تشغيلها. ويمكن للبرامج البسيطة أو قصيرة العمر، المصممة للعمل في مثل هذه البيئات، أن تتوقف وتسمح لنظام التشغيل بإجراء أي عملية استعادة ضرورية.
- في الأنظمة أو لغات البرمجة التي تعتمد على إدارة الذاكرة اليدوية ، يجب على المبرمج تحديد آلية تحرير الذاكرة عند عدم استخدامها. وتُعدّ لغتا C و C++ من اللغات المعروفة التي تدعم هذا النموذج.
- تستخدم عملية جمع البيانات المهملة خوارزميات متنوعة لتحليل حالة البرنامج تلقائيًا، وتحديد البيانات المهملة، وتحريرها دون تدخل من المبرمج. توفر العديد من لغات البرمجة الحديثة، مثل جافا وهاسكل ، خاصية جمع البيانات المهملة تلقائيًا. مع ذلك، فهي ليست تقنية حديثة، إذ استُخدمت أيضًا في لغات أقدم مثل ليسب .
- تُجرى حاليًا أبحاثٌ حول المناهج القائمة على نظرية الأنواع (مثل استنتاج المناطق ) لتحديد وإزالة البيانات غير الضرورية من البرنامج. ولم يتم التوصل إلى حل عام قائم على نظرية الأنواع لهذه المشكلة.
ملحوظات
- ↑ تم تبسيطها من العنصر السادس من كتاب Effective Java عن طريق حذف تغيير الحجم والاستثناءات الصريحة.
روابط خارجية
- بنيامين بيرس (محرر)، مواضيع متقدمة في أنواع البيانات ولغات البرمجة ، مطبعة معهد ماساتشوستس للتكنولوجيا (2005)، رقم ISBN 0-262-16228-8
- ريتشارد جونز ورافائيل لينز، جمع البيانات المهملة: خوارزميات لإدارة الذاكرة الديناميكية المؤتمتة ، وايلي وأولاده (1996)، رقم ISBN 0-471-94148-4
- بيانات الحاسوب
- برمجة الحاسوب
