Zaawansowane
Wewnętrzne działanie. Jeśli osadzasz Phasis, możesz pominąć tę sekcję. Jeśli modyfikujesz silnik, każda z tych stron ma kluczowe znaczenie.
Strony
- Architektura — jak źródło staje się wykonywalne: lexer → parser → AST → kompilacja bajtkodu → maszyna wirtualna bajtkodu z awaryjnym walkerem drzewa. Ładowanie modułów, realms i rola
Phasis\Enginejako granicy realm. - Maszyna wirtualna bajtkodu — zestaw kodów operacji, pętla dispatch, pamięci podręczne inline, szybka ścieżka transpilacji źródła JsToPhp oraz heurystyka function-shape canSkipEnvAlloc; kiedy wywołania korzystają ze ścieżki bajtkodu, a kiedy z walkera drzewa.
- Benchmarki — aktualne wyniki
bench/, ich interpretacja, przyczyna, dla której ~100× V8 jest ustalonym maksimum dla walkerów drzewa, oraz sposoby zmniejszenia tej różnicy. - Testowanie — model wzorca referencyjnego. Każda zmiana jest weryfikowana względem trzech niezależnych wzorców: Node.js (specyfikacji V8 jako źródła prawdy), test262 i zestawu testów zgodności bajtowej popularnych bibliotek.
Zasady współtworzenia
- Nie zmieniaj podstawowego silnika bez mocnego powodu. Wszystko w
src/Runtime/,src/Bytecode/,src/Lexer/,src/Parser/,src/Regex/znajduje się na krytycznej ścieżce test262. Zmiany bez odpowiadającej im weryfikacji test262 grożą regresjami. Wbudowane elementy (src/BuiltIn/) są bezpieczniejsze, ponieważ lokalne zestawy testów test262 dla każdego z nich wykrywają problemy. - Używaj traitów do organizacji kodu, a nie klas. Gdy plik przekracza około 2 tys. linii, podziel go na pliki traitów w sąsiednim katalogu (
src/BuiltIn/Temporal/,src/Runtime/Parts/itd.), zamiast wydzielać nowe klasy — dzięki temu wyszukiwanieself::nadal działa i nie naruszasz powierzchni API metod prywatnych. - Uruchom lokalnie
bin/verify-allprzed wysłaniem zmian. Uruchamia PHPStan, PHPCS, każdy zestaw PHPUnit (unit, oracle, popular, wpt) oraz test regresji oracle. CI uruchamia zestawy WPT i popularnych testów po zmianach wsrc/; pełna macierz test262 jest uruchamiana ręcznie, więc lokalnie przetestuj dotknięte kategorie test262. - Do każdej nowej funkcji Web API dodaj fixture WPT. Umieść
.any.jsztests/Wpt/upstream/<area>/wtests/Wpt/fixtures/<category>/, a runner automatycznie go wykryje.
Zobacz także
- Zgodność — sposób pomiaru wyników oracle.
- CLI dokumentacja referencyjna —
bin/phasis,bin/test262,bin/wpt.