Ga naar de inhoud

Geavanceerd

De interne werking. Als u Phasis insluit, kunt u dit gedeelte overslaan. Als u de engine aanpast, is elke pagina hier essentieel.

Pagina's

  • Architectuur — hoe broncode uitvoering wordt: lexer → parser → AST → bytecodecompilatie → bytecode-VM met tree-walker-terugval. Modulelader, realms en de rol van Phasis\Engine als grens van de realm.
  • Bytecode-VM — opcode-set, dispatchlus, inline caches, het snelle brontranspilatiepad van JsToPhp, de heuristiek canSkipEnvAlloc voor functie-vormen en wanneer aanroepen het bytecodepad of de tree-walker volgen.
  • Benchmarks — huidige bench/-cijfers, hoe u die interpreteert, waarom ~100× V8 het plafond in steady state is voor tree-walkers en hoe het verschil kleiner kan worden.
  • Testen — het oracle-model. Elke wijziging wordt gecontroleerd aan de hand van drie onafhankelijke oracles: Node.js (de feitelijke specificatie van V8), test262 en de suite die bytegelijkheid met populaire bibliotheken controleert.

Afspraken voor bijdragen

  • Raak de core-engine alleen aan als daar een sterke reden voor is. Alles onder src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/ ligt op het kritieke test262-pad. Dit aanraken zonder bijbehorende test262-verificatie leidt geheid tot regressies. Ingebouwde functies (src/BuiltIn/) zijn veiliger, omdat de test262-subsets voor elke ingebouwde functie problemen lokaal opsporen.
  • Gebruik traits voor de organisatie, geen classes. Als een bestand meer dan ongeveer 2K regels bevat, splits het dan op in trait-bestanden onder een aangrenzende map (src/BuiltIn/Temporal/, src/Runtime/Parts/, enz.) in plaats van nieuwe classes te maken. Zo blijven self::-zoekopdrachten werken en wordt voorkomen dat het oppervlak van privé-methoden API wordt doorbroken.
  • Voer bin/verify-all lokaal uit voordat je pusht. Het voert PHPStan, PHPCS, elke PHPUnit-suite (unit, oracle, popular, wpt) en de oracle-regressietest uit. CI voert bij wijzigingen in src/ de WPT- en popular-suites uit; de volledige matrix van test262 wordt handmatig gestart. Test daarom lokaal de categorieën van test262 die door de wijziging zijn geraakt.
  • Voeg voor elke toevoeging aan het Web API een WPT-fixture toe. Plaats de .any.js uit tests/Wpt/upstream/<area>/ in tests/Wpt/fixtures/<category>/; de runner pikt die dan op.

Zie ook