تخطَّ إلى المحتوى

17. المخصصات والساحات

أن تعرف من أين تُحجز ذاكرة برنامجك، وتعيدها بنفسك: نصاً نصاً بـ حرر، أو دفعة واحدة بساحة، وأن تكشف ما نسيته بـ --debug-mem، وما استعملته بعد إعادته بالكاشف.

  • كل نص تبنيه، وكل قائمة وقاموس، يُحجز من مخصص. إن لم تذكر مخصصاً فمن الافتراضي.
  • لا جامع قمامة ولا عدّ مراجع في ميم (حُذف عدّ المراجع في 0.7.0). ما لا تحرّره يبقى حتى يخرج البرنامج، ثم يعود كله إلى النظام.
  • الساحة (ساحة(الافتراضي)) مخصص يجمع كل ما يُحجز منه، واعد(الساحة) تعيده كله دفعة. والمدمجات التي تبني شيئاً تأخذ المخصص وسيطاً أخيراً.
  • خاتمه اعد(ساحه) بعد إنشائها تضمن الإعادة عند الخروج من الكتلة، أياً كان المخرج.
ساحة لكل دورة
مجموع = 0
لكل دورة في مدى(0, 3):
ساحه = ساحة(الافتراضي)
خاتمه اعد(ساحه)
كلمات = تقسيم(دمج_نصوص("ا ب ج ", دورة, ساحه), " ", ساحه)
مجموع += طول(كلمات)
اطبع("كلمات في الدورات الثلاث: ", مجموع)
مخرجات مسجّلة من المجمّعmeem 16_ساحة.م · meem 0.10.0+b01b55f
كلمات في الدورات الثلاث: 12

كيف تعرف ما نسيته: شغّل البرنامج بالخيار --debug-mem. يطبع في آخره كل سطر حجز ولم يحرّر، بعدد كتله وحجمه:

نص يُبنى في حلقة ولا يُحرَّر
لكل ع في مدى(0, 3):
ن = "سطر " + نص(ع)
اطبع(ن)
مخرجات مسجّلة من المجمّعmeem --debug-mem 16_تسرب.م · meem 0.10.0+b01b55f
سطر 0سطر 1سطر 2
[ذاكرة] معلومة: كتل لم تُحرَّر من الافتراضي: 3 (75 بايت)، تعود للنظام عند الخروج  سطر 2: 3 كتل، 75 بايت  تلميح: الحجز المتكرر في سطر واحد (حلقة في الغالب) يُعاد بـ خاتمه حرر(...) بعد إنشائه، أو بساحة للمرحلة

حدود الأمان اليوم (0.10.0): الفهرسة والحساب محميان دائماً، والقائمة أو القاموس بعد حرر بالاسم نفسه خطأ E0428 في كل الأوضاع. والاستعمال بعد التحرير عبر اسم آخر، أو بعد اعد لساحته، يكشفه الكاشف الافتراضي في التشغيل المباشر (E0429)، أما في الملف المبني بلا --debug فسلوك غير معرَّف. هذه قائمة من ساحة استُعملت بعد اعد، بالتشغيل المباشر بلا أي خيار:

ساحة بعد اعد
ساحه = ساحة(الافتراضي)
ق = قائمة_من([1, 2, 3], ساحه)
اعد(ساحه)
اطبع(ق[0])
مخرجات مسجّلة من المجمّعmeem ذاكرة_ساحة_بعد_اعد.م · meem 0.10.0+b01b55f
[خطأ تشغيل E0429] سطر 4:7 - استعمال القائمة أو القاموس بعد التحرير (أُنشئت في السطر 2 وحُرّرت في السطر 3)  اطبع(ق[0])

رمز الخروج: 3

في فهرس الأخطاء: E0429

التفصيل في الذاكرة في ميم.

أصلح البرنامج أعلاه بحيث لا يطبع --debug-mem تقريراً، واجمع أطوال النصوص الثلاثة.

اعرض الحل
الحل
مجموع = 0
لكل ع في مدى(0, 3):
ن = "سطر " + نص(ع)
خاتمه حرر(ن)
اطبع(ن)
مجموع += طول(ن)
اطبع("الأحرف: ", مجموع)
مخرجات مسجّلة من المجمّعmeem --debug-mem 16_حل.م · meem 0.10.0+b01b55f
سطر 0سطر 1سطر 2الأحرف: 15
  • نسيان التحرير في حلقة طويلة: لا خطأ، لكن الذاكرة تكبر حتى الخروج. يكشفه --debug-mem بالسطر، وينبّه إليه --strict بالتحذير E0270 للنص المؤقت في الحلقة.
  • تحرير الشيء نفسه مرتين عبر اسمين: «تحرير مزدوج» يكشفه الكاشف (E0350 للقائمة والقاموس، وE0431 للنص، وE0421 للخانة). وفي الملف المبني بلا كاشف يُسقط البرنامج.
  • استعمال قائمة أو قاموس بعد حرر أو بعد اعد لساحتها: خطأ تشغيل بالكاشف، وسلوك غير معرَّف في الملف المبني بلا كاشف. لا تلمس ما حرّرته.

الذاكرة في ميم · مرجع الذاكرة · الحجز والأداء في المدمجات