
# Napredno

Podrobnosti delovanja v ozadju. Če vdelujete Phasis, lahko ta razdelek preskočite. Če spreminjate pogon, je vsaka stran tukaj ključna.

## Strani

- **[Arhitektura](https://phasis.inline0.dev/sl/docs/advanced/architecture)** — kako izvorna koda postane izvajanje: leksikalna analiza → razčlenjevalnik → AST → prevajanje v bajtno kodo → navidezni stroj z bajtno kodo z nadomestnim sprehajalnikom dreves. Nalagalnik modulov, okolja in vloga `Phasis\Engine` kot meje okolja.
- **[Navidezni stroj z bajtno kodo](https://phasis.inline0.dev/sl/docs/advanced/bytecode-vm)** — nabor opkod, zanka dispečiranja, vgrajeni predpomnilniki, hitra pot transpilerja izvorne kode JsToPhp, hevristika canSkipEnvAlloc za obliko funkcije ter kdaj klici uporabijo pot bajtne kode in kdaj sprehajalnik dreves.
- **[Primerjalni testi](https://phasis.inline0.dev/sl/docs/advanced/benchmarks)** — trenutne meritve `bench/`, kako jih razlagati, zakaj je približno 100× V8 zgornja meja zmogljivosti sprehajalnikov dreves v ustaljenem stanju in kaj bi zmanjšalo vrzel.
- **[Testiranje](https://phasis.inline0.dev/sl/docs/advanced/testing)** — model oraklov. Vsaka sprememba se preveri glede na tri neodvisne oracle: Node.js (izhodišče resnice za specifikacijo V8), test262 in zbirko testov enakosti bajtov za priljubljene knjižnice.

## Dogovori za prispevke

- **Osrednjega pogona se dotikajte le z utemeljenim razlogom.** Vse pod `src/Runtime/`, `src/Bytecode/`, `src/Lexer/`, `src/Parser/`, `src/Regex/` je na kritični poti test262. Spremembe brez ustreznega preverjanja test262 lahko povzročijo regresije. Vgrajene funkcije (`src/BuiltIn/`) so varnejše, ker podnabori testov test262 za vsako vgrajeno funkcijo lokalno zaznajo napake.
- **Za organizacijo uporabljajte lastnosti, ne razredov.** Ko datoteka preseže približno 2K vrstic, jo razdelite na datoteke z lastnostmi v podrejeni mapi (`src/BuiltIn/Temporal/`, `src/Runtime/Parts/` itd.) namesto ustvarjanja novih razredov — tako iskanje `self::` še naprej deluje in se izognete spremembam površine zasebnih metod API.
- **Pred pošiljanjem lokalno zaženite `bin/verify-all`.** Zažene PHPStan, PHPCS, vse zbirke PHPUnit (unit, oracle, popular, wpt) in regresijski test oracle. CI ob spremembah v `src/` zažene zbirki WPT in popular; celotna matrika test262 se zažene ročno, zato lokalno vzorčno preizkusite prizadete kategorije test262.
- **Ob vsaki dodani spletni funkciji API dodajte testni primer WPT.** Datoteko `.any.js` iz `tests/Wpt/upstream/<area>/` dodajte v `tests/Wpt/fixtures/<category>/` in izvajalnik jo bo zaznal.

## Glejte tudi

- [Združljivost](https://phasis.inline0.dev/sl/docs/compatibility) — kako se merijo izhodi orakla.
- [referenca](https://phasis.inline0.dev/sl/docs/cli) — CLI, `bin/phasis`, `bin/test262`, `bin/wpt`.
