
Manticore 是由manticorephp/compiler 项目实现的PHP AOT 编译器(Ahead-Of-Time 编译器),全部用纯 PHP 编写,通过 LLVM IR 后端生成 arm64 / x86_64 的独立原生二进制文件。
它支持 PHP 8.5+ 的一个很大子集(类、接口、特性、枚举、匿名类、闭包、管道运算符|>、生成器、FFI 本地库绑定、文件 I/O 等),无 PHP 运行时,仅依赖 libc。编译器自身用 PHP 编写并能自编译成字节完全相同 的 fixpoint(自托管修复点)。
项目官网描述(直接翻译自 README.md 和相关文档):
Manticore 完全自托管的 PHP-to-native AOT 编译器。通过 LLVM IR 将 PHP 8.5+ 的一个大子集编译为独立原生二进制文件(arm64 / x86_64)——无 PHP 运行时,无共享库,仅 libc。编译器用 PHP 编写并将其编译成字节完全相同的 fixpoint。
如果您只了解了黑暗力量的真正力量。 Manticore 是一个概念验证项目,旨在证明创建自托管 PHP 编译器的可行性。通过用 PHP 编写编译器并编译成字节完全相同的 fixpoint,Manticore 展示了构建完全自包含 PHP 运行时环境的潜力。
manticore build manticore.json 从 PHP 源代码重建编译器,gen2 和 gen3 发出字节完全相同的 IR。gc_collect_cycles())。-l<lib> 链接(证明:zlib / crc32)。真实扩展(curl / xml / pdo)基于相同机制。与 Zendphp 解释器(PHP 8.5.3)对比,Apple M1 Pro,-O2,每份程序均经字节校验匹配 Zend。每轮均为数据依赖 + $argc 种子(LLVM 优化器无法折叠)。
计算密集型(原生代码生成优势显著,跳过解释器的每条指令开销):
Benchmark | 工作负载 | php | manticore | Speedup |
|---|---|---|---|---|
oop | 2000 万个多态虚拟 area()(LCG 索引) | 1.11 s | 0.04 s | 28× |
fib | 递归 fib,数据依赖深度 [30,33] | 1.87 s | 0.10 s | 19× |
closures | 200 万个闭包构建 + 调用 | 0.18 s | 0.01 s | 18× |
mathf | 300 万次 sqrt + sin 累加 | 0.15 s | 0.01 s | 14× |
loop | 5000 万次数据依赖累加 | 0.68 s | 0.06 s | 11× |
sieve | Eratosthenes 筛到 200 万 | 0.18 s | 0.02 s | 9× |
array | 30 次构建 + 求和 50 万元素 vec | 0.34 s | 0.08 s | 4× |
strcat | 3000 万次字符串追加 | 0.38 s | 0.12 s | 3× |
算法(计算机语言基准游戏风格——浮点、紧循环、2D 数组):
Benchmark | php | manticore | Speedup |
|---|---|---|---|
spectralnorm | 0.45 s | 0.01 s | 44× |
mandelbrot | 0.26 s | 0.03 s | 9× |
matmul | 0.07 s | 0.01 s | 7× |
dijkstra | 0.14 s | 0.02 s | 7× |
nbody | 0.16 s | 0.04 s | 4× |
库绑定(时间花在 PHP stdlib/prelude 上,收益较小):
Benchmark | 工作负载 | php | manticore | Speedup |
|---|---|---|---|---|
funcarr | array_map / filter / reduce | 0.15 s | 0.02 s | 8× |
wordcount | assoc map 构建 + 迭代 | 0.07 s | 0.01 s | 7× |
strops | strtoupper / str_replace 循环 | 0.08 s | 0.03 s | 2.7× |
sort | sort() 3K ints × 200 | 0.11 s | 0.05 s | 2.2× |
sprintf | sprintf 格式化循环 | 0.09 s | 0.04 s | 2.2× |
explode | explode / implode 循环 | 0.14 s | 0.14 s | 1.0× |
json | json_encode 循环 | 0.12 s | 0.20 s | 0.6× |
# 冷启动:Zend 种子第一个原生编译器(无需二进制) bash bin/compile # → bin/manticore (~2.9 MB 静态二进制) # 之后,编译器自托管重建(Zend 种子仅用于冷启动) bash bin/build # 自托管:bin/manticore 编译 src/ bash bin/build --verify # + fixpoint + 测试套件闸门 # 编译并运行程序 bin/manticore compile path/to/app.php -o app && ./app # 从 stdin 读取 echo '<?php echo "hi\n";' | bin/manticore compile -o /tmp/hi && /tmp/hi命令 | 用途 |
|---|---|
compile-o | PHP 源代码 → 原生二进制(文件参数或 stdin) |
build [manticore.json] | 构建所有清单目标(库 + 应用) |
dump-ast | 解析 → 输出 AST |
dump-mir | 下推 → 输出带类型 MIR |
dump-llvm-mir | 完整 MIR 流水线 → 输出 LLVM IR |
dump-llvm | 同 dump-llvm-mir(AST 后端已移除) |
dump-sig | 输出模块接口 .sig(导出符号表) |
version / help | — |
标志:-o <out>、-O<0|1|2|3|s|z>(clang 优化级别,默认-O2)、--emit-library(编译为独立.o 无@main)、--memory=rc|arena|hybrid。build 还支持--libs-only(仅构建库目标)。
Cargo 风格清单,构建多文件项目、链接预构建库、自重建编译器。完整用户指南:docs/modules.md。
示例(标准库与编译器自身):
{ "libraries": [{ "name": "stdlib", "src": "src/Runtime", "output": "lib/manticore_stdlib.o", "runtime": true }], "applications": [{ "name": "compiler", "src": "src", "output": "bin/manticore", "entry": "src/zzz_entry.php", "stdlib": false }] }stdlib: false(关闭总是开启的 stdlib 运行时)。<output>.o + <output>.o.sig 接口。runtime: true 的标准库库会被自动链接到每个应用。compile /build 程序透明获得(无清单仪式)。可通过"stdlib": false 关闭(仅自托管编译器使用,因为它已嵌入src/Runtime)。#[Library, Symbol] 属性编译为直接 C 调用;声明为清单extensions。完整类型映射与机制:docs/ffi.md。
PHP 源代码 → Lexer (src/Lexer) tokens → Parser (src/Parser) AST (递归下降 + Pratt) → LowerFromAst ─┐ → ConstFold │ → DeadStore │ → InferTypes │ MIR (src/Compile/Mir) — 平面、带类型、类 SSA IR → NarrowReturns │ 唯一后端(AST 后端已移除) → InferEffects │ EmitLlvm 通过 src/Codegen/Llvm 助手构建 IR 文本。 → InferAllocKind │ → ApplyMemoryMode │ → InsertMemoryOps │ (rc retain/release/CoW 插入) → Verify ─┘ → EmitLlvm (src/Compile/Mir/Passes/EmitLlvm*) → LLVM IR 文本 → clang -c IR → 对象 → cc link 静态二进制(仅 libc)完整指南 + 控制方式:docs/memory.md。
gc_collect_cycles() 的程序不支付任何代价)。源代码布局(纯 PHP,每文件一个类/接口/特性/枚举,路径镜像 FQN):
自托管与闸门:
bash tests/aot/run.sh:AOT 套件bash tests/aot/run.sh -k hello:子串过滤bash tools/difftest.sh:与php 差异校验bash tools/selfhost_fixpoint.sh:fixpoint + 自托管套件 + 稳定性