Skip to content

خلفيّةٌ أصليّةٌ بجداولَ بلا 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: لا يُكتَبُ اسمُ سجلٍّ ولا أوپكودٍ حرفيًّا في المشترك، بل يُستعلَمُ من جدولٍ أو يُفرَعُ على عائلةِ الترميز.

٢ · أنّها تعمل — مقيسًا

bash
sad-build.exe 001_in_while.ص --خلفية-أصلية -o out.elf
fatal error: الخلفيّة الأصليّة (بلا LLVM): الهدف (x86_64-pc-windows-msvc)
غير مدعوم — المدعومُ x86_64 وaarch64 على linux أو none

الرفضُ مُشخَّصٌ ومُسمًّى، لا انهيارٌ ولا ثنائيٌّ لا يعمل. وبهدفٍ مدعوم:

bash
sad-build.exe 001_in_while.ص --خلفية-أصلية \
  --هدف=x86_64-unknown-linux-gnu -o brk.elf
file brk.elf
brk.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]) ومقيسٌ أنّ الثنائيَّ يقبلُهما ويُنفِّذُهما.

٣ · الجداول، ومقاسُها الحقيقيّ

bash
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 أصلًا. فالخفضُ الأصليُّ القائمُ اليومَ ليس مقودًا بهذه الجداولِ بعد؛ الجداولُ عقدُ البياناتِ الذي سيقودُه.

٤ · مدى التغطية — من المُشتقِّ لا من الدعوى

bash
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.

مُرخَّص بموجب رخصة MIT