From a548633d1dd8d2f6963dfc695e000a0f5e1957dc Mon Sep 17 00:00:00 2001 From: Sad Lang Dev Date: Wed, 22 Jul 2026 13:08:02 +0300 Subject: [PATCH] =?UTF-8?q?RFC:=20=D9=85=D8=B3=D8=A7=D8=B1=20=D8=A7=D9=84?= =?UTF-8?q?=D9=87=D9=84=D8=B9=20=D8=A7=D9=84=D8=B9=D8=B1=D8=A8=D9=8A=D9=91?= =?UTF-8?q?=20=D8=A7=D9=84=D9=85=D9=88=D8=AD=D9=8E=D9=91=D8=AF=20=E2=80=94?= =?UTF-8?q?=20=D9=83=D8=A8=D8=AA=20=D8=A7=D9=84=D8=AA=D8=B4=D8=AE=D9=8A?= =?UTF-8?q?=D8=B5=20=D8=A7=D9=84=D8=A5=D9=86=D8=AC=D9=84=D9=8A=D8=B2=D9=8A?= =?UTF-8?q?=D9=91=20=D9=84=D9=81=D8=B4=D9=84=20=D8=A7=D9=84=D8=AD=D8=AF?= =?UTF-8?q?=D9=91=20=D9=81=D9=8A=20=D8=A7=D9=84=D9=88=D8=B6=D8=B9=20=D8=A7?= =?UTF-8?q?=D9=84=D8=AD=D8=B1=D9=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit يوثّق قرار حذف نداء printf الإنجليزيّ (حدّ المصفوفة/وسم التعداد) في الوضع الحرّ قبل لافتة الهلع؛ يبقى في المستضاف للمطوّر. المبدأ: لا نصّ غير عربيّ يسبق اللافتة في المخرَج السياديّ. التنفيذ مدموج في s-programming-language#243. Co-Authored-By: Claude Opus 4.8 --- ...31\210\330\255\331\216\331\221\330\257.md" | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 "text/0000-\331\205\330\263\330\247\330\261-\330\247\331\204\331\207\331\204\330\271-\330\247\331\204\330\271\330\261\330\250\331\212\331\221-\330\247\331\204\331\205\331\210\330\255\331\216\331\221\330\257.md" diff --git "a/text/0000-\331\205\330\263\330\247\330\261-\330\247\331\204\331\207\331\204\330\271-\330\247\331\204\330\271\330\261\330\250\331\212\331\221-\330\247\331\204\331\205\331\210\330\255\331\216\331\221\330\257.md" "b/text/0000-\331\205\330\263\330\247\330\261-\330\247\331\204\331\207\331\204\330\271-\330\247\331\204\330\271\330\261\330\250\331\212\331\221-\330\247\331\204\331\205\331\210\330\255\331\216\331\221\330\257.md" new file mode 100644 index 0000000..feb380d --- /dev/null +++ "b/text/0000-\331\205\330\263\330\247\330\261-\330\247\331\204\331\207\331\204\330\271-\330\247\331\204\330\271\330\261\330\250\331\212\331\221-\330\247\331\204\331\205\331\210\330\255\331\216\331\221\330\257.md" @@ -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 — سلوك مولِّد خلفيّ محض في الوضع الحرّ.