From 7e2f5eb23317eef30185e9afbf49342d96cc9113 Mon Sep 17 00:00:00 2001 From: Sad Lang Dev Date: Thu, 30 Jul 2026 11:39:33 +0300 Subject: [PATCH] =?UTF-8?q?RFC:=20=D8=A7=D9=84=D8=AE=D9=84=D9=81=D9=8A?= =?UTF-8?q?=D9=91=D8=A9=20=D8=A7=D9=84=D8=B3=D9=8A=D8=A7=D8=AF=D9=8A=D9=91?= =?UTF-8?q?=D8=A9=20=D9=85=D8=AA=D8=B9=D8=AF=D9=91=D8=AF=D8=A9=20=D8=A7?= =?UTF-8?q?=D9=84=D9=85=D8=B9=D9=85=D8=A7=D8=B1=D9=8A=D9=91=D8=A7=D8=AA=20?= =?UTF-8?q?=E2=80=94=20=D8=AA=D9=88=D9=84=D9=8A=D8=AF=20=D8=B4=D9=8A=D9=81?= =?UTF-8?q?=D8=B1=D8=A9=20=D8=A3=D8=B5=D9=84=D9=8A=D9=91=20=D8=A8=D9=84?= =?UTF-8?q?=D8=A7=20LLVM=20(=D8=AC=D8=AF=D9=88=D9=84=D9=8A=D9=91=D8=8C=20?= =?UTF-8?q?=D9=A5=20ISAs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit مقترحٌ يرسمن قرارَ المالك: خلفيّةٌ أصليّةٌ لمترجم ص بلا LLVM لتوليد الشيفرة، متعدّدةُ المعماريّات من صميم التصميم لا كإضافةٍ لاحقة. المبدأ: خطٌّ خلفيٌّ واحدٌ مشترك (SIR→MIR→تخصيص سجلّات→ترميز→كاتب ELF)، والاختلافُ بين المعماريّات بياناتٌ في جداولٍ لكلّ ISA لا كودًا. النطاق: x86-64، AArch64، RISC-V، ARMv7، i686. يشمل: عقد واجهة Target، الجداول الأربعة (تعليمات/سجلّات/أنماط اختيار/ABI) في language-truth/backend/، محرّك ترميز عامّ (fixed32/variable)، بوّابة اختبار تفاضليّ بايت-ببايت ضدّ llvm-mc (مصحِّح مرجعيّ لا تبعيّة إنتاج)، وانضباط الهدف الثاني المبكّر لإثبات عموميّة التجريد. مسارٌ مرحليّ م٠–م٦، صفر كسرٍ توافقيّ. مستندٌ لتقريرَي no_llvm؛ RFC سياديّ مستقلّ يحقّق ما وضعته مظلّةُ الاستضافة الذاتيّة خارجَ نطاقها (استبدال LLVM بخلفيّة أصليّة). راجعته أميليا خصميًّا: CLEAR. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...30\261\331\212\331\221\330\247\330\252.md" | 194 ++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 "text/0000-\330\247\331\204\330\256\331\204\331\201\331\212\331\221\330\251-\330\247\331\204\330\263\331\212\330\247\330\257\331\212\331\221\330\251-\331\205\330\252\330\271\330\257\330\257\330\251-\330\247\331\204\331\205\330\271\331\205\330\247\330\261\331\212\331\221\330\247\330\252.md" diff --git "a/text/0000-\330\247\331\204\330\256\331\204\331\201\331\212\331\221\330\251-\330\247\331\204\330\263\331\212\330\247\330\257\331\212\331\221\330\251-\331\205\330\252\330\271\330\257\330\257\330\251-\330\247\331\204\331\205\330\271\331\205\330\247\330\261\331\212\331\221\330\247\330\252.md" "b/text/0000-\330\247\331\204\330\256\331\204\331\201\331\212\331\221\330\251-\330\247\331\204\330\263\331\212\330\247\330\257\331\212\331\221\330\251-\331\205\330\252\330\271\330\257\330\257\330\251-\330\247\331\204\331\205\330\271\331\205\330\247\330\261\331\212\331\221\330\247\330\252.md" new file mode 100644 index 0000000..d49d471 --- /dev/null +++ "b/text/0000-\330\247\331\204\330\256\331\204\331\201\331\212\331\221\330\251-\330\247\331\204\330\263\331\212\330\247\330\257\331\212\331\221\330\251-\331\205\330\252\330\271\330\257\330\257\330\251-\330\247\331\204\331\205\330\271\331\205\330\247\330\261\331\212\331\221\330\247\330\252.md" @@ -0,0 +1,194 @@ +- **عنوان المقترح:** الخلفيّة السياديّة متعدّدة المعماريّات — توليدُ شيفرةٍ أصليّ بلا LLVM عبر طبقةٍ جدوليّة (table-driven) تدعم خمس معماريّات فأكثر من التصميم +- **النطاق:** لغة `text/` (المترجم sadc — الواجهة الخلفيّة) +- **تاريخ البدء:** 2026-07-30 +- **رقم الـ RFC:** (يُترك فارغاً حتى الدمج — يصبح رقم الـ PR في مستودع `sadlang-rfcs`) +- **الحالة:** مقترَح (PR مفتوح) +- **Issue التتبُّع:** (يُترك فارغاً حتى القبول) + +# ملخّص + +> يقترح هذا المقترح **خلفيّةً أصليّةً لمترجم ص لا تعتمد على LLVM إطلاقًا** لتوليد الشيفرة، مصمَّمةً **متعدّدةَ المعماريّات من الجذر لا كإضافةٍ لاحقة**. المبدأ الحاكم: **الخطُّ الخلفيّ واحدٌ مشترك (SIR → MIR → تخصيص سجلّات → ترميز → كاتب ELF)، والاختلافُ بين المعماريّات يُوصَف بياناتٍ في جداولٍ لكلّ ISA لا كودًا.** النطاق المستهدَف خمسُ معماريّات فأكثر: `x86-64`, `AArch64/ARM64`, `RISC-V (RV64GC + RV32)`, `ARMv7-A`, `i686`. النتيجةُ المرئيّة للمستخدم: `sadc file.ص --target=aarch64-linux -o file` يُنتج ثنائيَّ ELF أصليًّا يعمل — **بلا clang ولا lld ولا as ولا زمن تشغيل C** — لأيٍّ من المعماريّات المدعومة، وبذلك يكتمل **استقلالُ سلسلة الأدوات العربيّة السياديّة**. + +# الدافع (Motivation) + +- **السيادة الكاملة:** لغةٌ تولّد شيفرتَها عبر LLVM هي لغةٌ تابعةٌ لسلسلة أدواتٍ أجنبيّة. ضمن رؤية «منظومة تقنيّة عربيّة سياديّة» ([[arabic-sovereign-tech-stack-vision]])، يجب أن يملك المكدّسُ العربيُّ توليدَ الشيفرة من التعليمة الآليّة حتّى الثنائيّ النهائيّ. LLVM يبقى **مترجمَ إقلاعٍ عابرًا فقط** (إقلاع ثلاثيّ)، لا تبعيّةَ إنتاجٍ دائمة. +- **تعدّد المعماريّات مطلبٌ لا رفاهية:** المنظومة تستهدف الخوادمَ (x86-64)، والهواتفَ والأجهزةَ اللوحيّة (AArch64/ARMv7)، والعتادَ السياديَّ مفتوحَ المصدر (RISC-V)، والأنظمةَ القديمة/المدمجة (i686). النطاقُ متعدّدُ المعماريّات (خمسُ ISAs) قرارُ مالكٍ سابقٌ مسجَّلٌ في تقريرَي `no_llvm` (٢٦ يوليو ٢٠٢٦). **أيُّ تصميمٍ يبدأ بهدفٍ واحدٍ ثمّ يُضاف إليه لاحقًا يتسرّب افتراضاتِ ذلك الهدف إلى الخطّ المشترك** — فيبدو عامًّا وهو ليس كذلك. لذا يشدّد قرارُ المالك (٣٠ يوليو ٢٠٢٦) على أن يكون التجريدُ متعدّدُ المعماريّات **في صميم التصميم من اليوم الأوّل** لا إضافةً لاحقة. +- **الكلفة معقولةٌ بالنهج الجدوليّ:** ~٥٥–٦٥٪ من جهد الخلفيّة مشتركٌ بين كلّ المعماريّات، و~٣٥–٤٥٪ يتكرّر لكلّ ISA. وصفُ الاختلاف بياناتٍ (جداول) بدل كودٍ يخفض المتكرّرَ إلى ~٢٠–٢٥٪ ⇒ إضافةُ معماريّةٍ سادسةٍ ثابتةِ الترميز تصبح **جدولًا فقط، صفرَ كودِ محرّك**. +- **حالة استخدام واقعيّة:** نواةُ `nahla` (مكتوبة بـ ص خالصة تقريبًا، تُقلع على QEMU) ونظامُ `sad-os` يحتاجان توليدَ الوضع الحرّ لعدّة معماريّات؛ اليوم يُلجأ إلى **ترقيعٍ نصّيٍّ** لثلاثيّ الهدف في مخرج LLVM IR — التفافٌ هشٌّ يغدر أوّلَ ظهورِ بنيةٍ تخزّن مؤشّرات على هدفٍ ٣٢-بت. الخلفيّةُ الأصليّةُ الجدوليّةُ هي السدُّ المنبعيّ الصحيح. + +# الشرح التوجيهي (Guide-level explanation) + +من منظور المستخدم، لا يتغيّر شيءٌ في كتابة برنامج ص؛ يتغيّر ما يفعله المترجم خلفَ الكواليس عند اختيار الهدف: + +```sad +# نفس البرنامج، أهدافٌ متعدّدة — لا clang ولا lld ولا as +# sadc مرحبا.ص --target=x86-64-linux -o مرحبا_x86 +# sadc مرحبا.ص --target=aarch64-linux -o مرحبا_arm +# sadc مرحبا.ص --target=riscv64-linux -o مرحبا_riscv +# كلّها ثنائيّات ELF أصليّة تعمل على Linux/QEMU + +دالة رئيسية() + اطبع_سطر("مرحبا من خلفيّةٍ سياديّة") + ارجع 0 +نهاية +``` + +المفاهيم التي يراها المطوّرُ المتقدّم (كاتبُ النواة/المترجم): + +- **الهدف يُختار بعلَمٍ واحد** `--target=-` — والأحجامُ والإزاحاتُ كلُّها تُشتقّ من وصف الهدف (لا ثوابتُ مؤشّرٍ مُجمَّدةٌ زمنَ التوليد). +- **إضافةُ معماريّةٍ جديدةٍ = إضافةُ جداولِ بياناتٍ في `language-truth/backend//`** — لا كتابةُ مولّدٍ يدويٍّ كامل. +- **رسائلُ خطأٍ أوضح للهدف غير المدعوم:** `الهدف 'sparc64-linux' غير مدعوم؛ المعماريّات المتاحة: x86-64, aarch64, riscv64, armv7, i686` بدل انهيارٍ غامض. + +# الشرح المرجعي (Reference-level explanation) + +## المعماريّة العامّة — الخطُّ المشترك مقابل بيانات الـISA + +``` +SIR (~٢٥٠ أوپكود، مستقلّ عن ISA ١٠٠٪؛ منها ~٦٠ منخفضةُ المستوى يخفضها الخلفيّ مباشرةً، والبقيّة ⇒ call runtime_fn) + │ خفضٌ مشترك + ▼ +MIR (تعليماتٌ مجرّدة بأسماء منمنمات الهدف + سجلّاتٌ افتراضيّة غير مخصَّصة) + │ ← جدول أنماط الاختيار isel.yaml [بيانات/ISA] + ▼ +اختيار التعليمات + تخصيص السجلّات (linear-scan) — خوارزميّةٌ مشتركة + │ ← جدول السجلّات registers.yaml + جدول ABI [بيانات/ISA×نظام] + ▼ +محرّك الترميز العامّ (encoder engine) — يُكتَب مرّةً واحدة + │ ← جدول التعليمات instructions.yaml (حقول البتّات) [بيانات/ISA] + ▼ +كاتب ELF مشترك (~٨٥٪) ← e_machine + أنواع relocation [بيانات/ISA] + ▼ +ثنائيّ ELF أصليّ (ساكن) — بلا أدواتٍ أجنبيّة +``` + +**الحدُّ الفاصل (ما يُشارَك مقابل ما يبقى بياناتٍ لكلّ ISA):** + +| مشترك (يُكتَب مرّةً) | بياناتٌ لكلّ ISA (جداول، لا كود) | +|---|---| +| خفض SIR (SSA بكتلٍ أساسيّة + PHI) — مستقلّ عن ISA | جدول التعليمات: الترميزُ الثنائيّ لكلّ منمنمة | +| خفض MIR (تعليماتٌ مجرّدة + سجلّاتٌ افتراضيّة) | جدول السجلّات: الأصناف، أرقام الترميز، محجوز/محفوظ | +| تخصيص السجلّات (linear-scan) — يأخذ القيودَ من الجدول | جدول أنماط الاختيار: SIR/MIR → منمنمات الهدف | +| محرّك الترميز (يملأ حقولَ البتّات من الجدول) | جدول الـABI: لكلّ (ISA × نظام) | +| كاتب ELF (~٨٥٪) — يأخذ e_machine/relocations من الجدول | — | + +**المنطق الضيّق الخاصّ (كودٌ صغيرٌ لكلّ عائلة، لا مفرّ منه):** بادئاتُ x86 المتغيّرة (REX/VEX/ModRM/SIB)، وinterworking في ARMv7 (ARM↔Thumb)، وضغطُ RISC-V (C-extension) — شذوذاتُ ترميزٍ لا تُوصَف بجدولٍ مسطّحٍ كامل. لكنّها **دالّتان مشتركتان** (`encode_prefixes`, `encode_modrm_sib`) لكلّ عائلة x86 لا لكلّ ISA. + +## عقد واجهة الهدف (Target interface) + +الحاجزُ المعماريُّ الذي يمنع تسرّبَ افتراضات x86 إلى الخطّ المشترك: كلُّ لمسةٍ خاصّةٍ بمعماريّةٍ تمرّ عبر عقدٍ واحد — إمّا استعلامٌ من جدول، وإمّا فرعُ عائلةٍ في محرّكٍ مشترك. لا يُكتب اسمُ سجلٍّ أو أوپكودٍ حرفيًّا في الخطّ المشترك. + +``` +Target (يُشتقّ من الجداول، لا كودٌ يدويّ لكلّ هدف): + ptr_width / data_layout ← من وصف الهدف (٤ أو ٨ بايت) + register_file() ← registers.yaml + isel_patterns() ← isel.yaml + abi(os) ← abi/-.yaml + instruction_table() ← instructions.yaml + encoding_family ← {fixed32 | variable} + elf_machine / reloc_kinds ← جدول الـISA +``` + +## نموذج بيانات الجداول (مخطّطاتٌ رسميّة في `language-truth/backend/`) + +أربعةُ جداولٍ لكلّ معماريّة، تُتحقَّق بمخطّطات JSON مربوطةٍ بـ`test_schema_validation.py`: + +1. **`instructions.yaml`** — الترميزُ الثنائيّ لكلّ منمنمة (حقول البتّات hi/lo/const/from). `fixed32` لـARM64/RISC-V، `variable` لـx86-64/i686. +2. **`registers.yaml`** — أصنافُ السجلّات، أرقامُ الترميز، المحجوز/المحفوظ (caller/callee-saved). +3. **`isel.yaml`** — أنماطُ اختيار SIR/MIR → منمنمات الهدف (موزونةٌ بالتكلفة). +4. **`abi/-.yaml`** — سجلّاتُ الوسائط، سجلُّ العائد، محاذاةُ المكدّس، أرقامُ النداء (syscall) — لكلّ (ISA × نظام). + +> نقطةُ التمديد جاهزةٌ سلفًا: SoT فيه `language-truth/dialects/assembly.yaml` و`_schemas/assembly_mnemonics.schema.json` و`dialects/assembly_mnemonics/.yaml` — هذه الطبقةُ **إثراءٌ لـSoT قائمٍ لا نظامٌ موازٍ**. + +## محرّك الترميز العامّ + +يُكتَب **مرّةً واحدة**؛ مدخلُه MIR بعد تخصيص السجلّات (سجلّاتٌ فيزيائيّة)، ومخرجُه بايتات + قائمة relocations. فرعان فقط: + +- **`fixed32`** (مشتركٌ حرفيًّا بين ARM64 وRISC-V): ملءُ حقولِ بتّاتٍ من الجدول ⇒ كلمة ٣٢-بت. **أكبرُ مكسبٍ للطبقة الجدوليّة.** +- **`variable`** (x86-64 وi686): يستدعي `encode_prefixes` + `encode_modrm_sib` — كلُّ المنطق اليدويّ لعائلة x86، يُكتبان مرّةً ويُشاركان. + +حلُّ الإزاحات: المحرّك يبعث **سجلَّ relocation** (إزاحةُ الموضع + نوعٌ من جدول الـISA + الرمز)، ويحلّها كاتبُ ELF في تمريرةٍ ثانية. + +## البوّابة الحرجة — الاختبار التفاضليّ بايت-ببايت + +صحّةُ الترميز هي الفخُّ الأكبر (خطأُ بتٍّ واحدٍ = ثنائيٌّ ميتٌ صامت). الدفاع، **شرطُ قبولٍ لا تفاوضَ فيه**: + +``` +لكلّ (منمنمة، صيغة، معاملات عيّنة) في جدول التعليمات: + ours = مُرمِّزنا.encode(...) + ref = llvm-mc --show-encoding (أو GNU as) + assert ours == ref بايت-ببايت، وإلا FAIL مع hexdump للفرق +``` + +LLVM يبقى **مصحّحًا مرجعيًّا في CI فقط**، لا تبعيّةَ إنتاج — نظيرُ قرار «الملازمة parity» للمسار الثالث ([[selfhost-three-tracks-parity]]). relocations تُختبَر بـ`objdump` (النوع والموضع). + +## الانضباط الحاسم — الهدفُ الثاني مبكرًا جدًّا + +لمنع تسرّبِ افتراضات x86: بعد نجاح **x86-64** (CISC، عرضٌ متغيّر) يُدخَل **AArch64** (RISC، عرضٌ ثابت ٣٢-بت) بأصغرِ برهانٍ ممكن (رمزُ خروجٍ عبر `svc`) **بملء جدولٍ ثانٍ فقط**. إن نجح **دون تعديلِ الخطّ المشترك**، فالتجريدُ مُبرهَنٌ عامًّا. اختلافُ صنفِ المعماريّتين جوهريٌّ فيُجبر التجريدَ على العموميّة. + +## الأثر على الأنظمة المتشابكة + +- **مصدر الحقيقة (`language-truth/`):** مجلّدٌ جديد `language-truth/backend//` (instructions/registers/isel) + `backend/abi/-.yaml` + مخطّطات JSON. **لا كلمةَ/توجيهَ/نوعَ لغةٍ جديد.** +- **المحلّل المعجميّ/النحويّ (Lexer/Parser):** **بلا تغيير** — الخلفيّةُ تبدأ من SIR. +- **الشجرة المجرّدة (AST):** **بلا عقدٍ جديدة.** +- **SIR:** محايدٌ عن ISA بالفعل (~٢٥٠ أوپكود إجمالًا، منها ~٦٠ منخفضةُ المستوى يخفضها الخلفيّ مباشرةً، والبقيّة العالية ⇒ `call runtime_fn`)؛ قد يلزم توسيعٌ طفيفٌ لتغطيةِ ما يخفضه LLVM اليوم ضمنيًّا. الأمامية (خافض SIR) والمحسّن يبقيان. +- **المفسّر:** **بلا تغيير** (مرجعُ التكافؤ يبقى كما هو). +- **المترجم (sadc):** خلفيّةٌ جديدةٌ موازيةٌ خلف علَمِ `--backend=native` (LLVM يبقى افتراضًا حتّى تنضج)، ثمّ تصبح الافتراضَ عند اكتمال معماريّةٍ ما. +- **نظام الأخطاء (`language-truth/errors/`):** رموزٌ جديدة (هدفٌ غير مدعوم، منمنمةٌ بلا مدخلِ ترميز، فشلُ تخصيص سجلّات). +- **الأدوات:** LSP/المنسّق **بلا تأثّر**؛ قد يعرض `sadinfo` المعماريّاتِ المدعومةَ من الجداول. +- **التوافق الخلفيّ:** **صفرُ كسر** — مسارٌ اختياريٌّ خلف علَم؛ سلوكُ اللغة ومخرجاتُها (مطابقةً للمفسّر) محفوظة. + +## المسار المرحليّ (كلٌّ مُتحقَّقٌ تفاضليًّا ضدّ llvm-mc) + +| المرحلة | المحتوى | معيار القبول | +|---|---|---| +| **م٠ — الهيكل + مخطّطات SoT + الحواجز** | `language-truth/backend/` + مخطّطات JSON + عقد واجهة `Target`؛ جدول x86-64 صغير | المخطّطاتُ تُتحقَّق في CI؛ الحواجزُ قائمةٌ (لا x86 في الخطّ المشترك) | +| **م١ — أدنى جدول x86-64 + محرّك `variable`** | ~١٥ تعليمة (mov, syscall, ret, add, cmp, jcc, jmp) + encode_prefixes/modrm_sib | «خروج ٤٢» يُطابق llvm-mc بايت-ببايت | +| **م٢ — كاتب ELF + البوّابة التفاضليّة** | كاتب ELF ساكن + CI تفاضليّ لكلّ الجدول | «مرحبا» الحرّ: ELF ساكن يكتب عبر `write` ويخرج، بلا أدواتٍ أجنبيّة | +| **م٣ — الهدف الثاني (AArch64) + طبقة `fixed32`** | تعميمُ المحرّك على `fixed32`؛ أصغرُ برهان AArch64 بجدولٍ ثانٍ فقط | AArch64 يعمل **دون تعديلِ الخطّ المشترك** ⇒ التجريدُ مُبرهَن | +| **م٤ — isel جدوليّ + linear-scan** | اختيارٌ موزونٌ بالتكلفة + مخصِّصُ سجلّات | حلقة + شرط + نداءُ دالّةٍ على x86-64 وAArch64 من الجداول وحدها | +| **م٥ — RISC-V (مولَّد آليًّا)** | استيراد `riscv-opcodes` ⇒ الجدول | «مرحبا» + الحلقة على RISC-V/QEMU، مطابقةٌ تفاضليّة | +| **م٦ — ARMv7 + i686 يدويّان** | `encode_thumb` للـinterworking؛ إعادةُ استخدام `variable` لـi686 | تغطيةُ الخمس بالبوّابة التفاضليّة الخضراء | + +# السلبيات (Drawbacks) + +- **كلفةٌ كبيرة:** النطاقُ الكامل (خمس معماريّات، ELF/لينكس + الوضع الحرّ) واقعيًّا **~٢٫٥–٣ سنوات مطوّر**؛ أوّلُ ISA كبرهان MVP ~٦ أشهر و~٢٠٬٠٠٠–٣٠٬٠٠٠ سطر. +- **صحّةُ الترميز فخٌّ دقيق:** خطأُ بتٍّ واحدٍ = ثنائيٌّ ميتٌ صامت — يُخفَّف بالبوّابة التفاضليّة الإلزاميّة لكنّه يبقى العبءَ الأكبر. +- **صحّةُ isel/regalloc/ABI:** خمسُ ABIs مختلفة؛ الأخطاءُ فيها عسيرةُ التشخيص. +- **عبءُ الصيانة:** جداولٌ ومحرّكٌ إضافيّان بجانب مسار LLVM حتّى نضج الاستبدال. + +# المبرّرات والبدائل (Rationale and alternatives) + +- **لماذا الجدوليّ هو الأفضل:** يخفض المتكرّرَ لكلّ ISA من ~٤٠٪ إلى ~٢٠–٢٥٪، ويجعل إضافةَ معماريّةٍ ثابتةِ الترميز جدولًا فقط. البديلُ (مولّدٌ يدويٌّ كاملٌ لكلّ ISA) = خمسةُ مشاريع. +- **البدائل المدروسة:** + - **الإبقاء على LLVM:** يخرق السيادة؛ مرفوض بقرار المالك. + - **الاستهداف عبر C (نُخرج C ثمّ ندع مترجمًا أجنبيًّا):** يُبقي التبعيّة الأجنبيّة؛ لا يحقّق السيادة. + - **آلة مكدّسٍ ساذجةٍ لهدفٍ واحد:** مفيدةٌ للتطوير المبكّر لكنّها لا تحقّق «ترجمةً أصليّةً متعدّدةَ المعماريّات». + - **هدفٌ واحدٌ أوّلًا ثمّ التعميم لاحقًا:** مرفوضٌ لأنّه يتسرّب افتراضاتِ الهدف الأوّل؛ لذا نبني الحواجزَ من اليوم الأوّل ونُدخل هدفًا ثانيًا مختلفَ الصنف مبكرًا. +- **أثرُ عدم الفعل:** تبقى اللغةُ تابعةً لـLLVM، ويبقى توليدُ الوضع الحرّ متعدّدِ المعماريّات مبنيًّا على ترقيعٍ نصّيٍّ هشّ. + +# أعمال سابقة (Prior art) + +- **LLVM:** table-driven عبر TableGen (`.td`) — نموذجُنا الفكريّ، لكن نُبقي الجداولَ بـYAML في SoT العربيّ. +- **QBE / chibicc:** خلفيّاتٌ صغيرةٌ مرجعيّة (مرجعُ تصميمٍ لا تبعيّة). +- **Cranelift (Rust):** مُولِّدٌ أصليٌّ بلا LLVM بأنماطِ اختيارٍ معلنة — شاهدٌ على جدوى النهج. +- **مترجم Go:** خلفيّةٌ خاصّةٌ متعدّدةُ المعماريّات (SSA + قواعدُ خفضٍ لكلّ arch) — شاهدٌ على «خطٌّ مشترك + قواعدُ لكلّ هدف». +- **riscv-opcodes / Arm MRA:** مواصفاتٌ رسميّةٌ تُؤتمَت منها جداولُ RISC-V (~٨٥–٩٠٪) وARM64 (~٧٠–٨٠٪). +- خصوصيّةُ ص: الجداولُ والمنمنماتُ عربيّةٌ أوّلًا، قابلةٌ للكتابة بـ«ص» لاحقًا بلا إقلاعٍ دائريّ. + +# أسئلة غير محسومة (Unresolved questions) + +- **قبل الدمج:** هل نلتزم صيغةَ YAML للجداول (مقابل توليدِها من مواصفاتٍ رسميّةٍ مباشرةً)؟ وأيُّ نظامٍ يُدعَم أوّلًا لكلّ ISA (Linux ثمّ الوضع الحرّ)؟ +- **أثناء التنفيذ:** حدودُ توسيع SIR لتغطية ما يخفضه LLVM ضمنيًّا؛ خوارزميّةُ تخصيص السجلّات (linear-scan أوّلًا، ثمّ graph-coloring؟)؛ ترتيبُ دعم الوضع الحرّ مقابل المستضاف لكلّ هدف. +- **اختيارُ الهدف الثاني (انحرافٌ موثَّقٌ عن أحد المصدرين):** يختار هذا الـRFC **AArch64** هدفًا ثانيًا في م٣ (يتبع تقرير الاستقلال §٩٫٦: AArch64 ← RISC-V) لأنّه يفتح سوقَ الهواتف/الأجهزة اللوحيّة (أولويّةٌ استراتيجيّة) ويُبرهِن العموميّةَ باختلاف صنفِ المعماريّة (RISC مقابل CISC). في المقابل يُفضّل `تصميم_طبقة_الترميز_الجدوليّة.md §٧` **RISC-V** ثانيًا لأنّه مولَّدٌ آليًّا ⇒ أدنى خطرِ ترميزٍ يدويّ عند أوّل تعميمٍ لطبقة `fixed32`. المفاضلة (قيمةُ الهواتف مقابل أمانِ التوليد الآليّ) تُحسَم عند بدء م٣. +- **خارج النطاق:** التحسينُ المتقدّم (auto-vectorization، LTO)؛ أهدافُ Windows/Mach-O (تبقى على LLVM مبدئيًّا)؛ WebAssembly. + +# إمكانات مستقبلية (Future possibilities) + +- **رابطٌ داخليٌّ سياديّ** يحلّ محلّ `ld.lld`/`ld` (الربطُ اليومَ خارجيٌّ عبر `system()`). +- **كتابةُ الجداول والمحرّك بـ«ص» نفسها** بعد نضج الاستضافة الذاتيّة ([[self-hosting-roadmap-and-tagged-enum-progress]]) — يكتمل المكدّسُ العربيُّ من التعليمة الآليّة حتّى المترجم. +- معماريّاتٌ إضافيّةٌ ثابتةُ الترميز (LoongArch) = جدولٌ فقط. +- تحسيناتُ الجدولة وتخصيصِ السجلّات المتقدّمة على الخطّ المشترك تفيد كلَّ الأهداف دفعةً واحدة. + +--- + +> **الأساس التقنيّ والموقع:** يستند هذا المقترح إلى تقريرين داخليّين مفصّلين: `تقرير_استقلال_المترجم_عن_LLVM.md` و`تصميم_طبقة_الترميز_الجدوليّة.md` (في `تقارير_مؤقته/لغة ص/no_llvm`). وهو **RFCٌ سياديٌّ مستقلّ** تحت رؤية «المكدّس العربيّ السياديّ» / حملة الخلفيّة الأصليّة بلا LLVM — **وليس** RFCًا فرعيًّا لـ«الاستضافة الذاتيّة». التمييز جوهريّ: مظلّةُ الاستضافة الذاتيّة اختارت لحاجزها الأوّل (الخلفيّة) خلفيّةَ **LLVM-IR نصّيّةً انتقاليّةً تُبقي LLVM**، ووضعت **استبدالَ LLVM بخلفيّةٍ أصليّة** ضمن «إمكاناتها المستقبليّة/خارج نطاقها». هذا الـRFC هو **تحقيقُ ذلك البند المؤجَّل**: يُرقّي المسارَ من «نصّيّ يُبقي LLVM» إلى «أصليّ سياديّ يستبدله»، فيُكمِل حاجزَ الخلفيّة سياديًّا بدل أن يكون جزءًا منه. أوّلُ لبنةٍ ملموسةٍ **مدموجة**: سدُّ `اكتب_بايتات`/`اقرأ_بايتات` (لغة PR #316، دمج squash `731c94aa`) — كتابةُ بايتاتٍ خامٍّ تشمل `0x00`، لبنةُ كاتب ELF.