Gå til indhold

Avanceret

Internt stof. Hvis du indlejrer Phasis, kan du springe dette afsnit over. Hvis du ændrer motoren, er alle sider her afgørende.

Sider

  • Arkitektur — sådan bliver kildekode til eksekvering: lexer → parser → AST → bytekodekompilering → bytekode-VM med tree-walker-fallback. Modulloadefunktion, realms og Phasis\Engine's rolle som realm-grænse.
  • Bytekode-VM — opkodesæt, dispatch-løkke, inline-caches, JsToPhp-kildekodetranspileringens hurtige sti, heuristikken canSkipEnvAlloc for funktionsform, og hvornår kald følger bytekodestien kontra tree-walkeren.
  • Benchmarks — aktuelle bench/-tal, hvordan de skal fortolkes, hvorfor ~100× V8 er den stabile øvre grænse for tree-walkere, og hvad der kan mindske forskellen.
  • Testning — oracle-modellen. Hver ændring verificeres mod tre uafhængige orakler: Node.js (V8-specifikationens facit), test262 og testsuiten for byte-identitet i populære biblioteker.

Konventioner for bidrag

  • Rør ikke ved motorens kerne uden en god grund. Alt under src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/ ligger på test262's kritiske sti. Ændres det uden en tilsvarende test262-verifikation, kan det føre til regressioner. Indbyggede funktioner (src/BuiltIn/) er sikrere, fordi test262's undertests for hver enkelt indbygget funktion fanger fejl lokalt.
  • Brug traits til organisering, ikke klasser. Når en fil overstiger ~2K linjer, skal den opdeles i trait-filer i en søstermappe (src/BuiltIn/Temporal/, src/Runtime/Parts/ osv.) i stedet for at oprette nye klasser — det holder self::-opslagene i gang og undgår at bryde overfladen for private metoder API.
  • Kør bin/verify-all lokalt før push. Den kører PHPStan, PHPCS, alle PHPUnit-suiter (unit, oracle, popular, wpt) og oracle-regressionstesten. CI kører WPT- og popular-suiterne ved ændringer i src/; den fulde test262-matrix startes manuelt, så kør lokalt test262-kategorier, der påvirkes.
  • Tilføj en WPT-fixture for hver tilføjelse af Web API. Læg .any.js fra tests/Wpt/upstream/<area>/ i tests/Wpt/fixtures/<category>/, så finder runneren den.

Se også