elephc 把 PHP 静态子集编译成原生二进制,甚至能跑 DOOM
elephc 将 PHP 的一个静态子集直接编译为原生汇编,内部不含 Zend 引擎。该项目开源,使用 Rust 编写,甚至能够运行 DOOM。
开源编译器 elephc 能够把 PHP 的一个静态子集编译为原生可执行文件。生成的二进制无需安装 PHP 运行环境,也不依赖 Zend 引擎即可运行。该项目由 Illegal Studio 的 Vincenzo Petrucci 维护。
工作原理
elephc 会解析 PHP 代码、检查其类型,并生成汇编代码,随后借助原生汇编器与链接器构建可执行文件。它支持 macOS ARM64、Linux ARM64 以及 Linux x86_64。
受支持的代码全部采用提前编译(AOT),不会回退到 PHP 操作码。实验性的 eval() 支持采用独立路径:符合条件的字面量片段可以提前编译,而需要运行时解析的片段,则由一个链接进二进制文件的可选解释器处理。
支持的特性
部分受支持的特性包括:
- 类、接口、trait、枚举、
readonly、Attribute、闭包与生成器 - 命名空间与编译期 Composer 自动加载(PSR-4、PSR-0、classmap 与 files)
- 支持 SQLite、PostgreSQL 与 MySQL/MariaDB 的 PDO
- 图像处理、mbstring、XML、curl 与纤程(Fiber)
--web模式,可构建独立的 HTTP 服务器二进制,并支持$_SESSION- 提供共享库与静态库,并支持在 macOS 主机上生成 iOS ARM64 库目标
上述支持并不代表与 PHP 完全兼容。README 将该编译器描述为实验性项目,并警告使用者会遇到缺陷。
用 PHP 编写的 DOOM 关卡渲染器
该项目的 DOOM 示例 会加载原版游戏的 WAD 数据文件并渲染 E1M1 关卡。可以在地图中四处移动,并具备碰撞检测与光照效果。该演示需要 SDL2 以及一份 DOOM1.WAD 文件;它没有声音,墙面使用纯色而非纹理。
这段 PHP 代码使用了 elephc 特有的语法,包括用于通过 FFI 调用 SDL2 的 extern、用于存储地图几何数据的 buffer<T>,以及用于 WAD 数据结构的 packed class。
能否与现有框架搭配使用
elephc 目前无法编译完整的动态框架。README 提出的方案是让 WordPress、Laravel 或 Symfony 应用继续运行在 PHP 上,而把静态的、性能敏感的模块编译为原生库。其 CLI 已经能够生成库,但 PHP 扩展桥接层仍在路线图中。
另有一个 PHP 编译器项目,可参阅关于 TypePHP 的报道。
快速上手
可以通过其版本管理器 elvm 安装 elephc。首先执行:
curl -fsSL https://get.elephc.dev | sh按照安装程序的提示把 ~/.elvm/bin 加入 PATH,然后开启新的 shell 并安装编译器:
elvm install latest
elvm use latest --global在 macOS 上也可以使用 Homebrew:
brew install illegalstudio/tap/elephc随后即可编译并运行文件:
elephc hello.php
./hello编译与运行需要原生汇编器与链接器:macOS 上为 Xcode Command Line Tools,Linux 上为 as、ld 以及 libc 开发文件。只有在从源码构建编译器时才需要 Rust。
elephc 采用 MIT 许可。源码与安装文档见 GitHub 仓库。其带有注释的代码生成与运行时(runtime)代码,也有助于理解 PHP 代码如何转换为 CPU 指令。