
# Розширене

Внутрішня будова. Якщо ви вбудовуєте Phasis, цей розділ можна пропустити. Якщо ви змінюєте рушій, кожна сторінка тут критично важлива.

## Сторінки

- **[Архітектура](https://phasis.inline0.dev/uk/docs/advanced/architecture)** — як вихідний код перетворюється на виконання: лексичний аналізатор → парсер → AST → компіляція в байт-код → байт-кодова VM із резервним обходом дерева. Завантажувач модулів, середовища виконання та роль `Phasis\Engine` як межі середовища.
- **[Байт-кодова VM](https://phasis.inline0.dev/uk/docs/advanced/bytecode-vm)** — набір опкодів, цикл диспетчеризації, вбудовані кеші, швидкий шлях транспілятора JsToPhp, евристика canSkipEnvAlloc для форми функції, випадки виконання викликів через байт-код, а не обхід дерева.
- **[Бенчмарки](https://phasis.inline0.dev/uk/docs/advanced/benchmarks)** — поточні показники `bench/`, їх інтерпретація, причина, чому приблизно 100× V8 є межею продуктивності обходу дерева в сталому режимі, і способи скоротити розрив.
- **[Тестування](https://phasis.inline0.dev/uk/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.
- **Для кожного доповнення Web API додавайте тестовий приклад WPT.** Помістіть `.any.js` з `tests/Wpt/upstream/<area>/` у `tests/Wpt/fixtures/<category>/`, і виконавець підхопить його.

## Див. також

- [Сумісність](https://phasis.inline0.dev/uk/docs/compatibility) — як вимірюються результати оракула.
- [Довідник CLI](https://phasis.inline0.dev/uk/docs/cli) — `bin/phasis`, `bin/test262`, `bin/wpt`.
