
# 上級者向け

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

## ページ

- **[アーキテクチャ](https://phasis.inline0.dev/ja/docs/advanced/architecture)** — ソースが実行されるまでの流れ：lexer → parser → AST → バイトコードコンパイル → ツリーウォーカーへのフォールバックを備えたバイトコードVM。モジュールローダー、realm、realmの境界となる`Phasis\Engine`の役割も説明します。
- **[バイトコードVM](https://phasis.inline0.dev/ja/docs/advanced/bytecode-vm)** — オペコードセット、ディスパッチループ、インラインキャッシュ、JsToPhpソーストランスパイラーの高速経路、関数の形状からcanSkipEnvAllocを判定するヒューリスティック、呼び出しがバイトコード経路とツリーウォーカーのどちらを通るかを説明します。
- **[ベンチマーク](https://phasis.inline0.dev/ja/docs/advanced/benchmarks)** — 現在の`bench/`数値とその見方、ツリーウォーカーでV8の約100倍が定常状態の上限となる理由、差を縮める方法を説明します。
- **[テスト](https://phasis.inline0.dev/ja/docs/advanced/testing)** — オラクルモデルを説明します。変更はすべて、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>/`に置けば、ランナーが自動で検出します。

## 関連項目

- [互換性](https://phasis.inline0.dev/ja/docs/compatibility) — オラクルの出力を測定する方法を説明します。
- [CLIリファレンス](https://phasis.inline0.dev/ja/docs/cli) — `bin/phasis`、`bin/test262`、`bin/wpt`。
