
# Teadaolevad piirangud

Phasis eesmärk on käituda igas jälgitavas spetsifikatsioonitestis täpselt nagu V8. Sellel lehel on loetletud kohad, kus praktikas see sarnasus lõpeb — tavaliselt puu läbiva PHP interpretaatori ja JIT-kompileeritud C++ mootori põhimõtteliste erinevuste tõttu.

## Jõudluse piir

Mootor kasutab puud läbivat interpretaatorit, võimaluse korral baitkoodi VM-i ja JsToPhp transpilaatorit, mis teisendab arvutusmahukad või lokaale rohkelt kasutavad koodiplokid (sh kujundid `obj.method()`, `new Ctor()` ja `this.member`) natiivseteks PHP sulunditeks, mida PHP 8.5 jälgiv JIT saab masinkoodiks kompileerida. Suurem osa sagedasi väljakutseid toimub VM-i lülitustsüklis või otse JIT-kompileeritud kujul PHP — AST-d ei läbita —, kuid iga VM-i opkood maksab endiselt PHP väljakutse lisakulu ning iga kujund, mida JsToPhp veel ei toeta, langeb tagasi aeglasema VM-i juurde. Väljakutsemahukate töökoormuste jõudluspiir on ligikaudu **100× aeglasem kui V8**.

Manustatud töökoormuste puhul — kasutaja antud loogika käivitamine PHP andmetel, sisu teisendamise torujuhtmed ja valideerimisreeglid — on see piir harva oluline. V8 võtab 100 ms; Phasis võtab 10 s; mõlemad jäävad päringu ajalõpust kaugele allapoole. Lõhe vähendamiseks tuleks JsToPhp-le õpetada rohkem kujundeid (parameetrite tüübijäreldus, `await` / `yield*` teisendamine) või väljastada opcache'i opkoode otse, mitte läbi `eval()`. Vt [Võrdlusnäitajad § Teekaart](https://phasis.inline0.dev/et/docs/advanced/benchmarks#roadmap).

## Mitme agendi samaaegsus

JavaScript mudel `SharedArrayBuffer` + `Atomics.wait` + `postMessage` eeldab, et host saab käivitada päris operatsioonisüsteemi lõimi. PHP seda ei suuda (ilma `pcntl_fork`-ta, mis pole kõigis hostides saadaval).

Phasis simuleerib üht agenti — `Atomics.wait` tagastab kohe väärtuse "not-equal" või "timed-out", `notify` tagastab alati 0. See läbib kõik ühe agendiga käivitatavad test262 testid (sisendi valideerimine, veateed, tühiteavitus), mis moodustavad 376 Atomicsi testidest 376.

Teste, mille puhul kaks samaaegset agenti peavad teineteist jälgima, ei toetata. Päris paralleelsuse jaoks kasutage PHP taseme töötajajärjekorda (Redis, Beanstalkd, …).

## Realm'i semantika

`ShadowRealm` on teostatud, kuid iga alamrealm töötab hostiga samas PHP protsessis. Hostifunktsioonid võivad viiteid realm'ide vahel lekitada, kui te ei hoia PHP koodi hoolikalt isoleerituna. Spetsifikatsioon lubab seda; V8 tagab rangema isolatsiooni eraldi v8::Isolate'i eksemplaridega.

`createRealm()` (test262 hostikonks) loob sisemiselt uue `Phasis\Engine`-i ja ühendab standardteegi.

## Regulaaravaldiste mootori valik

Phasis kasutab peamise regulaaravaldiste taustsüsteemina PHP PCRE2-te ning kohandatud sobitajat juhuks, kui PCRE2 ei saa täpselt hakkama (salvestustega tagasivaatamine, lähtestamisega kvantifitseeritud rühmad, teatud `/v`-lipu semantika). Kohandatud sobitaja on PCRE2-st aeglasem ja seda kasutatakse vaid siis, kui mustri kontroll tuvastab ühildumatuse.

Oluline tagajärg: PCRE2 väiketähtedeks teisendamise tabel võib erineda V8 ICU versioonist, eriti vanemates Linux distributsioonides (Ubuntu 22.04 sisaldab ICU 70; Phasis komplekteerib ICU 76+ teisendustabeli, et vältida hosti erinevusi `/iu` mustrite korral).

