الذاكرة في ميم
باختصار: الذاكرة في ميم يدوية، قريبة من نموذج Zig. لا عدّ مراجع ولا جامع قمامة (حُذف عدّ المراجع في 0.7.0). تُحجز الذاكرة من مخصص، وتعيدها أنت بـ حرر، أو دفعة واحدة بـساحة، وخاتمه تؤجّل الإعادة إلى الخروج من الكتلة. وما لا تعيده يعود إلى النظام عند خروج البرنامج.
الأدوات، بترتيبها
رابط إلى قسم «الأدوات، بترتيبها»- المخصص. كل نص تبنيه وكل قائمة وقاموس يُحجز من مخصص. والمدمجات التي تبني شيئاً تأخذه وسيطاً أخيراً، فإن تركته فمن
الافتراضي. ومن المخصصات المدمجة:النظام، والافتراضي، وساحة، وكاشف، ومخزن_ثابت. وبلا_افتراضيفي أول الوحدة يمنع الحجز من الافتراضي فيها. حرر(س)تعيد ما حُجز لـسفوراً، وتجعلسلاشيء. ولا تتبع ما في داخله: تحرير قائمة قوائم يترك الداخلية.خاتمه جملةتؤجّل الجملة إلى الخروج من الكتلة، عند كل مخرج: آخر السطر، أوارجعمبكرة، أوجرّبفاشلة. وتُنفَّذ بعكس ترتيب كتابتها:
داله عالج(ن عدد) نص: اطبع("فتح المورد ", ن) خاتمه اطبع("إغلاق المورد ", ن) خاتمه اطبع("تنظيف أول") اذا ن < 0: ارجع "سالب" اطبع("عمل على ", ن) ارجع "تم"
اطبع(عالج(5))اطبع("---")اطبع(عالج(-1))- الساحة تجمع ما يُحجز منها، و
اعدتعيده كله دفعة. تناسب مرحلة تبني فيها كثيراً ثم تنتهي منه كله:
مجموع = 0لكل دورة في مدى(0, 3): ساحه = ساحة(الافتراضي) خاتمه اعد(ساحه) كلمات = تقسيم(دمج_نصوص("ا ب ج ", دورة, ساحه), " ", ساحه) مجموع += طول(كلمات)اطبع("كلمات في الدورات الثلاث: ", مجموع)- الكاشف مخصص يراقب ما يُحجز ويُحرَّر. يعمل افتراضياً في التشغيل المباشر (
meem برنامج.م) منذ 0.10.0، و--debug-memيضيف إليه تقريراً في آخر البرنامج بكل سطر حجز ولم يحرّر:
لكل ع في مدى(0, 3): ن = "سطر " + نص(ع) اطبع(ن)الوضعان: التطوير والإصدار
رابط إلى قسم «الوضعان: التطوير والإصدار»التشغيل المباشر meem برنامج.م |
الملف المبني meem build |
|
|---|---|---|
| الافتراضي | بالكاشف، بلا تقرير عند النهاية | بلا كاشف |
| الخيار المقابل | --release: بلا كاشف |
--debug أو --debug-mem: بالكاشف |
| التقرير بما لم يُحرَّر | مع --debug-mem |
مع --debug-mem |
فالتطوير بالتشغيل المباشر محميّ، والملف المبني سريع، كوضعي Debug وReleaseFast في Zig. وللكاشف كلفة: على برامج القياس في مستودع المجمّع كان أبطأ من 0% إلى 32%، وما يُحرَّر في وضعه لا يُعاد إلى النظام (يُعزل ليُكشف استعماله بعد التحرير)، فبرنامج يحرّر كثيراً ويطول عمله يُشغَّل بـ --release.
ما يضمنه المجمّع في كل الأوضاع
رابط إلى قسم «ما يضمنه المجمّع في كل الأوضاع»خارج خطر وبلا_فحص، وبالكاشف أو بدونه:
الحساب والفهرسة. تجاوز حدود 64 بت، والفهرس خارج القائمة أو النص، والقسمة على صفر، وفك لاشيء، كلها أخطاء تشغيل منظّمة برمز 3 ومعرّف وسطر، لا سلوك غير معرَّف:
ق = [10, 20, 30]اطبع(ق[2])اطبع(ق[3])رمز الخروج: 3
في فهرس الأخطاء: E0321
كبير = 9223372036854775807اطبع(كبير)اطبع(كبير + 1)رمز الخروج: 3
في فهرس الأخطاء: E0341
قائمة أو قاموس بالاسم نفسه بعد حرر. حرر(ق) تجعل ق لاشيء، واستعمالها بعده خطأ E0428، في التشغيل المباشر وفي الملف المبني كليهما (كان في 0.9.1 سقوطاً بإشارة SIGSEGV):
ق = [1, 2, 3]حرر(ق)اطبع(طول(ق))رمز الخروج: 3
في فهرس الأخطاء: E0428
بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 37.2 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.
لا حجز لم تكتبه. لا يحجز البرنامج إلا ما تراه في الشيفرة: مدمجة تأخذ مخصصاً (مكتوباً أو متروكاً للافتراضي)، أو + على النصوص، أو قيمة حرفية [...] و{...}. والعمليات على «العرض» (ناتج جزء وقص_الفراغات ومسارات.الامتداد…) لا تنسخ: طول والمقارنة والفهرسة ولكل وعدد() والمفتاح في قاموس. هذه حلقة من ألف دورة بـ --debug-mem، ولا تقرير في آخرها لأن لا شيء بقي:
جملة = " ميم لغة عربية "مجموع = 0لكل ع في مدى(0, 1000): ك = قص_الفراغات(جملة) مجموع += طول(ك) اذا ك == "ميم لغة عربية": مجموع += 1اطبع(مجموع)والاستثناء الوحيد: نمو ن += ذيل (انظر «ما لا يضمنه» أدناه).
ما يكشفه الكاشف وحده
رابط إلى قسم «ما يكشفه الكاشف وحده»حين يمرّ الخطأ عبر اسم آخر لا يعرفه المجمّع وقت الترجمة، فيكشفه الكاشف وقت التشغيل، برسالة فيها سطر الإنشاء وسطر التحرير. وهذه الأمثلة كلها بالتشغيل المباشر الافتراضي، بلا أي خيار:
قائمة يحملها اسمان، حُرّرت بأحدهما واستُعملت بالآخر (E0429):
ا = [7, 8, 9]ب = احرر(ا)ج = [1, 2, 3, 4, 5, 6]اطبع(ب[0], " ", طول(ب))حرر(ج)رمز الخروج: 3
في فهرس الأخطاء: E0429
قائمة من ساحة استُعملت بعد اعد لساحتها (E0429 أيضاً):
ساحه = ساحة(الافتراضي)ق = قائمة_من([1, 2, 3], ساحه)اعد(ساحه)اطبع(ق[0])رمز الخروج: 3
في فهرس الأخطاء: E0429
عرض على نص حُرّر أصله (E0430):
مسار = "ملفات/تقرير.md"ن = مسار + ""امتداد = جزء(ن, 10)حرر(ن)اطبع(امتداد)رمز الخروج: 3
في فهرس الأخطاء: E0430
ونص حُرّر مرتين عبر اسمين (E0431). والتحرير المزدوج للحاوية E0350، وللخانة والكتلة E0421:
ن = "مرحبا " + نص(1)م = نحرر(ن)حرر(م)رمز الخروج: 3
في فهرس الأخطاء: E0431
والذاكرة المحرَّرة في وضع الكشف تُملأ بالبايت 0xDF، فقراءة لم يفحصها الكاشف ترى نفايات ظاهرة لا البيانات القديمة سليمة.
ما لا يضمنه
رابط إلى قسم «ما لا يضمنه»- الملف المبني بلا كاشف. الأمثلة الأربعة السابقة في ملف بُني بـ
meem buildبلا--debugسلوك غير معرَّف: الاستعمال بعد التحرير عبر اسم آخر قد يطبع ناتجاً قديماً أو نفايات، والتحرير المزدوج عبر اسم آخر يُسقط البرنامج. لذلك لا ننشر ناتجها هناك. جرّب برنامجك بالتشغيل المباشر أو ابنه بـ--debugقبل أن تبنيه للإصدار. - ما لم يُنفَّذ لا يُكشف. الكاشف يعمل وقت التشغيل، والمجمّع لا يتتبع الملكية ولا الأسماء المستعارة. فرع لم يمرّ به الاختبار لا يُفحص.
حررلا يتبع ما في الداخل. تحرير قائمة قوائم، أو هيكل فيه قوائم، أو قائمة نصوص منتقسيم، لا يحرر ما فيها. للبنى المتداخلة الساحة، أو تحرير عميق تكتبه.- نمو
+=يترك المخزن القديم. تسرب محدود: نحو لوغاريتم الطول للأساس 2 من المخازن، مجموعها نحو ضعفي الطول النهائي (الحجز والأداء في المدمجات). - داخل
خطر: المؤشرات الخام وبلا_فحصوحوّلوذاكرة C على كاتبها، والكاشف لا يرى ذاكرة C. - الخيوط: لا خيوط في اللغة، والمخصصات غير ذرّية.
- أخطاء التشغيل لا تنفّذ
خاتمه. خطأ التشغيل (رمز 3) ينهي البرنامج فوراً، كـpanicفي Zig: الذاكرة يستعيدها النظام، أما ملف مؤقت تحذفهخاتمهفيبقى على القرص. الخطأ المتوقع يُعاد بـارجع خطأ.اسمفتُنفَّذ الخاتمات.
اقرأ أيضاً
رابط إلى قسم «اقرأ أيضاً»الدرس 17: المخصصات والساحات · مرجع الذاكرة · ما هو خطر؟ · ميم مقابل C وZig