
# Zaawansowane

Wewnętrzne działanie. Jeśli osadzasz Phasis, możesz pominąć tę sekcję. Jeśli modyfikujesz silnik, każda z tych stron ma kluczowe znaczenie.

## Strony

- **[Architektura](https://phasis.inline0.dev/pl/docs/advanced/architecture)** — jak źródło staje się wykonywalne: lexer → parser → AST → kompilacja bajtkodu → maszyna wirtualna bajtkodu z awaryjnym walkerem drzewa. Ładowanie modułów, realms i rola `Phasis\Engine` jako granicy realm.
- **[Maszyna wirtualna bajtkodu](https://phasis.inline0.dev/pl/docs/advanced/bytecode-vm)** — zestaw kodów operacji, pętla dispatch, pamięci podręczne inline, szybka ścieżka transpilacji źródła JsToPhp oraz heurystyka function-shape canSkipEnvAlloc; kiedy wywołania korzystają ze ścieżki bajtkodu, a kiedy z walkera drzewa.
- **[Benchmarki](https://phasis.inline0.dev/pl/docs/advanced/benchmarks)** — aktualne wyniki `bench/`, ich interpretacja, przyczyna, dla której ~100× V8 jest ustalonym maksimum dla walkerów drzewa, oraz sposoby zmniejszenia tej różnicy.
- **[Testowanie](https://phasis.inline0.dev/pl/docs/advanced/testing)** — model wzorca referencyjnego. Każda zmiana jest weryfikowana względem trzech niezależnych wzorców: Node.js (specyfikacji V8 jako źródła prawdy), test262 i zestawu testów zgodności bajtowej popularnych bibliotek.

## Zasady współtworzenia

- **Nie zmieniaj podstawowego silnika bez mocnego powodu.** Wszystko w `src/Runtime/`, `src/Bytecode/`, `src/Lexer/`, `src/Parser/`, `src/Regex/` znajduje się na krytycznej ścieżce test262. Zmiany bez odpowiadającej im weryfikacji test262 grożą regresjami. Wbudowane elementy (`src/BuiltIn/`) są bezpieczniejsze, ponieważ lokalne zestawy testów test262 dla każdego z nich wykrywają problemy.
- **Używaj traitów do organizacji kodu, a nie klas.** Gdy plik przekracza około 2 tys. linii, podziel go na pliki traitów w sąsiednim katalogu (`src/BuiltIn/Temporal/`, `src/Runtime/Parts/` itd.), zamiast wydzielać nowe klasy — dzięki temu wyszukiwanie `self::` nadal działa i nie naruszasz powierzchni API metod prywatnych.
- **Uruchom lokalnie `bin/verify-all` przed wysłaniem zmian.** Uruchamia PHPStan, PHPCS, każdy zestaw PHPUnit (unit, oracle, popular, wpt) oraz test regresji oracle. CI uruchamia zestawy WPT i popularnych testów po zmianach w `src/`; pełna macierz test262 jest uruchamiana ręcznie, więc lokalnie przetestuj dotknięte kategorie test262.
- **Do każdej nowej funkcji Web API dodaj fixture WPT.** Umieść `.any.js` z `tests/Wpt/upstream/<area>/` w `tests/Wpt/fixtures/<category>/`, a runner automatycznie go wykryje.

## Zobacz także

- [Zgodność](https://phasis.inline0.dev/pl/docs/compatibility) — sposób pomiaru wyników oracle.
- [CLI dokumentacja referencyjna](https://phasis.inline0.dev/pl/docs/cli) — `bin/phasis`, `bin/test262`, `bin/wpt`.
