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
97 changes: 97 additions & 0 deletions text/0000-مسار-الهلع-العربيّ-الموحَّد.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
- **عنوان المقترح:** مسار الهلع العربيّ الموحَّد — كبت التشخيص الإنجليزيّ لفشل فحص الحدّ في الوضع الحرّ
- **النطاق:** لغة `text/`
- **تاريخ البدء:** 2026-07-22
- **رقم الـ RFC:** 243 (= رقم PR اللغة)
- **الحالة:** مقترَح (PR مفتوح — s-programming-language#243)
- **Issue التتبُّع:** (يُترك فارغاً حتى القبول)

# ملخّص

يُصدر المولِّد في مسار فشل فحص الحدّ (تجاوز حدّ مصفوفة، أو وصول حقل من وسم تعداد
خاطئ) نداءَ `printf` برسالة **إنجليزيّة** ثابتة قبل `__sad_panic`/`exit`. في
**الوضع الحرّ** هذه الرسالة تُطبَع على المنفذ التسلسليّ **قبل** لافتة الهلع
العربيّة السياديّة التي يوفّرها تعريف النواة القويّ لـ`__sad_panic`. يقترح هذا
المقترح **حذف نداء `printf` الإنجليزيّ في الوضع الحرّ** (يبقى في المستضاف للمطوّر).

# الدافع (Motivation)

هدف لغة ص السيادة العربيّة الكاملة في المخرَج. في نواة النحلة (الوضع الحرّ)، أيّ
تجاوز حدّ فعليّ يُنتج على التسلسليّ:

```
Error: array index 99 out of bounds (length: 0)
[هلع-ص نظام:عامّ رمز:4]
```

السطر الأوّل إنجليزيّ يسبق اللافتة العربيّة الموحَّدة (التي أرستها هجرة نظام
الأخطاء إلى ص: أخ.1–أخ.4). لافتة الهلع وحّدت الصيغة العربيّة، لكنّ المولِّد يظلّ
يبثّ مقدّمة إنجليزيّة تقوّض السيادة. رُصد في اختبار #6 السلبيّ لنواة النحلة
(سيناريو حدّ المصفوفة).

# الشرح التوجيهي (Guide-level explanation)

**قبل (وضع حرّ):** سطر إنجليزيّ ثمّ اللافتة العربيّة.
**بعد (وضع حرّ):** اللافتة العربيّة وحدها — `__sad_panic` (تعريف النواة القويّ)
يحمل التشخيص عبر لافتته العربيّة (`[هلع-ص نظام:<نظام> رمز:<رقم>]`).

**المستضاف** (تطوير/اختبار على المضيف) **يبقى كما هو:** رسالة إنجليزيّة للمطوّر
(`Error: array index %lld out of bounds…`) ثمّ `exit(1)`. المستضاف بيئة تطوير لا
مخرَج سياديّ نهائيّ، والرسالة التفصيليّة (فهرس/طول) مفيدة هناك.

# الشرح المرجعيّ (Reference-level explanation)

- الموضعان:
- `compiler/src/backend/llvm/builders/collections/array_ops.cpp` (فحص حدّ المصفوفة).
- `compiler/src/backend/llvm/builders/oop/enum_ops.cpp` (فحص وسم التعداد).
- التغيير: نقل إصدار `printf`(‏`bc.fmt`/`adt.wrongvar.fmt`) إلى فرع **المستضاف**
(`else`) وحده؛ فرع الوضع الحرّ ينادي `__sad_panic` مباشرةً بلا `printf`.
- لا تغيّر في ABI نداء `__sad_panic` (يبقى `(i64)` بالرمز الحارس الثابت 1)؛
التفصيل (فهرس/طول) غير مُمرَّر للنواة عمدًا (النواة تُصنّف اللافتة تحت رمز
الانتهاك؛ تمرير الفهرس/الطول يتطلّب توسيع ABI — خارج النطاق، يُنظَر لاحقًا).

**المبدأ الحاكم (محصور عمدًا):** «لا نصّ **غير عربيّ** يسبق لافتة الهلع في المخرَج
السياديّ (الوضع الحرّ)». هذا المقترح يعالج تسريب الإنجليزيّة (حدّ المصفوفة/التعداد)
حصرًا؛ الثلاثة (get/set/rem) تمرّ عبر مساعد `emitBoundsCheck` الواحد فتُصلَح بتغيير
واحد.

**دَين مجاور مؤجَّل (RUN056 — مقصود لا سهو):** مسار فشل رابع في
`arithmetic/arith_main.cpp` (عامل التأكيد `مؤكَّد` على قيمة عدم) يطبع سطرًا
**عربيًّا** (`خطأ [RUN056]: عامل التأكيد …`) قبل الهلع في الوضع الحرّ. **لا يكسر
مبدأ هذا المقترح** (النصّ عربيّ سياديّ)، فلا يُمسّ هنا. لكنّه دَينٌ من صنفٍ مختلف
يخصّ مبدأً أوسع («‏__sad_panic التشخيص الوحيد») يُعالَج مستقلًّا لأنّه يحتاج قرارًا
لا كبتًا: (أ) رسالته العربيّة **معلومة صحيحة** (تأكيد-على-عدم) لا تحملها اللافتة؛
(ب) اللافتة تُصنّفه رمز:4 «انتهاك مترجم» وهو تصنيف غير دقيق (ليس تجاوز حدّ)؛
(ج) الإصلاح الصحيح رمزُ كتالوج مخصَّص للتأكيد لا مجرّد حذف السطر — أي توسيع
ABI/كتالوج، خارج نطاق تسريب الإنجليزيّة. يُتتبَّع كتحسين لاحق مستقلّ.

# البدائل (Alternatives)

1. **تعريب رسالة `printf` بدل حذفها في الوضع الحرّ:** يُبقي سطرين (تشخيص عربيّ +
لافتة) بازدواج، ويستلزم أن يوفّر البرنامج الحرّ `printf`/‏`__sad_serial_puts`
القويّ. أعقد بلا فائدة (اللافتة تكفي).
2. **تمرير الفهرس/الطول إلى `__sad_panic` لعرضهما في اللافتة:** توسيع ABI للرمز
(‏`(i64,i64,i64)`) يكسر تعريفات النواة القائمة (أخ.3). مؤجَّل كتحسين مستقلّ.
3. **الإبقاء على الحال:** يترك تسريبًا إنجليزيًّا دائمًا في المخرَج السياديّ.

# المخاطر والتخفيف

- **فقدان تفصيل الفهرس/الطول في الوضع الحرّ:** مقبول — النواة تُصنّف الانتهاك برمز
كتالوج (`خطأ_انتهاك_مترجم`)؛ التفصيل مفيد في التطوير المستضاف حيث يبقى.
- **اعتماد ما على السطر الإنجليزيّ:** لا اختبار نشط يعتمده في الوضع الحرّ (فحص
الحدّ الساكن مسار منفصل)؛ يُضاف اختبار يثبّت الغياب الحرّ والبقاء المستضاف.

# الاختبارات

(‏`tests/system/lowlevel_freestanding/test_bounds_diag_sovereign.py`)
- `test_freestanding_bounds_fail_no_english_diagnostic`: مصفوفة، وضع حرّ ⇒
`__sad_panic` يُصدَر وبلا `bc.fmt`/`out of bounds`.
- `test_hosted_bounds_fail_keeps_english_diagnostic`: مصفوفة، مستضاف ⇒
`bc.fmt`/الرسالة تبقى + `call void @exit`.
- `test_freestanding_enum_wrongvariant_no_english_diagnostic`: تعداد، وضع حرّ ⇒
`__sad_panic` وبلا `adt.wrongvar.fmt`/`RUN005`.
- `test_hosted_enum_wrongvariant_keeps_english_diagnostic`: تعداد، مستضاف ⇒
`adt.wrongvar.fmt` تبقى + `call void @exit`.

# الأثر على مصدر الحقيقة

لا تغيير في نحو اللغة/الكتالوج/LSP — سلوك مولِّد خلفيّ محض في الوضع الحرّ.
Loading