Avansat
Detalii interne. Dacă integrați Phasis, puteți sări peste această secțiune. Dacă modificați motorul, fiecare pagină de aici este esențială.
Pagini
- Arhitectură — cum devine sursa execuție: lexer → parser → AST → compilare bytecode → VM de bytecode cu fallback la parcurgătorul arborescent. Încărcătorul de module, realm-urile, rolul lui
Phasis\Engineca limită a realm-ului. - VM de bytecode — setul de opcoduri, bucla de dispatch, cache-urile inline, calea rapidă de transp ilare a sursei JsToPhp, euristica canSkipEnvAlloc pentru formele funcțiilor, când apelurile folosesc calea de bytecode și când parcurgătorul arborescent.
- Benchmark-uri — valorile curente
bench/, cum să le interpretați, de ce ~100× V8 este plafonul în regim stabil pentru parcurgătoarele arborescente și ce ar reduce diferența. - Testare — modelul oracle. Fiecare modificare este verificată față de trei surse independente de referință: Node.js (adevărul de referință al specificației V8), test262 și suita de egalitate octet cu octet pentru biblioteci populare.
Convenții pentru contribuții
- Nu modificați motorul de bază fără un motiv întemeiat. Tot ce se află sub
src/Runtime/,src/Bytecode/,src/Lexer/,src/Parser/,src/Regex/face parte din calea critică test262. Modificarea acestuia fără o verificare corespunzătoare test262 duce aproape sigur la regresii. Funcționalitățile încorporate (src/BuiltIn/) sunt mai sigure, deoarece sub-suiturile test262 pentru fiecare funcționalitate încorporată detectează local problemele. - Folosiți trait-uri pentru organizare, nu clase. Când un fișier depășește aproximativ 2K de linii, împărțiți-l în fișiere trait într-un director alăturat (
src/BuiltIn/Temporal/,src/Runtime/Parts/etc.), în loc să creați clase noi — astfel, căutărileself::continuă să funcționeze și evitați să afectați suprafața metodelor private API. - Rulați
bin/verify-alllocal înainte de a trimite modificările. Acesta rulează PHPStan, PHPCS, fiecare suită PHPUnit (unit, oracle, popular, wpt) și testul de regresie oracle. CI rulează suitele WPT și popular la modificări adusesrc/; matricea completă test262 este pornită manual, așa că testați local categoriile test262 afectate. - Adăugați un fixture WPT pentru fiecare element Web API nou. Puneți
.any.jsdintests/Wpt/upstream/<area>/întests/Wpt/fixtures/<category>/, iar runnerul îl va prelua.
Consultați și
- Compatibilitate — cum sunt măsurate rezultatele oracle.
- ReferințăCLI —
bin/phasis,bin/test262,bin/wpt.