Preskočiť na obsah

Pokročilé

Interné fungovanie. Ak vkladáte Phasis do iného prostredia, túto časť môžete preskočiť. Ak upravujete engine, každá stránka tu je kľúčová.

Stránky

  • Architektúra — ako sa zdrojový kód mení na vykonávanie: lexer → parser → AST → kompilácia do bajtkódu → bajtkódový VM so záložným stromovým interpretom. Načítavač modulov, prostredia realm a úloha Phasis\Engine ako hranice realm.
  • Bajtkódový VM — množina opkódov, dispečovacia slučka, inline cache, rýchla cesta transpileru zdrojového kódu JsToPhp, heuristika canSkipEnvAlloc podľa tvaru funkcie a kedy volania využívajú bajtkódovú cestu namiesto stromového interpreta.
  • Benchmarky — aktuálne výsledky bench/, ako ich interpretovať, prečo je ~100× V8 ustáleným stropom stromových interpretov a čo by zmenšilo rozdiel.
  • Testovanie — model oracle. Každá zmena sa overuje voči trom nezávislým oracle: Node.js (referenčná špecifikácia V8), test262 a testovacej sade populárnych knižníc na úrovni bajtov.

Zásady prispievania

  • Nemeňte jadro enginu bez vážneho dôvodu. Všetko v src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/ leží na kritickej ceste test262. Úprava bez zodpovedajúceho overenia test262 môže viesť k regresiám. Vstavané funkcie (src/BuiltIn/) sú bezpečnejšie, pretože čiastkové testovacie sady test262 pre každú vstavanú funkciu zachytia problémy lokálne.
  • Na organizáciu používajte traits, nie triedy. Keď súbor prekročí približne 2K riadkov, rozdeľte ho na súbory s traits v podriadenom adresári (src/BuiltIn/Temporal/, src/Runtime/Parts/ atď.), namiesto vytvárania nových tried — zachováte funkčnosť vyhľadávania self:: a neporušíte rozhranie privátnych metód API.
  • Pred odoslaním zmien spustite lokálne bin/verify-all. Spustí PHPStan, PHPCS, všetky testovacie sady PHPUnit (unit, oracle, popular, wpt) a regresné testy oracle. CI spúšťa sady WPT a popular pri zmenách v src/; úplná matica test262 sa spúšťa manuálne, preto lokálne otestujte dotknuté kategórie test262.
  • Pri každom pridaní webového API pridajte fixture WPT. Vložte .any.js z tests/Wpt/upstream/<area>/ do tests/Wpt/fixtures/<category>/ a runner ho automaticky nájde.

Pozrite si aj