خلفيّةٌ أصليّةٌ بجداولَ بلا LLVM
المترجّمُ يبني اليومَ عبرَ LLVM. وإلى جانبِ ذلك خلفيّةٌ ثانيةٌ بلا LLVM تأخذُ SIR وتُخرِجُ ELF64 ساكنًا مباشرةً. هذه الصفحةُ عن مبدئِها وعن حدودِها المقيسة.
١ · المبدأ الحاكم
الخطُّ الخلفيُّ واحدٌ مشترك؛ والاختلافُ بين المعماريّاتِ بياناتٌ في جداولٍ لكلِّ ISA لا كودًا.
SIR (مستقلٌّ عن ISA)
│ خفضٌ مشترك
▼
MIR (تعليماتٌ مجرّدة + سجلّاتٌ افتراضيّة)
│ ← isel.yaml [بيانات/ISA]
▼
اختيارُ التعليماتِ + تخصيصُ السجلّات (linear-scan) — خوارزميّةٌ مشتركة
│ ← registers.yaml + abi/<arch>-<os>.yaml
▼
محرّكُ الترميزِ العامّ (فرعان: fixed32 | variable)
│ ← instructions.yaml (حقولُ البتّات)
▼
كاتبُ ELF مشترك ← e_machine + relocationsوالحاجزُ الذي يمنعُ تسرُّبَ افتراضاتِ معماريّةٍ إلى الخطِّ المشترك عقدٌ واحدٌ اسمُه Target: لا يُكتَبُ اسمُ سجلٍّ ولا أوپكودٍ حرفيًّا في المشترك، بل يُستعلَمُ من جدولٍ أو يُفرَعُ على عائلةِ الترميز.
٢ · أنّها تعمل — مقيسًا
sad-build.exe 001_in_while.ص --خلفية-أصلية -o out.elffatal error: الخلفيّة الأصليّة (بلا LLVM): الهدف (x86_64-pc-windows-msvc)
غير مدعوم — المدعومُ x86_64 وaarch64 على linux أو noneالرفضُ مُشخَّصٌ ومُسمًّى، لا انهيارٌ ولا ثنائيٌّ لا يعمل. وبهدفٍ مدعوم:
sad-build.exe 001_in_while.ص --خلفية-أصلية \
--هدف=x86_64-unknown-linux-gnu -o brk.elf
file brk.elfbrk.elf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
statically linked, no section header٣٩٠ بايتًا لبرنامجِ حلقةٍ فيها توقف. العَلَمانِ --أظهر-sir و--خلفية-أصلية مُعلَنانِ في language-truth/cli_flags.yaml (flag.emit_sir وflag.native_backend، كلاهما engines: [compiler]) ومقيسٌ أنّ الثنائيَّ يقبلُهما ويُنفِّذُهما.
٣ · الجداول، ومقاسُها الحقيقيّ
for a in x86_64 arm64 riscv64; do
echo "$a: isel $(wc -l < language-truth/backend/$a/isel.yaml 2>/dev/null || echo 0)"
done
python -c "import yaml; [print(a, len(yaml.safe_load(open(f'language-truth/backend/{a}/instructions.yaml',encoding='utf-8'))['instructions'])) for a in ['x86_64','arm64','riscv64']]"| المعماريّة | isel.yaml | أنماطُ اختيار | instructions | عائلةُ الترميز |
|---|---|---|---|---|
x86_64 | ٢٥ سطرًا | ٣ | ٦٨ | variable |
arm64 | ٢٥ سطرًا | ٣ | ٥٤ | fixed32 |
riscv64 | لا ملفّ | ٠ | ١٥ | fixed32 |
هذا هو الحدُّ الحقيقيّ، ولا يُجمَّل
جدولُ اختيارِ التعليماتِ اليومَ ثلاثةُ أنماطٍ لكلٍّ من معماريّتَين (ADD_I64 · CONST_I64 · RET)، ووسمُه في الملفِّ نفسِه status: experimental. وriscv64 مُعلَنةٌ status: lowered في targets.yaml وليس لها isel.yaml أصلًا. فالخفضُ الأصليُّ القائمُ اليومَ ليس مقودًا بهذه الجداولِ بعد؛ الجداولُ عقدُ البياناتِ الذي سيقودُه.
٤ · مدى التغطية — من المُشتقِّ لا من الدعوى
python scripts/codegen/check_lowers_to.py① الكتالوج: 780 أوپكودًا (الطزاجة: محدَّث) · مخفوضٌ أصليًّا: 104
▸ دعم الخلفيّة الأصليّة (بلا LLVM) — من المُشتقّ فقط:
arm64 102/105 قاعدة مُشتقّة (102/107 من الكلّ)
riscv64 26/105 قاعدة مُشتقّة (26/107 من الكلّ)
x86_64 102/105 قاعدة مُشتقّة (102/107 من الكلّ)
⑤ المعماريّات المستهدَفة: 5 في مصدر الحقيقة · 3 معماريّاتٍ مخفوضة فعلًاالحكمُ مشتقٌّ لا مُدَّعًى: القاعدةُ «مدعومةٌ أصليًّا» على معماريّةٍ إن كان كلُّ أوپكودٍ في lowers_to لها يحملُ native_lowered لتلك المعماريّة في sir_opcodes.yaml — وlowers_to نفسُه اشتُقَّ بتشغيلِ المترجّم (انظرْ اشتقاقَ التنزيل). فمئةٌ وأربعةٌ من ٧٨٠ أوپكودًا مخفوضةٌ أصليًّا، والبقيّةُ تُصرَفُ إلى نداءِ وقتِ تشغيل.
٥ · قيدُ عائلةِ المعالِج
بعضُ الأوپكوداتِ تُخفَّضُ إلى أسمبليٍّ لا يفهمُه إلّا معالجٌ من عائلةٍ بعينِها — cli · outb · mov %crN · rdtsc. وكان المترجّمُ يبثُّها لأيِّ هدفٍ يُطلَبُ بخروجٍ صفريّ: عداد_الدورات() مع --هدف=aarch64-unknown-elf كان ينجحُ ويبثُّ rdtsc.
فصار القيدُ مُعلَنًا في language-truth/backend/arch_specific_opcodes.yaml، ويُولَّدُ منه هيدرٌ يُستهلَكُ في emitInstruction — نقطةِ التوزيعِ الوحيدة — والمفتاحُ قيمةُ التعداد لا نصُّ الاسم، فالاسمُ الخاطئُ في الـYAML خطأُ ترجمةٍ لا صمت. ويحرسُه اثنان: واحدٌ يحرسُ الجدولَ من طرفَيه (لا اسمَ ميّتًا فيه ولا مُصدِرَ x86 خارجَه)، وواحدٌ يحرسُ الأثر — يُشغِّلُ المترجّمَ ويتحقّقُ من الرفضِ خارجَ العائلةِ والقبولِ داخلَها.
٦ · حدودٌ مقيسة
- إضافةُ معماريّةٍ ما تزال نقلًا يدويًّا لا ملءَ جدول. مرحلةُ استخراجِ الطبقةِ الجدوليّة (م٤) وسمُها في
targets.yamlهوin_progress؛ المشتركُ بين المخفّضَينِ ٣٧٥ سطرًا، وما يزالُ خارجَه — بنصِّ مصدرِ الحقيقة — القسمةُ وأرضيّتُها والباقي والإزاحاتُ الثلاثُ والذاكرةُ والنداءُ والطباعة. - ثلاثُ معماريّاتٍ مخفوضةٌ من خمسٍ مستهدَفة؛
armv7وi686وسمُهماplanned— دَينٌ مُعلَنٌ لا قدرةٌ مُدَّعاة. riscv64مخفوضةٌ اسمًا وتغطيتُها ٢٦ من ١٠٥ — أي أنّ الوسمَloweredوحدَه ليس قياسًا، والعدّادُ المشتقُّ هو الذي يقيس.- البوّابةُ الحرجةُ لم تصلْ بعد: الاختبارُ التفاضليُّ بايتًا-ببايتٍ ضدَّ
llvm-mcمُعلَنٌ في تصميمِ الطبقةِ (م١) — LLVM مصحِّحٌ مرجعيٌّ في CI فقط، لا تبعيّةَ إنتاج. وحتّى يصلَ، ليس في الشجرةِ ما يُثبِتُ صحّةَ الترميزِ بايتًا-ببايت. --خلفية-أصليةلا تعملُ على هدفِ ويندوز. الرفضُ مُشخَّصٌ كما في §٢، والمدعومُx86_64وaarch64علىlinuxأوnone.