跳转到正文

高级

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

页面

  • 架构 — 源码如何变为可执行内容:词法分析器 → 解析器 → AST → 字节码编译 → 字节码 VM,并在必要时回退到树遍历器。模块加载器、realm,以及 Phasis\Engine 作为 realm 边界所起的作用。
  • 字节码 VM — 操作码集合、分发循环、内联缓存、JsToPhp 源码转译快速路径、函数形态 canSkipEnvAlloc 启发式,以及调用何时走字节码路径、何时走树遍历器。
  • 基准测试 — 当前 bench/ 数据及其解读方法,为什么对于树遍历器,约 100× V8 是稳态上限,以及如何缩小差距。
  • 测试 — 预言机模型。每项变更都会通过三个独立预言机验证: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>/,运行器就会自动发现它。

另请参阅

  • 兼容性 — oracle 输出的测量方式。
  • CLI 参考 — bin/phasis、bin/test262、bin/wpt。