
# Išplėstinė dalis

Vidinė sandara. Jei Phasis įterpiate į savo programą, šį skyrių galite praleisti. Jei keičiate variklį, kiekvienas čia esantis puslapis yra būtinas.

## Puslapiai

- **[Architektūra](https://phasis.inline0.dev/lt/docs/advanced/architecture)** — kaip šaltinio kodas virsta vykdymu: leksinė analizė → analizatorius → AST → baitkodo kompiliavimas → baitkodo VM su atsarginiu medžio vaikščiojimo interpretatoriumi. Modulių įkėliklis, sritys, `Phasis\Engine` vaidmuo kaip srities riba.
- **[Baitkodo VM](https://phasis.inline0.dev/lt/docs/advanced/bytecode-vm)** — opkodų rinkinys, vykdymo ciklas, tiesioginės talpyklos, JsToPhp šaltinio transpiliatoriaus spartusis kelias, funkcijos formos euristika canSkipEnvAlloc ir tai, kada iškvietimai vykdomi baitkodo keliu, o kada — medžio vaikščiojimo interpretatoriumi.
- **[Našumo bandymai](https://phasis.inline0.dev/lt/docs/advanced/benchmarks)** — dabartiniai `bench/` skaičiai, kaip juos interpretuoti, kodėl ~100× V8 yra pastovi medžio vaikščiojimo interpretatorių riba ir kas padėtų ją peržengti.
- **[Testavimas](https://phasis.inline0.dev/lt/docs/advanced/testing)** — etaloninių rezultatų modelis. Kiekvienas pakeitimas tikrinamas pagal tris nepriklausomus etalonus: Node.js (V8 specifikacijos etaloną), test262 ir populiarių bibliotekų baitų lygybės testų rinkinį.

## Prisidėjimo prie projekto taisyklės

- **Nelieskite pagrindinio variklio be rimtos priežasties.** Viskas, kas yra `src/Runtime/`, `src/Bytecode/`, `src/Lexer/`, `src/Parser/`, `src/Regex/`, yra test262 kritiniame vykdymo kelyje. Jį keisti neatlikus atitinkamo test262 patikrinimo — tiesus kelias į regresijas. Integruotos funkcijos yra saugesnės, nes kiekvienos jų test262 testų poaibiai lokaliai aptinka `src/BuiltIn/` gedimus.
- **Organizuokite kodą naudodami trait'us, o ne klases.** Kai failas viršija ~2K eilučių, suskaidykite jį į trait failus gretimame kataloge (`src/BuiltIn/Temporal/`, `src/Runtime/Parts/` ir kt.), užuot kūrę naujas klases — taip veikia `self::` paieška ir nepažeidžiama privačių metodų API sąsaja.
- **Prieš siųsdami pakeitimus paleiskite `bin/verify-all` lokaliai.** Jis paleidžia PHPStan, PHPCS, visus PHPUnit rinkinius (unit, oracle, popular, wpt) ir etalonų regresijos testą. CI paleidžia WPT ir populiarių bibliotekų rinkinius, kai pakeičiama `src/`; visą test262 matricą reikia paleisti rankiniu būdu, todėl lokaliai išbandykite paveiktas test262 kategorijas.
- **Prie kiekvienos Web API naujos funkcijos pridėkite WPT fikstūrą.** Įdėkite `.any.js` iš `tests/Wpt/upstream/<area>/` į `tests/Wpt/fixtures/<category>/`, ir vykdyklė ją aptiks.

## Taip pat žr.

- [Suderinamumas](https://phasis.inline0.dev/lt/docs/compatibility) — kaip matuojami etaloniniai rezultatai.
- [CLI nuoroda](https://phasis.inline0.dev/lt/docs/cli) — `bin/phasis`, `bin/test262`, `bin/wpt`.
