Pereiti prie turinio

Išplėstinė dalis

Vidinė sandara. Jei Phasis įterpiate į savo programą, šį skyrių galite praleisti. Jei keičiate variklį, kiekvienas čia esantis puslapis yra būtinas.

Puslapiai

  • Architektūra — kaip šaltinio kodas virsta vykdymu: leksinė analizė → analizatorius → AST → baitkodo kompiliavimas → baitkodo VM su atsarginiu medžio vaikščiojimo interpretatoriumi. Modulių įkėliklis, sritys, Phasis\Engine vaidmuo kaip srities riba.
  • Baitkodo VM — opkodų rinkinys, vykdymo ciklas, tiesioginės talpyklos, JsToPhp šaltinio transpiliatoriaus spartusis kelias, funkcijos formos euristika canSkipEnvAlloc ir tai, kada iškvietimai vykdomi baitkodo keliu, o kada — medžio vaikščiojimo interpretatoriumi.
  • Našumo bandymai — dabartiniai bench/ skaičiai, kaip juos interpretuoti, kodėl ~100× V8 yra pastovi medžio vaikščiojimo interpretatorių riba ir kas padėtų ją peržengti.
  • Testavimas — etaloninių rezultatų modelis. Kiekvienas pakeitimas tikrinamas pagal tris nepriklausomus etalonus: Node.js (V8 specifikacijos etaloną), test262 ir populiarių bibliotekų baitų lygybės testų rinkinį.

Prisidėjimo prie projekto taisyklės

  • Nelieskite pagrindinio variklio be rimtos priežasties. Viskas, kas yra src/Runtime/, src/Bytecode/, src/Lexer/, src/Parser/, src/Regex/, yra test262 kritiniame vykdymo kelyje. Jį keisti neatlikus atitinkamo test262 patikrinimo — tiesus kelias į regresijas. Integruotos funkcijos yra saugesnės, nes kiekvienos jų test262 testų poaibiai lokaliai aptinka src/BuiltIn/ gedimus.
  • Organizuokite kodą naudodami trait'us, o ne klases. Kai failas viršija ~2K eilučių, suskaidykite jį į trait failus gretimame kataloge (src/BuiltIn/Temporal/, src/Runtime/Parts/ ir kt.), užuot kūrę naujas klases — taip veikia self:: paieška ir nepažeidžiama privačių metodų API sąsaja.
  • Prieš siųsdami pakeitimus paleiskite bin/verify-all lokaliai. Jis paleidžia PHPStan, PHPCS, visus PHPUnit rinkinius (unit, oracle, popular, wpt) ir etalonų regresijos testą. CI paleidžia WPT ir populiarių bibliotekų rinkinius, kai pakeičiama src/; visą test262 matricą reikia paleisti rankiniu būdu, todėl lokaliai išbandykite paveiktas test262 kategorijas.
  • Prie kiekvienos Web API naujos funkcijos pridėkite WPT fikstūrą. Įdėkite .any.js iš tests/Wpt/upstream/<area>/ į tests/Wpt/fixtures/<category>/, ir vykdyklė ją aptiks.

Taip pat žr.