Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions text/0000-بنية-محزومة-تخطيط-مسطّح-مؤجّل.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
- **عنوان المقترح:** `بنية محزومة` — تخطيط بنية مسطّح مرصوص (packed struct)
- **النطاق:** لغة `text/`
- **تاريخ البدء:** 2026-07-21
- **رقم الـ RFC:** (يُترك فارغاً حتى الدمج)
- **الحالة:** مؤجَّل (Postponed) — بانتظار مستهلك حقيقيّ + دلالة بنى قيمة مسطّحة
- **Issue التتبُّع:** (يُترك فارغاً)

# ملخّص

سمة `محزومة` على تصريح بنية تُزيل الحشو بين الحقول (محاذاة 1) فيطابق تخطيط
البايتات عقدًا خارجيًّا صارمًا (واصفات العتاد، صيغ الأسلاك/الملفّات، FFI مع C
المحزوم). **هذا المقترح مؤجَّل عمدًا** بعد تحقيق تصميميّ خلص إلى أنّه بلا مستهلك
حاليّ وأنّ تنفيذه الكامل يتطلّب تغييرًا جوهريًّا في نموذج ذاكرة ص لا يبرّره عائد
آنيّ.

# الدافع (Motivation)

اقتُرحت `محزومة` كبدائيّة رابعة ضمن اللبنة 3.14 «تخزين ساكن مسمّى» (إطفاء C في
نواة النحلة)، بجانب `@رمز`/`متطاير`/`بايتات` (المُنفَّذة والمدموجة). الغرض:
تمكين ص من تعريف واصف عتاد مسطّح (نمط `bee_idtr` = `{limit:u16, base:u32}` = 6
بايت) بدل بقائه في C بـ`__attribute__((packed))`.

# لماذا التأجيل (نتيجة التحقيق)

تحقيق تصميميّ (2026-07-21) أثبت ثلاث حقائق قاطعة:

1. **بنى ص كائنات كومة حصرًا، بلا تمثيل قيمة مسطّح.** كلّ نسخة بنية/صنف
تُخصَّص عبر `malloc`/`__sad_heap` وتُرجَع كمؤشّر (`oop_ops.cpp`: «objects may
outlive the scope»). الحقول تُخفَض إلى مؤشّرات/`i64` محاذاة 8 — لا حقول
عرض-دقيق (`u8`/`u16`/`u32`)، ولا `alloca`/global مسطّح، ولا طريقة لأخذ عنوان
مسطّح لبنية قيمة (لا وجود لها). فسمة الرصّ على كائن كومة **بلا أثر عمليّ**
(الحشو معدوم أصلًا، والعلم صوريّ).

2. **علم `isPacked` قائم لكن ميّت.** `createStructType(..., bool isPacked)`
موجود في خرائط الأنواع، لكن صفر مستدعٍ يمرّر `true`. توصيله دون دلالة قيمة
مسطّحة يُنتج كلمة SoT تَعِد المستخدم بتخطيط أسلاك لا يتحقّق.

3. **لا مستهلك في النواة.** كلّ بنية `packed` في C إمّا معامل ذاكرة لتعليمة نظام
(`sgdt`/`sidt` — أرضيّة دائمة لا علاقة لها ببنى ص)، أو مخزن **تكتبه ص أصلًا**
عبر `اكتب_ذاكرة32` على إزاحات بايتيّة (بوّابات IDT). حتى واصف `bee_idtr`
يُطفَأ **بالأدوات الثلاث القائمة** بلا `محزومة` (انظر البديل).

# البديل المعتمَد (بدل `محزومة`)

واصف `bee_idtr` وأمثاله تُطفَأ بـ`عنوان_رمز` + `اكتب_ذاكرة32` +
`حمل_جدول_مقاطعات`، بحيلة النصف-الأعلى التي تستعملها النواة أصلًا لبايت السمة:

```sad
# مخزن bee_idtr يبقى حجز .bss محضًا (آليّة)؛ المنطق ينتقل إلى ص
دالة جهّز_واصف_المقاطعات(رقم جدول)
متغير واصف = عنوان_رمز("bee_idtr")
اكتب_ذاكرة32(واصف، حدّ_المقاطعات_مزاح) # limit في البايتين 2-3
اكتب_ذاكرة32(واصف + 4، جدول) # base في البايتات 4-7
ارجع واصف + 2 # معامل lidt (6 بايت متتالية)
نهاية
```

هذا يحذف منطق C دون الحاجة لبنية مسطّحة. أي أنّ إطفاء C **لا يتوقّف** على
`محزومة`.

# شروط رفع التأجيل

يُعاد فتح هذا المقترح للتنفيذ الكامل (المسار الجوهريّ) عند تحقّق **كليهما**:

1. **ظهور مستهلك حقيقيّ** لبنى ص المسطّحة: تشغيل بينيّ FFI فعليّ مع بنى C
محزومة، أو صيغة أسلاك/ملفّ ثنائيّة يعبّر عنها المستخدم كبنية لا ككتلة بايتات.
2. **قرار إضافة دلالة بنى قيمة مسطّحة** إلى ص (تخطيط حقول عرض-دقيق + `alloca`/
global مسطّح + أخذ عنوان مسطّح + خفض التعيين النسخيّ) — تغيير معماريّ يلامس
البانّي الكائنيّ وجداول vtable ونموذج التخصيص، فيلزمه عقد استهلاك واضح.

عندها يُنفَّذ: كلمة `محزومة` في `keywords.yaml` (لصيقة لاحقة عربيّة سليمة نظير
`متطاير`: `بنية محزومة` — الموصوف ثمّ الصفة المؤنّثة) + قراءة المحلّل +
`StructDecl.isPacked` (قائم) + تمرير `isPacked` إلى `StructType::create`
(الوسيط قائم) + دلالة القيمة المسطّحة.

# السلبيات (Drawbacks)

تأجيل ميزة قد يطلبها مستخدمو الأنظمة لاحقًا. مخفَّف بأنّ البديل (كتلة بايتات +
`اكتب_ذاكرة`) يغطّي حالات النواة الحاليّة.

# المبرّرات والبدائل

«الأقوى لا الأسهل» لا يعني الأضخم بلا مبرِّر: إضافة سطح دلاليّ ضخم (بنى قيمة
مسطّحة) أو علم صوريّ بلا عقد استهلاك = ضعف معماريّ. الأقوى هنا = تأجيل صريح
موثَّق حتى يظهر العقد.

# أعمال سابقة

- **C**: `__attribute__((packed))` / `#pragma pack`.
- **Rust**: `#[repr(packed)]` / `#[repr(C, packed)]` — على بنى قيمة مسطّحة أصلًا.
- **Zig**: `packed struct` بضمانات تخطيط بتّيّة دقيقة.

الفرق الجوهريّ: كلّها لغات ذات بنى قيمة مسطّحة أصلًا، فالرصّ سمة تخطيط عليها.
ص اليوم بلا بنى قيمة مسطّحة — فالرصّ يسبقه قرار نموذج القيمة.

# أسئلة غير محسومة

- هل تُقدَّم بنى القيمة المسطّحة لغرض عامّ أم محصورة بـ`محزومة`/FFI؟
- صياغة الرصّ: لصيقة `بنية محزومة` (المُرجَّح، اتّساقًا مع `متطاير`) أم توجيه.

# إمكانات مستقبلية

- بنى قيمة مسطّحة عامّة (على المكدّس، تُمرَّر بالقيمة) — أساس لـ`محزومة` وFFI أقوى.
- `@محاذاة(n)` وضمانات تخطيط بتّيّة (نمط Zig).
Loading