
# Разширено

Вътрешното устройство. Ако вграждате Phasis, можете да пропуснете този раздел. Ако променяте енджина, всяка страница тук е съществена.

## Страници

- **[Архитектура](https://phasis.inline0.dev/bg/docs/advanced/architecture)** — как изходният код се превръща в изпълнение: лексер → парсер → AST → компилация до байткод → байткод VM с резервен обхождащ дървото интерпретатор. Зареждач на модули, realms и ролята на `Phasis\Engine` като граница на realm.
- **[Байткод VM](https://phasis.inline0.dev/bg/docs/advanced/bytecode-vm)** — набор от опкодове, цикъл на диспечиране, вградени кешове, бърз път за транспилиране на изходен код JsToPhp, евристика canSkipEnvAlloc за формата на функцията, кога извикванията минават по пътя с байткод и кога — през обхождащия дървото интерпретатор.
- **[Бенчмаркове](https://phasis.inline0.dev/bg/docs/advanced/benchmarks)** — текущи резултати за `bench/`, как да ги тълкувате, защо ~100× V8 е стабилният максимум за интерпретатори, които обхождат дървото, и какво би намалило разликата.
- **[Тестване](https://phasis.inline0.dev/bg/docs/advanced/testing)** — моделът с оракул. Всяка промяна се проверява спрямо три независими оракула: Node.js (еталонът на спецификацията V8), test262 и наборът от тестове за байтово равенство с популярни библиотеки.

## Правила за принос

- **Не пипайте основния енджин без сериозна причина.** Всичко в `src/Runtime/`, `src/Bytecode/`, `src/Lexer/`, `src/Parser/`, `src/Regex/` е по критичния път за test262. Промени там без съответна проверка с test262 водят до регресии. Вградените функции (`src/BuiltIn/`) са по-безопасни, защото тестовите поднабори на test262 за всяка вградена функция откриват локално проблемите.
- **Използвайте трейтове за организация, а не класове.** Когато файлът надхвърли ~2K реда, разделете го на trait файлове в съседна директория (`src/BuiltIn/Temporal/`, `src/Runtime/Parts/` и т.н.), вместо да създавате нови класове — така справките `self::` продължават да работят и се избягва нарушаването на повърхността API за частни методи.
- **Изпълнявайте `bin/verify-all` локално преди изпращане.** Той изпълнява PHPStan, PHPCS, всички набори PHPUnit (unit, oracle, popular, wpt) и регресионните тестове на оракула. CI изпълнява WPT и популярните набори при промени в `src/`; пълната матрица test262 се стартира ръчно, затова локално изпълнявайте засегнатите категории test262.
- **Добавяйте WPT fixture за всяко допълнение към Web API.** Поставете `.any.js` от `tests/Wpt/upstream/<area>/` в `tests/Wpt/fixtures/<category>/` и изпълнителят ще го открие.

## Вижте също

- [Съвместимост](https://phasis.inline0.dev/bg/docs/compatibility) — как се измерват изходните резултати на оракула.
- [Справка за CLI](https://phasis.inline0.dev/bg/docs/cli) — `bin/phasis`, `bin/test262`, `bin/wpt`.
