Preskoči na vsebino

Napredno

Podrobnosti delovanja v ozadju. Če vdelujete Phasis, lahko ta razdelek preskočite. Če spreminjate pogon, je vsaka stran tukaj ključna.

Strani

  • Arhitektura — kako izvorna koda postane izvajanje: leksikalna analiza → razčlenjevalnik → AST → prevajanje v bajtno kodo → navidezni stroj z bajtno kodo z nadomestnim sprehajalnikom dreves. Nalagalnik modulov, okolja in vloga Phasis\Engine kot meje okolja.
  • Navidezni stroj z bajtno kodo — nabor opkod, zanka dispečiranja, vgrajeni predpomnilniki, hitra pot transpilerja izvorne kode JsToPhp, hevristika canSkipEnvAlloc za obliko funkcije ter kdaj klici uporabijo pot bajtne kode in kdaj sprehajalnik dreves.
  • Primerjalni testi — trenutne meritve bench/, kako jih razlagati, zakaj je približno 100× V8 zgornja meja zmogljivosti sprehajalnikov dreves v ustaljenem stanju in kaj bi zmanjšalo vrzel.
  • Testiranje — model oraklov. Vsaka sprememba se preveri glede na tri neodvisne oracle: Node.js (izhodišče resnice za specifikacijo V8), test262 in zbirko testov enakosti bajtov za priljubljene knjižnice.

Dogovori za prispevke

  • Osrednjega pogona se dotikajte le z utemeljenim razlogom. Vse pod src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/ je na kritični poti test262. Spremembe brez ustreznega preverjanja test262 lahko povzročijo regresije. Vgrajene funkcije (src/BuiltIn/) so varnejše, ker podnabori testov test262 za vsako vgrajeno funkcijo lokalno zaznajo napake.
  • Za organizacijo uporabljajte lastnosti, ne razredov. Ko datoteka preseže približno 2K vrstic, jo razdelite na datoteke z lastnostmi v podrejeni mapi (src/BuiltIn/Temporal/, src/Runtime/Parts/ itd.) namesto ustvarjanja novih razredov — tako iskanje self:: še naprej deluje in se izognete spremembam površine zasebnih metod API.
  • Pred pošiljanjem lokalno zaženite bin/verify-all. Zažene PHPStan, PHPCS, vse zbirke PHPUnit (unit, oracle, popular, wpt) in regresijski test oracle. CI ob spremembah v src/ zažene zbirki WPT in popular; celotna matrika test262 se zažene ročno, zato lokalno vzorčno preizkusite prizadete kategorije test262.
  • Ob vsaki dodani spletni funkciji API dodajte testni primer WPT. Datoteko .any.js iz tests/Wpt/upstream/<area>/ dodajte v tests/Wpt/fixtures/<category>/ in izvajalnik jo bo zaznal.

Glejte tudi