Hoppa till innehåll

Avancerat

Interna detaljer. Om du bäddar in Phasis kan du hoppa över det här avsnittet. Om du ändrar motorn är varje sida här grundläggande.

Sidor

  • Arkitektur — hur källkod blir till exekvering: lexer → parser → AST → bytekodskompilering → bytekod-VM med trädtolkarreservväg. Modulhanterare, kontexter och Phasis\Engines roll som gräns mellan kontexter.
  • Bytekod-VM — uppsättningen opkoder, dispatchloopen, inline-cacherna, snabbvägen för källkodstranspilering med JsToPhp, heuristiken canSkipEnvAlloc för funktionsformer samt när anrop går via bytekodsvägen respektive trädtolkaren.
  • Bänktester — aktuella bench/-siffror, hur de ska tolkas, varför ~100× V8 är den stabila övre gränsen för trädtolkare och vad som skulle minska gapet.
  • Testning — orakelmodellen. Varje ändring verifieras mot tre oberoende orakel: Node.js (specifikationens facit för V8), test262 och sviten som kontrollerar byte-för-byte-likhet med populära bibliotek.

Bidragsriktlinjer

  • Rör inte kärnmotorn utan starka skäl. Allt under src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/ ligger på den test262 kritiska sökvägen. Att röra den utan motsvarande verifiering test262 är ett säkert recept på regressioner. Inbyggda funktioner (src/BuiltIn/) är säkrare eftersom test262 delsviterna för varje inbyggd funktion fångar upp problem lokalt.
  • Använd traits för organisering, inte klasser. När en fil överstiger ~2K rader, dela upp den i trait-filer i en syskonsökväg (src/BuiltIn/Temporal/, src/Runtime/Parts/ osv.) i stället för att bryta ut nya klasser — det håller self::-sökningar fungerande och undviker att bryta ytan för privata metoder API.
  • Kör bin/verify-all lokalt före push. Det kör PHPStan, PHPCS, varje PHPUnit-svit (unit, oracle, popular, wpt) och oracle-regressionstestet. CI kör WPT- och popular-sviterna vid ändringar i src/; den fullständiga test262-matrisen startas manuellt, så testa berörda test262-kategorier lokalt.
  • Lägg till en WPT-fixture för varje tillägg till Web API. Lägg .any.js från tests/Wpt/upstream/<area>/ i tests/Wpt/fixtures/<category>/ så hittar köraren den.

Se även