Treci la conținut

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\Engine ca 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ările self:: continuă să funcționeze și evitați să afectați suprafața metodelor private API.
  • Rulați bin/verify-all local î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 aduse src/; 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.js din tests/Wpt/upstream/<area>/ în tests/Wpt/fixtures/<category>/, iar runnerul îl va prelua.

Consultați și