コンテンツへスキップ

上級者向け

内部向けの内容です。Phasisを組み込む場合、このセクションは読み飛ばせます。エンジンを変更する場合は、ここにある各ページが重要です。

ページ

  • アーキテクチャ — ソースが実行されるまでの流れ:lexer → parser → AST → バイトコードコンパイル → ツリーウォーカーへのフォールバックを備えたバイトコードVM。モジュールローダー、realm、realmの境界となるPhasis\Engineの役割も説明します。
  • バイトコードVM — オペコードセット、ディスパッチループ、インラインキャッシュ、JsToPhpソーストランスパイラーの高速経路、関数の形状からcanSkipEnvAllocを判定するヒューリスティック、呼び出しがバイトコード経路とツリーウォーカーのどちらを通るかを説明します。
  • ベンチマーク — 現在のbench/数値とその見方、ツリーウォーカーでV8の約100倍が定常状態の上限となる理由、差を縮める方法を説明します。
  • テスト — オラクルモデルを説明します。変更はすべて、Node.js(V8の仕様上の正解)、test262、人気ライブラリとのバイト単位の一致を確認するテストスイートという3つの独立したオラクルで検証されます。

コントリビューションの規約

  • 強い理由がない限り、コアエンジンに手を加えないでください。 src/Runtime/、src/Bytecode/、src/Lexer/、src/Parser/、src/Regex/以下はすべてtest262の重要な経路です。対応するtest262検証なしに変更すると、リグレッションを招きます。組み込み機能(src/BuiltIn/)は、各機能のtest262サブスイートで局所的に破損を検出できるため、より安全です。
  • 整理にはクラスではなくトレイトを使ってください。 ファイルが約2K行を超えたら、新しいクラスに分割するのではなく、兄弟ディレクトリにあるトレイトファイル(src/BuiltIn/Temporal/、src/Runtime/Parts/など)に分けます。これによりself::の検索が機能し続け、プライベートメソッドのAPIサーフェスを壊さずに済みます。
  • プッシュ前にローカルでbin/verify-allを実行してください。 PHPStan、PHPCS、すべてのPHPUnitスイート(unit、oracle、popular、wpt)とオラクルのリグレッション検証を実行します。CIではsrc/への変更時にWPTとpopularスイートが実行されます。test262の全マトリクスは手動で開始するため、影響するtest262カテゴリをローカルで選んで実行してください。
  • Web APIを追加するたびに、WPTのテスト用フィクスチャを追加してください。 .any.jsをtests/Wpt/upstream/<area>/からtests/Wpt/fixtures/<category>/に置けば、ランナーが自動で検出します。

関連項目