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

الطبقة المنخفضة: خطر والشرائح والمؤشرات

منقول من الكتاب المرجعي: docs/handbook/language/09-low-level.md · الإيداع 7a52f6c

القاعدة (منذ 0.7.0). عمليات الذاكرة الخام داخل خطر: (كتلة) أو خطر داله، ويمنعها --no-unsafe. التفصيل وقرارات التصميم في low-level.md (وثيقة في مستودع المجمّع).

الصيغة أين ما تفعله
احجز(نوع, عدد[, م]) أي مكان كتلة مصفَّرة شريحة شريحة[نوع] بفحص حدود؛ حرر(ش[, م])
حاول_احجز(...) أي مكان مثلها، لكنها !شريحة[نوع]: عند الفشل خطأ.لا_ذاكرة (منذ 0.7.0)
احجز_خام(نوع, عدد[, م]) خطر الكتلة مؤشراً مؤشر[نوع]، فهرسته م[ف] بلا فحص (يفحصها --debug-mem)
شريحة(م, طول) وشريحة_خام(خ, نوع, طول) خطر شريحة فوق مؤشر أو ذاكرة من C
قطعة(ش, من, الى) أي مكان جزء من شريحة بفحص
حوّل(قيمة, نوع) خطر مؤشر إلى مؤشر، ومؤشر إلى مؤشر_خام وعكسه، وشريحة إلى شريحة
حجم_النوع(نوع) أي مكان بايتات العنصر
بلا_فحص تعبير خطر فهرسة بلا فحص حدود، وكتابة تُقطع بلا فحص مدى
جديد(قيمة[, م]) ومحتوى(م) وحرر(م) أي مكان خانة واحدة على الكومة

الأنواع بحجم ثابت (عدد8 إلى طبيعي64، بايت، كسر32) عناصر تخزين: القراءة تمدّد إلى عدد أو كسر، والكتابة خارج المدى خطأ تشغيل إلا داخل بلا_فحص. والتحويلات عدد8(س)… تفحص المدى كذلك.

مثال
ش = احجز(بايت, 4)
ش[0] = 200
اطبع(ش, " ", طول(ش), " ", حجم_النوع(عدد32))
خطر:
م = احجز_خام(عدد32, 2)
م[1] = -5
اطبع(م[0] + م[1], " ", بلا_فحص طبيعي8(300))
حرر(م)
حرر(ش)
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
[200, 0, 0, 0] 4 4-5 44

القيود المعروفة. لا حساب عناوين على المؤشر (م + 1). المؤشر لا يحمل طولاً: فهرسته خارج الكتلة سلوك غير معرَّف في التشغيل العادي. ذاكرة من C لا يفحص حدودها الكاشف.

أخطاء محتملة.

مثال
م = احجز_خام(عدد, 2)
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
​[خطأ دلالي E0414] سطر 1:5 - 'احجز_خام' لا تُكتب إلا داخل منطقة 'خطر'   1 | م = احجز_خام(عدد, 2)     |     ^~~~~~~~  تلميح: ضعها في كتلة  خطر:  أو في دالة معرَّفة بـ  خطر داله ...

رمز الخروج: 2

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

مثال
ش = احجز(بايت, 2)
ش[0] = 256
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
[خطأ تشغيل E0328] سطر 2:2 - القيمة 256 خارج مدى 'طبيعي8' (من 0 إلى 255)  ش[0] = 256

رمز الخروج: 3

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