From 569673379d05dfc9bc888c52f2f96a2c640f49e4 Mon Sep 17 00:00:00 2001 From: Sad Lang Dev Date: Tue, 21 Jul 2026 11:22:46 +0300 Subject: [PATCH 1/2] =?UTF-8?q?RFC:=20@=D9=84=D8=A7=5F=D8=AA=D8=B1=D8=AC?= =?UTF-8?q?=D8=B9=20+=20=D9=87=D9=84=D8=B9=20=D8=B5=20+=20=D8=A5=D8=B9?= =?UTF-8?q?=D8=A7=D8=AF=D8=A9=20=D8=AA=D8=B3=D9=85=D9=8A=D8=A9=20=D9=85?= =?UTF-8?q?=D8=AF=D9=85=D8=AC=20=D8=A7=D9=84=D8=A5=D8=B3=D8=A8=D8=A7=D8=AA?= =?UTF-8?q?=20(=D8=A7=D9=84=D9=84=D8=A8=D9=86=D8=A9=203.15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 3 قدرات تُطفئ أرضيّة C الهلعيّة في نهلة: @لا_ترجع (سمة دالّة لا تعود ⇒ unreachable) + هلع ص (__sad_panic) + إعادة تسمية مدمج hlt («توقف» يصادم break) إلى أسبِت_المعالج (فعل-أوّلًا). تُطفئ bee_halt_forever والهلع. Co-Authored-By: Claude Opus 4.8 --- ...30\245\330\263\330\250\330\247\330\252.md" | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 "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" 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..4370179 --- /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`/التوليد). حارس اتّساق: لا مدمج يطابق كلمة + مفتاحيّة. +- **`@لا_ترجع`**: توجيه جديد في `directives.yaml` (context: declaration). + +## المحلل المعجمي/النحوي + +- `@لا_ترجع` توجيه سابق على تصريح دالّة (نمط `@رمز` — سمة لا صفة نحويّة، فتبقى + سابقة). يُحلَّل في `tryParseDirective` ويلفّ/يسِم `FunctionDecl`. +- `أسبِت_المعالج` مدمج عاديّ (لا صياغة جديدة). + +## الشجرة المجردة (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 إن وُجد). From 24cd7443cc54ccad1b1113af6ae2a5cb80a36ed6 Mon Sep 17 00:00:00 2001 From: Sad Lang Dev Date: Tue, 21 Jul 2026 12:04:05 +0300 Subject: [PATCH 2/2] =?UTF-8?q?RFC=203.15:=20=D8=A7=D8=B9=D8=AA=D9=85?= =?UTF-8?q?=D8=A7=D8=AF=20=D8=B5=D9=8A=D8=A7=D8=BA=D8=A9=20=D8=AF=D8=A7?= =?UTF-8?q?=D9=84=D8=A9=20=D9=84=D8=A7=5F=D8=AA=D8=B1=D8=AC=D8=B9=20(?= =?UTF-8?q?=D9=86=D9=85=D8=B7=20=D9=85=D8=AA=D8=BA=D9=8A=D8=B1=20=D9=85?= =?UTF-8?q?=D8=AA=D8=B7=D8=A7=D9=8A=D8=B1)=20=D8=A8=D8=AF=D9=84=20@=D9=84?= =?UTF-8?q?=D8=A7=5F=D8=AA=D8=B1=D8=AC=D8=B9=20=E2=80=94=20=D9=82=D8=B1?= =?UTF-8?q?=D8=A7=D8=B1=20=D8=A7=D9=84=D9=85=D8=A7=D9=84=D9=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\245\330\263\330\250\330\247\330\252.md" | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) 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" index 4370179..00b5c30 100644 --- "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" @@ -1,4 +1,4 @@ -- **عنوان المقترح:** `@لا_ترجع` + هلع ص (`__sad_panic`) + إعادة تسمية مدمج الإسبات (hlt) +- **عنوان المقترح:** `دالة لا_ترجع` + هلع ص (`__sad_panic`) + إعادة تسمية مدمج الإسبات (hlt) - **النطاق:** لغة `text/` - **تاريخ البدء:** 2026-07-21 - **رقم الـ RFC:** (يُترك فارغاً حتى الدمج) @@ -8,8 +8,9 @@ # ملخّص ثلاث قدرات متلازمة تُطفئ آخر أرضيّة C «الهلعيّة» في نواة النحلة: -1. **`@لا_ترجع`** — سمة على دالّة لا تعود أبدًا (حلقة إسبات أبديّة، هلع)، تُمكّن - المترجم من إسقاط الكود التالي للنداء وإصدار `unreachable`. +1. **`دالة لا_ترجع`** — مُعدِّل على دالّة لا تعود أبدًا (حلقة إسبات أبديّة، هلع)، + يُمكّن المترجم من إسقاط الكود التالي للنداء وإصدار `unreachable`. المُعدِّل يلي + `دالة` قبل الاسم (اتّساقًا مع `متغير متطاير` — بلا سيجيل `@`). 2. **هلع ص (`__sad_panic`)** — معالج هلع قويّ بلغة ص (يطبع ثمّ يُسبِت أبديًّا) يحلّ محلّ غلاف C. 3. **إعادة تسمية مدمج الإسبات (hlt)** — المدمج `توقف` (halt) يصادم الكلمة @@ -26,7 +27,7 @@ `تراب.c:275`). ص تناديها عبر `دالة خارجية("bee_halt_forever") قف_أبديًّا()`. - `__stack_chk_fail` / الهلع — غلاف C (`اهلع_لتلف_المكدّس`). -هذه لا تُطفأ دون: (أ) اسم إسبات غير متصادم، (ب) سمة `@لا_ترجع` كي يعرف المترجم +هذه لا تُطفأ دون: (أ) اسم إسبات غير متصادم، (ب) مُعدِّل `لا_ترجع` كي يعرف المترجم أنّ الحلقة/الهلع لا يعودان (فلا يصدر كودًا ميتًا بعدهما ولا يشكو «الدالّة قد لا تعيد قيمة»)، (ج) هلع ص يبني على الاثنين. @@ -46,13 +47,13 @@ نهاية ``` -## `@لا_ترجع` +## `دالة لا_ترجع` -سمة سابقة على تصريح دالّة تُعلن أنّها لا تعود. المترجم يصدر `unreachable` بعد -النداء ويكفّ عن تحذير «لا قيمة معادة». +مُعدِّل يلي `دالة` قبل الاسم (نمط `متغير متطاير`) يُعلن أنّ الدالّة لا تعود. المترجم +يصدر `unreachable` بعد النداء ويكفّ عن تحذير «لا قيمة معادة». ```sad -@لا_ترجع دالة قف_أبديًّا() +دالة لا_ترجع قف_أبديًّا() بينما (صحيح) أسبِت_المعالج نهاية @@ -64,7 +65,7 @@ دالّة هلع بلغة ص تطبع رسالة ثمّ تُسبِت أبديًّا (`@لا_ترجع`): ```sad -@لا_ترجع دالة اهلع(نص رسالة) +دالة لا_ترجع اهلع(نص رسالة) اطبع_خام("‏!! هلع: ") اطبع_خام(رسالة) قف_أبديًّا @@ -78,12 +79,12 @@ - **إعادة تسمية**: في `builtins/kernel.yaml`، بدّل `canonical: توقف` إلى `أسبِت_المعالج` (مع تحديث `keywords`/التوليد). حارس اتّساق: لا مدمج يطابق كلمة مفتاحيّة. -- **`@لا_ترجع`**: توجيه جديد في `directives.yaml` (context: declaration). +- **`لا_ترجع`**: كلمة مُعدِّلة (CONTEXTUAL) في `keywords.yaml` تلي `دالة` — نمط `متطاير`. ## المحلل المعجمي/النحوي -- `@لا_ترجع` توجيه سابق على تصريح دالّة (نمط `@رمز` — سمة لا صفة نحويّة، فتبقى - سابقة). يُحلَّل في `tryParseDirective` ويلفّ/يسِم `FunctionDecl`. +- `لا_ترجع` مُعدِّل يلي `دالة` قبل الاسم (نمط لصيقة `متطاير` في parseVarDecl) ⇒ يضبط + `FunctionDecl.isNoReturn`. لا سيجيل `@`. - `أسبِت_المعالج` مدمج عاديّ (لا صياغة جديدة). ## الشجرة المجردة (AST) @@ -92,7 +93,7 @@ ## المفسّر -- `@لا_ترجع`: لا أثر دلاليّ (تلميح للمترجم)؛ يُقبَل ويُتجاهَل. +- `لا_ترجع`: لا أثر دلاليّ (تلميح للمترجم)؛ يُقبَل ويُتجاهَل. - `أسبِت_المعالج`: مثل `توقف` القديم (hlt) في الوضع الحرّ؛ مستضافًا يُرفَض (نظير مدمجات النظام). @@ -100,17 +101,17 @@ - **`أسبِت_المعالج`**: نفس خفض `توقف` القديم (`hlt` inline asm حرًّا). مجرّد إعادة تسمية للاسم القانونيّ. -- **`@لا_ترجع`**: يضبط `llvm::Function` سمة `NoReturn`، ويُصدر `unreachable` بعد +- **`لا_ترجع`**: يضبط `llvm::Function` سمة `NoReturn`، ويُصدر `unreachable` بعد آخر تعليمة في مسار لا يعود. يُسكِت فحص «كلّ المسارات تعيد قيمة». ## نظام الأخطاء -- خطأ إن وُسِمت دالّة `@لا_ترجع` لكنّها تعود فعلًا (مسار يصل `ارجع` بقيمة/نهاية +- خطأ إن وُسِمت دالّة `لا_ترجع` لكنّها تعود فعلًا (مسار يصل `ارجع` بقيمة/نهاية عاديّة) — تحذير/خطأ SEM اختياريّ. ## التوافق الخلفي -- **`@لا_ترجع`** توجيه جديد ⇒ لا كسر. +- **`لا_ترجع`** كلمة مُعدِّلة جديدة ⇒ لا كسر (لم تكن مستعمَلة). - **إعادة تسمية `توقف`(hlt)→`أسبِت_المعالج`**: **كسر** لأيّ كود ينادي مدمج `توقف`(hlt). لكنّ الاسم كان متصادمًا أصلًا (يُفسَّر break داخل الحلقات)، فاستعماله كـhlt نادر/ملتبس. يُبرَّر ككسر مقصود لإزالة الالتباس (نظير حذف `@متطاير`). @@ -118,15 +119,14 @@ # السلبيات (Drawbacks) - إعادة تسمية مدمج كسر خلفيّ (مخفَّف: الاسم متصادم أصلًا). -- `@لا_ترجع` سمة قد يُساء وسمها (دالّة تعود فعلًا) ⇒ سلوك غير معرَّف بعد +- `لا_ترجع` مُعدِّل قد يُساء وسمه (دالّة تعود فعلًا) ⇒ سلوك غير معرَّف بعد `unreachable`؛ يخفّفه فحص SEM. # المبرّرات والبدائل - **الاسم `أسبِت_المعالج`**: فعل-أوّلًا متّسق مع مدمجات العتاد؛ يزيل تصادم `توقف`. بدائل: `اسبت`، `أوقف_المعالج`. يُحسم بالنقاش. -- **`@لا_ترجع` سابقة**: نمط `@رمز` (سمة اسميّة لا صفة). بديل: لصيقة لاحقة `دالة … - لا_ترجع`. لكنّ «لا ترجع» جملة فعليّة لا صفة مفردة، فالتوجيه السابق أنسب. +- **`دالة لا_ترجع`**: المُعدِّل يلي الكلمة المفتاحيّة (نمط `متغير متطاير`) — قرار المالك: صياغة موحَّدة بلا `@`. - **لا فعل شيء**: تبقى `bee_halt_forever` والهلع في C أرضيّةً — سقف إطفاء أعلى. # أعمال سابقة @@ -138,7 +138,7 @@ # أسئلة غير محسومة - اسم مدمج الإسبات (`أسبِت_المعالج`/`اسبت`/`أوقف_المعالج`). -- موضع `@لا_ترجع` (سابقة/لصيقة). +- (حُسِم) موضع `لا_ترجع`: مُعدِّل يلي `دالة` (نمط متطاير). - هل يبقى الهلع الأدنى (`__stack_chk_fail`) أرضيّةً (يولّده المترجم مع `-fstack-protector`) أم يُغلَّف بـص؟