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\Engineals 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 bleibenself::-Nachschlagevorgänge funktionsfähig und die Oberfläche der privaten Methoden API bleibt intakt. - Führe
bin/verify-allvor 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 ansrc/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.jsaustests/Wpt/upstream/<area>/intests/Wpt/fixtures/<category>/ab; der Runner erkennt es automatisch.
Siehe auch
- Kompatibilität – so werden die Oracle-Ausgaben gemessen.
- CLI-Referenz –
bin/phasis,bin/test262,bin/wpt.