diff --git "a/text/0000-\331\204\330\247-\330\252\330\261\330\254\330\271-\331\210\330\247\331\204\331\207\331\204\330\271-\331\210\330\245\330\271\330\247\330\257\330\251-\330\252\330\263\331\205\331\212\330\251-\330\247\331\204\330\245\330\263\330\250\330\247\330\252.md" "b/text/0000-\331\204\330\247-\330\252\330\261\330\254\330\271-\331\210\330\247\331\204\331\207\331\204\330\271-\331\210\330\245\330\271\330\247\330\257\330\251-\330\252\330\263\331\205\331\212\330\251-\330\247\331\204\330\245\330\263\330\250\330\247\330\252.md" new file mode 100644 index 0000000..00b5c30 --- /dev/null +++ "b/text/0000-\331\204\330\247-\330\252\330\261\330\254\330\271-\331\210\330\247\331\204\331\207\331\204\330\271-\331\210\330\245\330\271\330\247\330\257\330\251-\330\252\330\263\331\205\331\212\330\251-\330\247\331\204\330\245\330\263\330\250\330\247\330\252.md" @@ -0,0 +1,148 @@ +- **عنوان المقترح:** `دالة لا_ترجع` + هلع ص (`__sad_panic`) + إعادة تسمية مدمج الإسبات (hlt) +- **النطاق:** لغة `text/` +- **تاريخ البدء:** 2026-07-21 +- **رقم الـ RFC:** (يُترك فارغاً حتى الدمج) +- **الحالة:** مقترَح (PR مفتوح) +- **Issue التتبُّع:** (يُترك فارغاً حتى القبول) + +# ملخّص + +ثلاث قدرات متلازمة تُطفئ آخر أرضيّة C «الهلعيّة» في نواة النحلة: +1. **`دالة لا_ترجع`** — مُعدِّل على دالّة لا تعود أبدًا (حلقة إسبات أبديّة، هلع)، + يُمكّن المترجم من إسقاط الكود التالي للنداء وإصدار `unreachable`. المُعدِّل يلي + `دالة` قبل الاسم (اتّساقًا مع `متغير متطاير` — بلا سيجيل `@`). +2. **هلع ص (`__sad_panic`)** — معالج هلع قويّ بلغة ص (يطبع ثمّ يُسبِت أبديًّا) + يحلّ محلّ غلاف C. +3. **إعادة تسمية مدمج الإسبات (hlt)** — المدمج `توقف` (halt) يصادم الكلمة + المفتاحيّة `توقف` (break)، فيبقى `bee_halt_forever` (حلقة `cli;hlt`) في C. + إعادة تسميته إلى اسم فعل-أوّلًا غير متصادم تُطفئ الحلقة الأبديّة إلى ص. + +# الدافع (Motivation) + +بعد اللبنات 3.12–3.14 (lidt/عنوان_رمز/تخزين ساكن)، غادر منطق C مسار المقاطعات +وصار للنواة تخزينها. تبقّى صنف أخير من أرضيّة C **الهلعيّة**: + +- `bee_halt_forever()` — `for(;;){ __asm__("cli;hlt"); }` — تبقى C **حصرًا** لأنّ + مدمج ص `توقف` (hlt) يصادم كلمة `توقف` (break) داخل الحلقات (موثَّق في + `تراب.c:275`). ص تناديها عبر `دالة خارجية("bee_halt_forever") قف_أبديًّا()`. +- `__stack_chk_fail` / الهلع — غلاف C (`اهلع_لتلف_المكدّس`). + +هذه لا تُطفأ دون: (أ) اسم إسبات غير متصادم، (ب) مُعدِّل `لا_ترجع` كي يعرف المترجم +أنّ الحلقة/الهلع لا يعودان (فلا يصدر كودًا ميتًا بعدهما ولا يشكو «الدالّة قد لا +تعيد قيمة»)، (ج) هلع ص يبني على الاثنين. + +# الشرح التوجيهي (Guide-level explanation) + +## إعادة تسمية مدمج الإسبات + +المدمج الحاليّ `توقف` (hlt) يصادم `توقف` (break). يُعاد تسميته فعل-أوّلًا (اتّساقًا +مع [[hardware-builtins-verb-first-naming]]): **`أسبِت_المعالج`** (halt CPU حتى +المقاطعة التالية). فيتحرّر `توقف` لـbreak حصرًا. + +```sad +دالة قف_أبديًّا() + بينما (صحيح) + أسبِت_المعالج # كان يصادم «توقف» فبقي C + نهاية +نهاية +``` + +## `دالة لا_ترجع` + +مُعدِّل يلي `دالة` قبل الاسم (نمط `متغير متطاير`) يُعلن أنّ الدالّة لا تعود. المترجم +يصدر `unreachable` بعد النداء ويكفّ عن تحذير «لا قيمة معادة». + +```sad +دالة لا_ترجع قف_أبديًّا() + بينما (صحيح) + أسبِت_المعالج + نهاية +نهاية +``` + +## هلع ص + +دالّة هلع بلغة ص تطبع رسالة ثمّ تُسبِت أبديًّا (`@لا_ترجع`): + +```sad +دالة لا_ترجع اهلع(نص رسالة) + اطبع_خام("‏!! هلع: ") + اطبع_خام(رسالة) + قف_أبديًّا +نهاية +``` + +# الشرح المرجعي (Reference-level explanation) + +## مصدر الحقيقة (`language-truth/`) + +- **إعادة تسمية**: في `builtins/kernel.yaml`، بدّل `canonical: توقف` إلى + `أسبِت_المعالج` (مع تحديث `keywords`/التوليد). حارس اتّساق: لا مدمج يطابق كلمة + مفتاحيّة. +- **`لا_ترجع`**: كلمة مُعدِّلة (CONTEXTUAL) في `keywords.yaml` تلي `دالة` — نمط `متطاير`. + +## المحلل المعجمي/النحوي + +- `لا_ترجع` مُعدِّل يلي `دالة` قبل الاسم (نمط لصيقة `متطاير` في parseVarDecl) ⇒ يضبط + `FunctionDecl.isNoReturn`. لا سيجيل `@`. +- `أسبِت_المعالج` مدمج عاديّ (لا صياغة جديدة). + +## الشجرة المجردة (AST) + +- `FunctionDecl` يكتسب `bool isNoReturn`. + +## المفسّر + +- `لا_ترجع`: لا أثر دلاليّ (تلميح للمترجم)؛ يُقبَل ويُتجاهَل. +- `أسبِت_المعالج`: مثل `توقف` القديم (hlt) في الوضع الحرّ؛ مستضافًا يُرفَض (نظير + مدمجات النظام). + +## المترجم (sadc) + +- **`أسبِت_المعالج`**: نفس خفض `توقف` القديم (`hlt` inline asm حرًّا). مجرّد إعادة + تسمية للاسم القانونيّ. +- **`لا_ترجع`**: يضبط `llvm::Function` سمة `NoReturn`، ويُصدر `unreachable` بعد + آخر تعليمة في مسار لا يعود. يُسكِت فحص «كلّ المسارات تعيد قيمة». + +## نظام الأخطاء + +- خطأ إن وُسِمت دالّة `لا_ترجع` لكنّها تعود فعلًا (مسار يصل `ارجع` بقيمة/نهاية + عاديّة) — تحذير/خطأ SEM اختياريّ. + +## التوافق الخلفي + +- **`لا_ترجع`** كلمة مُعدِّلة جديدة ⇒ لا كسر (لم تكن مستعمَلة). +- **إعادة تسمية `توقف`(hlt)→`أسبِت_المعالج`**: **كسر** لأيّ كود ينادي مدمج + `توقف`(hlt). لكنّ الاسم كان متصادمًا أصلًا (يُفسَّر break داخل الحلقات)، فاستعماله + كـhlt نادر/ملتبس. يُبرَّر ككسر مقصود لإزالة الالتباس (نظير حذف `@متطاير`). + +# السلبيات (Drawbacks) + +- إعادة تسمية مدمج كسر خلفيّ (مخفَّف: الاسم متصادم أصلًا). +- `لا_ترجع` مُعدِّل قد يُساء وسمه (دالّة تعود فعلًا) ⇒ سلوك غير معرَّف بعد + `unreachable`؛ يخفّفه فحص SEM. + +# المبرّرات والبدائل + +- **الاسم `أسبِت_المعالج`**: فعل-أوّلًا متّسق مع مدمجات العتاد؛ يزيل تصادم `توقف`. + بدائل: `اسبت`، `أوقف_المعالج`. يُحسم بالنقاش. +- **`دالة لا_ترجع`**: المُعدِّل يلي الكلمة المفتاحيّة (نمط `متغير متطاير`) — قرار المالك: صياغة موحَّدة بلا `@`. +- **لا فعل شيء**: تبقى `bee_halt_forever` والهلع في C أرضيّةً — سقف إطفاء أعلى. + +# أعمال سابقة + +- **C**: `_Noreturn`/`__attribute__((noreturn))`، `abort()`، `hlt`. +- **Rust**: `!` (never type)، `panic!`، `loop { core::arch::asm!("hlt") }`. +- **Zig**: `noreturn`، `@panic`، `while(true) asm volatile("hlt")`. + +# أسئلة غير محسومة + +- اسم مدمج الإسبات (`أسبِت_المعالج`/`اسبت`/`أوقف_المعالج`). +- (حُسِم) موضع `لا_ترجع`: مُعدِّل يلي `دالة` (نمط متطاير). +- هل يبقى الهلع الأدنى (`__stack_chk_fail`) أرضيّةً (يولّده المترجم مع + `-fstack-protector`) أم يُغلَّف بـص؟ + +# إمكانات مستقبلية + +- **نوع `!` (never)** لتعبيرات لا تعود، وتحليل تدفّق أدقّ. +- **`اذعر`/`@ذعر`** بلغة ص لكلّ النواة (يحلّ محلّ __sad_panic C إن وُجد).