Przejdź do treści

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\Engine jako 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 wyszukiwanie self:: nadal działa i nie naruszasz powierzchni API metod prywatnych.
  • Uruchom lokalnie bin/verify-all przed 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 w src/; 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.js z tests/Wpt/upstream/<area>/ w tests/Wpt/fixtures/<category>/, a runner automatycznie go wykryje.

Zobacz także