Zum Inhalt springen

Erweitert

Die Interna. Wenn du Phasis einbettest, kannst du diesen Abschnitt überspringen. Wenn du die Engine änderst, ist jede Seite hier unverzichtbar.

Seiten

  • Architektur – wie aus Quellcode ausführbarer Code wird: Lexer → Parser → AST → Bytecode-Kompilierung → Bytecode-VM mit Tree-Walker-Fallback. Modul-Loader, Realms und die Rolle von Phasis\Engine als Realm-Grenze.
  • Bytecode-VM – Opcode-Satz, Dispatch-Schleife, Inline-Caches, der schnelle JsToPhp-Quellcode-Transpilerpfad, die canSkipEnvAlloc-Heuristik für Funktionsformen und der Weg, den Aufrufe über den Bytecode-Pfad oder den Tree-Walker nehmen.
  • Benchmarks – aktuelle bench/-Werte, ihre Interpretation, warum etwa 100× V8 die Obergrenze im stabilen Zustand für Tree-Walker sind und was den Abstand verringern würde.
  • Tests – das Oracle-Modell. Jede Änderung wird mit drei unabhängigen Oracles überprüft: Node.js (V8 als Referenz für die Spezifikation), test262 und der Byte-Gleichheitssuite für beliebte Libraries.

Konventionen für Beiträge

  • Fasse die zentrale Engine nur mit gutem Grund an. Alles unter src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/ liegt auf dem kritischen Pfad von test262. Änderungen ohne entsprechende test262-Verifikation führen leicht zu Regressionen. Integrierte Funktionen (src/BuiltIn/) sind sicherer, weil die test262-Teilsuiten für jede Funktion Fehler lokal erkennen.
  • Verwende Traits zur Organisation, keine Klassen. Wenn eine Datei über etwa 2K Zeilen hat, teile sie in Trait-Dateien in einem Unterverzeichnis auf (src/BuiltIn/Temporal/, src/Runtime/Parts/ usw.), statt neue Klassen anzulegen – so bleiben self::-Nachschlagevorgänge funktionsfähig und die Oberfläche der privaten Methoden API bleibt intakt.
  • Führe bin/verify-all vor dem Push lokal aus. Es führt PHPStan, PHPCS, alle PHPUnit-Suites (unit, oracle, popular, wpt) und die Oracle-Regression aus. CI führt die WPT- und Popular-Suites bei Änderungen an src/ aus; die vollständige test262-Matrix wird manuell gestartet, also prüfe betroffene test262-Kategorien lokal stichprobenartig.
  • Ergänze für jede Web-API-Erweiterung ein WPT-Fixture. Lege das .any.js aus tests/Wpt/upstream/<area>/ in tests/Wpt/fixtures/<category>/ ab; der Runner erkennt es automatisch.

Siehe auch