## Mälumudel

PHP viiteloendusel põhinev prügi kogumine erineb V8 jälitavast kogujast. Hostisulundite hõivatud PHP objektid püsivad elus seni, kuni mootor hoiab neid sulundeid alles, ning nendevahelisi tsükleid ei koguta enne, kui `Engine` hävitatakse. Kasutage vahemälude jaoks `WeakMap` / `WeakRef`, mida te ei soovi elus hoida.

`process.memoryUsage()` ja sarnased V8-spetsiifilised introspektsiooni API-d pole teostatud.

## Moodulilaadija

ES-moodulite laadija lahendab suhtelised impordid failisüsteemi põhjal, kuid ei tunne pakendajate tavasid:

- Puudub `node_modules` lahendamine.
- Puudub `package.json` `exports` kaart.
- Faililaiendit ei tuletata (kirjutage `import './foo.mjs'`, mitte `import './foo'`).
- HTTP importi ei toetata.

See vastab ECMAScripti põhispetsifikatsioonile, kuid mitte Node'i käitumisele. Kohandatud moodulilahendaja jaoks konksu pole. npm pakettide kasutamiseks pakendage need tööriistaga nagu esbuild üheks skriptiks või mooduliks, enne kui annate selle Phasis-le.

## Wasm

`WebAssembly` pole teostatud. Sidumiseks puudub PHP WebAssembly käituskeskkond.

## Brauseripõhised veebi API-d, mida ei toetata

Phasis sisaldab täielikku **Web Platform Pack**-i (`URL`, `TextEncoder`/`TextDecoder`, `atob`/`btoa`, `structuredClone`, `performance`, `DOMException`), täielikku **Fetch Pack**-i (`fetch`, `Request`, `Response`, `Headers`, `Body`, `AbortController`/`AbortSignal`, `Blob`/`File`, `FormData`, `EventTarget`/`Event`, täielikud WHATWG Streams, `navigator`) ning `crypto` (`getRandomValues`, `randomUUID`, täielik `SubtleCrypto`: digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), `WebSocket` (konstruktor + RFC 6455 kaadrikodek, vahetatav transport), `XMLHttpRequest` (fetch-transpordi peal) ja päris sündmussilmuse (`setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext`). Vt [Veebi API-d](https://phasis.inline0.dev/et/docs/compatibility/web-apis).

Mida ei sisaldu:

- `window`, `document`, DOM-puu — Phasis pole brauser.
- `localStorage`, `sessionStorage`, `IndexedDB` — hosti ülesanded; püsimälu eest vastutab manustaja.
- `Worker`, `SharedWorker`, `MessageChannel` — vajavad päris operatsioonisüsteemi lõimi, mida PHP ei paku.
- Service Workers, Push API, Notifications, BroadcastChannel — väljaspool brauserit ebaolulised.

## Node'i globaalsed muutujad

`process`, `Buffer`, `__dirname`, `__filename`, `require()` — neidki pole olemas. Need on Node'i hosti tavad, mitte keele omadused.

Kui teisaldate Node'i koodi, asendage `require('foo')` väärtusega `import 'foo'`, asendage `process.env.X` hostiga seotud `env.X`-ga ning andke `__dirname`-ga samaväärsed rajad ette saidilt PHP.

## Kümnendmurdude täpsus

ECMAScripti arvud on IEEE 754 topelttäpsusega arvud. Rohkem kui 15 tüvenumbriga kümnendarvutuste täpsus väheneb samamoodi nagu kõigis teistes JS mootorites. Täisarvude täpseks arvutamiseks kasutage `BigInt`-i; täpsete murdarvutuste jaoks kasutage JS kümnendarvuteeki.

PHP `bcmath`-i kasutatakse sisemiselt `BigInt` jaoks; ainus tegelik erinevus V8-ga võrreldes on see, et väga suurte bigint-tehete tegemine on PHP-s aeglasem kui V8 C++ teostuses. Arvutustäpsus on sama.
