我很高兴介绍一个新的 JIT 引擎,它将在下一个
主要 PHP 版本中使用。现在它是一个真正的优化编译器,具有
类似于 Java HotSpot 服务器编译器的中间表示。
它为未来的改进奠定了基础,并消除了现有 PHP JIT 的许多低级细节。现在,PHP不支持
不同 CPU 的汇编代码,而是生成单个 IR 并将其传递给
独立于 PHP 的 JIT 引擎。
旧的 JIT 实现将保留一段时间。
此 PR 提供了基于IR(轻量级
JIT 编译框架)的新 JIT 实现。
尽管 PHP 8.* JIT 方法直接从
PHP 字节码生成本机代码,但此实现会生成中间表示 (IR)
并将所有较低级别的任务委托给 IR 框架。JIT 的 IR 就像
编译器的 AST。
新 JIT 实施的主要好处:
- IR 的使用为更好的优化和寄存器
分配提供了可能性(生成的本机代码更高效) - PHP 不必关心大多数底层细节(不同的 CPU、
调用约定、TLS 细节等) - 实现对新目标的支持要容易得多(例如 RISCV)
- IR 框架将与 PHP 分开开发,并且可能接受
其他项目的贡献(新的优化、改进、错误修复)
缺点:
- JIT编译变得更慢(这对于跟踪
JIT来说几乎是看不见的,但是Wordpress的函数JIT编译变得慢了4倍)
IR 框架的必要部分嵌入到 php-src 中。因此,PR 不会引入新的依赖项。
新的 JIT 实现成功通过了所有 CI 工作流程,包括
nightly,但它仍然不成熟,可能会导致失败。
为了降低风险,此补丁不会删除旧的 JIT 实现(与
PHP-8.3 JIT 相同)。通过使用--disable-opcache-jit-ir
进行配置,可以使用旧的 JIT 构建 PHP 。 将来旧的实现应该被删除。
https://github.com/php/php-src/pull/12079
相关博文
基于IR JIT框架的新PHP JIT实现 – PHP-8.4/9 的新 JIT 引擎