
# 高级

内部实现。如果你要嵌入 Phasis，可以跳过本节。如果你要修改引擎，这里的每一页都至关重要。

## 页面

- **[架构](https://phasis.inline0.dev/zh/docs/advanced/architecture)** — 源码如何变为可执行内容：词法分析器 → 解析器 → AST → 字节码编译 → 字节码 VM，并在必要时回退到树遍历器。模块加载器、realm，以及 `Phasis\Engine` 作为 realm 边界所起的作用。
- **[字节码 VM](https://phasis.inline0.dev/zh/docs/advanced/bytecode-vm)** — 操作码集合、分发循环、内联缓存、JsToPhp 源码转译快速路径、函数形态 canSkipEnvAlloc 启发式，以及调用何时走字节码路径、何时走树遍历器。
- **[基准测试](https://phasis.inline0.dev/zh/docs/advanced/benchmarks)** — 当前 `bench/` 数据及其解读方法，为什么对于树遍历器，约 100× V8 是稳态上限，以及如何缩小差距。
- **[测试](https://phasis.inline0.dev/zh/docs/advanced/testing)** — 预言机模型。每项变更都会通过三个独立预言机验证：Node.js（V8 规范基准事实）、test262，以及热门库的字节相等性测试套件。

## 贡献约定

- **没有充分理由就不要修改核心引擎。** `src/Runtime/`、`src/Bytecode/`、`src/Lexer/`、`src/Parser/`、`src/Regex/` 下的所有内容都处于 test262 关键路径上。修改这些内容却没有相应的 test262 验证，很容易引入回归问题。内置功能（`src/BuiltIn/`）更安全，因为每个内置功能的 test262 子套件都能在本地发现问题。
- **用 trait 组织代码，而不是用类。** 文件超过约 2K 行时，将其拆分到同级目录下的 trait 文件中（`src/BuiltIn/Temporal/`、`src/Runtime/Parts/` 等），不要另建类——这样可保持 `self::` 查找正常，并避免破坏私有方法的 API 表面。
- **推送前在本地运行 `bin/verify-all`。** 它会运行 PHPStan、PHPCS、每个 PHPUnit 套件（unit、oracle、popular、wpt）以及 oracle 回归测试。CI 会在 `src/` 有变更时运行 WPT 和 popular 套件；完整的 test262 矩阵需要手动启动，因此请在本地抽测受影响的 test262 类别。
- **每次新增 Web API 功能，都要添加 WPT fixture。** 将 `.any.js` 从 `tests/Wpt/upstream/<area>/` 放入 `tests/Wpt/fixtures/<category>/`，运行器就会自动发现它。

## 另请参阅

- [兼容性](https://phasis.inline0.dev/zh/docs/compatibility) — oracle 输出的测量方式。
- [CLI 参考](https://phasis.inline0.dev/zh/docs/cli) — `bin/phasis`、`bin/test262`、`bin/wpt`。
