
# متقدم

الأجزاء الداخلية. إذا كنت تدمج Phasis في تطبيقك، يمكنك تخطي هذا القسم. أما إذا كنت تعدّل المحرك، فكل صفحة هنا أساسية.

## الصفحات

- **[البنية](https://phasis.inline0.dev/ar/docs/advanced/architecture)** — كيف يتحول المصدر إلى تنفيذ: lexer → parser → AST → ترجمة الشيفرة البايتية → VM الشيفرة البايتية مع الرجوع إلى اجتياز الشجرة. محمّل الوحدات، والنطاقات، ودور `Phasis\Engine` بوصفه حدًّا للنطاق.
- **[VM الشيفرة البايتية](https://phasis.inline0.dev/ar/docs/advanced/bytecode-vm)** — مجموعة أكواد العمليات، وحلقة الإرسال، وذاكرات التخزين المؤقت المضمّنة، ومسار التحويل السريع للمصدر JsToPhp، والاستدلال على canSkipEnvAlloc لشكل الدالة، ومتى تسلك الاستدعاءات مسار الشيفرة البايتية بدلًا من اجتياز الشجرة.
- **[المعايير](https://phasis.inline0.dev/ar/docs/advanced/benchmarks)** — أرقام `bench/` الحالية، وكيفية تفسيرها، ولماذا يُعدّ أداء أبطأ بنحو 100× من V8 هو الحد المستقر لاجتياز الأشجار، وما الذي يقلّص الفجوة.
- **[الاختبار](https://phasis.inline0.dev/ar/docs/advanced/testing)** — نموذج المرجع. يُتحقق من كل تغيير بمقارنته بثلاثة مراجع مستقلة: Node.js (الحقيقة المرجعية لمواصفات V8)، وtest262، ومجموعة اختبار مساواة البايتات للمكتبات الشائعة.

## إرشادات المساهمة

- **لا تعدّل المحرك الأساسي من دون سبب قوي.** كل ما يقع ضمن `src/Runtime/`، `src/Bytecode/`، `src/Lexer/`، `src/Parser/`، `src/Regex/` يقع على المسار الحرج لـ test262. تعديله من دون تحقق مقابل في test262 وصفة للتراجعات. أما المكوّنات المضمّنة (`src/BuiltIn/`) فهي أكثر أمانًا، لأن مجموعات test262 الفرعية لكل مكوّن ترصد الأعطال محليًا.
- **استخدم السمات للتنظيم، لا الأصناف.** عندما يتجاوز الملف نحو 2K سطر، قسّمه إلى ملفات سمات ضمن مجلد شقيق (`src/BuiltIn/Temporal/`، `src/Runtime/Parts/`، إلخ) بدلًا من إنشاء أصناف جديدة — فهذا يُبقي عمليات البحث `self::` فعّالة ويجنب كسر سطح API للأساليب الخاصة.
- **شغّل `bin/verify-all` محليًا قبل الدفع.** فهو يشغّل PHPStan وPHPCS وكل مجموعات PHPUnit (unit وoracle وpopular وwpt) واختبار تراجع المرجع. يشغّل CI مجموعتي WPT وpopular عند إجراء تغييرات على `src/`؛ أما مصفوفة test262 الكاملة فتُشغّل يدويًا، لذا اختبر محليًا فئات test262 المتأثرة.
- **أضف نموذج WPT لكل إضافة إلى Web API.** ضع `.any.js` من `tests/Wpt/upstream/<area>/` داخل `tests/Wpt/fixtures/<category>/` وسيلتقطه المشغّل تلقائيًا.

## راجع أيضًا

- [التوافق](https://phasis.inline0.dev/ar/docs/compatibility) — كيفية قياس مخرجات المرجع.
- [مرجع CLI](https://phasis.inline0.dev/ar/docs/cli) — `bin/phasis`، `bin/test262`، `bin/wpt`.
