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
Original file line number Diff line number Diff line change
@@ -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 إن وُجد).
Loading