Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

> **Stable line (2026)** — First maintained **stable** release **[v1.0.0](https://github.com/PurHur/php-compiler/releases/tag/v1.0.0)**; **v1.1.0** prep adds M5 fast-path stability, enum/property-hook parity, `preg_match` JIT, `spl_autoload*`, and php-in-PHP JIT helpers. Demo-ready VM + AOT for a **web-capable PHP subset**, reference examples **000–009**, and an experimental **self-host** path. Not full Zend PHP compatibility — see [what’s missing](https://purhur.github.io/php-compiler/docs/pages/missing-implementation.html).

**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **5023** / **5023** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms**
**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **5030** / **5030** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms**

---

Expand All @@ -23,7 +23,7 @@
| **AOT (`phpc build`)** | ✅ For curated subset | Standalone binaries for examples **000–009** and small CGI apps; not arbitrary Composer stacks |
| **JIT (`bin/jit.php`)** | 🚧 Partial | LLVM IR for many constructs; **MCJIT execute** still flaky ([#98](https://github.com/PurHur/php-compiler/issues/98)); EH scripts VM-fallback ([#2114](https://github.com/PurHur/php-compiler/issues/2114)) |
| **Language wave 3** | ✅ Closed batch | **12/12** language + **13/13** stdlib tracker items ([#1380](https://github.com/PurHur/php-compiler/issues/1380)); closures, try/catch, generators (VM), `parent::class`, backed enums (VM), intersection AOT checks |
| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **5023** / **5023**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **5030** / **5030**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |

### What you can rely on today

Expand All @@ -40,7 +40,7 @@ Counts from `php script/bootstrap-spine-count.php` (literal `require_once` in `c
| Milestone | Status | What it means |
|-----------|--------|----------------|
| **M0–M1** | ✅ | `compiler_minimal` + compile-smoke bundles link and run natively |
| **M2** | ✅ **5023** / **5023** | Full Phase A inventory in spine smoke; native link + lint ✅ |
| **M2** | ✅ **5030** / **5030** | Full Phase A inventory in spine smoke; native link + lint ✅ |
| **M3** | ✅ | HelloWorld strict native ✅; inventory argv `bin/compile.php` ✅ |
| **M4** | ✅ | `make bootstrap-loop-probe` full ladder ✅ (gen-1→gen-2→gen-3 + full-revision) |
| **M5** | ✅ | `make north-star5-verify-fast` (daily); `--strict` pre-merge ✅; vendor **3/3** ✅; gen-0 sidecars refreshed |
Expand Down Expand Up @@ -259,7 +259,7 @@ Full matrices (auto-generated): [`docs/capabilities.md`](docs/capabilities.md) (

**Self-host (experimental, not “stable app” scope)**

See [Current implementation status](#current-implementation-status-june-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **5023** / **5023**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) + **`--strict`** pre-merge ✅ ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).
See [Current implementation status](#current-implementation-status-june-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **5030** / **5030**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) + **`--strict`** pre-merge ✅ ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).

**What we do not target in v1.x**

Expand Down
200 changes: 100 additions & 100 deletions docs/bootstrap-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -6981,107 +6981,107 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
- new Variable (line 1026)
- new ObjectEntry (line 1042)
- new DomNodeState (line 1050)
- new Variable (line 1069)
- new Variable (line 1090)
- new ObjectEntry (line 1108)
- new DomNodeState (line 1116)
- new Variable (line 1128)
- new DOMException (line 1145)
- new Variable (line 1149)
- new Variable (line 1155)
- new DOMException (line 1164)
- new Variable (line 1193)
- new DOMException (line 1213)
- new Variable (line 1216)
- new DOMException (line 1235)
- new Variable (line 1267)
- new DOMException (line 1279)
- new DOMException (line 1292)
- new Variable (line 1304)
- new DOMException (line 1370)
- new DOMException (line 1422)
- new DOMException (line 1435)
- new DOMException (line 1458)
- new DOMException (line 1472)
- new DOMException (line 1498)
- new DOMException (line 1553)
- new DOMException (line 1580)
- new Variable (line 1073)
- new Variable (line 1094)
- new ObjectEntry (line 1112)
- new DomNodeState (line 1120)
- new Variable (line 1132)
- new DOMException (line 1149)
- new Variable (line 1153)
- new Variable (line 1159)
- new DOMException (line 1168)
- new Variable (line 1197)
- new DOMException (line 1217)
- new Variable (line 1220)
- new DOMException (line 1239)
- new Variable (line 1271)
- new DOMException (line 1283)
- new DOMException (line 1296)
- new Variable (line 1308)
- new DOMException (line 1374)
- new DOMException (line 1426)
- new DOMException (line 1439)
- new DOMException (line 1462)
- new DOMException (line 1476)
- new DOMException (line 1502)
- new DOMException (line 1557)
- new DOMException (line 1584)
- new DOMException (line 1597)
- new DOMException (line 1588)
- new DOMException (line 1601)
- new DOMException (line 1611)
- new ObjectEntry (line 1982)
- new DomNodeState (line 1987)
- new ObjectEntry (line 2003)
- new DomNodeState (line 2008)
- new ObjectEntry (line 2024)
- new DomNodeState (line 2029)
- new DOMException (line 2068)
- new DOMException (line 2078)
- new DOMException (line 2091)
- new DOMException (line 2110)
- new ObjectEntry (line 2198)
- new DomNodeState (line 2203)
- new Variable (line 2212)
- new ObjectEntry (line 2222)
- new DomNodeState (line 2227)
- new Variable (line 2233)
- new ObjectEntry (line 2913)
- new DomNodeState (line 2915)
- new ObjectEntry (line 3111)
- new DomNodeState (line 3113)
- new ObjectEntry (line 3141)
- new DomNodeState (line 3143)
- new ObjectEntry (line 3272)
- new DomNodeState (line 3277)
- new DOMException (line 3644)
- new DOMException (line 3659)
- new Variable (line 3676)
- new DOMException (line 3690)
- new DOMException (line 3693)
- new DOMException (line 3702)
- new DOMException (line 3729)
- new DOMException (line 3742)
- new DOMException (line 3940)
- new DOMException (line 4137)
- new DOMException (line 4141)
- new DOMException (line 4230)
- new DOMException (line 4234)
- new DOMException (line 4292)
- new DOMException (line 4309)
- new DOMException (line 1605)
- new DOMException (line 1615)
- new ObjectEntry (line 2030)
- new DomNodeState (line 2035)
- new ObjectEntry (line 2051)
- new DomNodeState (line 2056)
- new ObjectEntry (line 2072)
- new DomNodeState (line 2077)
- new DOMException (line 2116)
- new DOMException (line 2126)
- new DOMException (line 2139)
- new DOMException (line 2158)
- new ObjectEntry (line 2246)
- new DomNodeState (line 2251)
- new Variable (line 2260)
- new ObjectEntry (line 2270)
- new DomNodeState (line 2275)
- new Variable (line 2281)
- new ObjectEntry (line 2961)
- new DomNodeState (line 2963)
- new ObjectEntry (line 3159)
- new DomNodeState (line 3161)
- new ObjectEntry (line 3189)
- new DomNodeState (line 3191)
- new ObjectEntry (line 3320)
- new DomNodeState (line 3325)
- new DOMException (line 3692)
- new DOMException (line 3707)
- new Variable (line 3724)
- new DOMException (line 3738)
- new DOMException (line 3741)
- new DOMException (line 3750)
- new DOMException (line 3777)
- new DOMException (line 3790)
- new DOMException (line 3988)
- new DOMException (line 4185)
- new DOMException (line 4189)
- new DOMException (line 4278)
- new DOMException (line 4282)
- new DOMException (line 4340)
- new DOMException (line 4382)
- new DOMException (line 4408)
- new DOMException (line 5080)
- new Variable (line 5108)
- new DOMException (line 5354)
- new DOMException (line 5437)
- new DOMException (line 5479)
- new ObjectEntry (line 5564)
- new DomNodeState (line 5568)
- new Variable (line 5575)
- new ObjectEntry (line 5775)
- new DomNodeState (line 5779)
- new Variable (line 5786)
- new ObjectEntry (line 5806)
- new DomNodeState (line 5809)
- new Variable (line 5817)
- new Variable (line 5965)
- new DOMException (line 6066)
- new DOMException (line 6073)
- new DOMException (line 6080)
- new DOMException (line 6084)
- new DOMException (line 6087)
- new DOMException (line 6096)
- new Variable (line 6934)
- new Variable (line 6947)
- new DOMException (line 7030)
- new DOMException (line 7057)
- new DOMException (line 7088)
- new DOMException (line 7152)
- new DOMException (line 7160)
- new DOMException (line 7169)
- 331 class method(s)
- new DOMException (line 4357)
- new DOMException (line 4388)
- new DOMException (line 4430)
- new DOMException (line 4456)
- new DOMException (line 5128)
- new Variable (line 5156)
- new DOMException (line 5402)
- new DOMException (line 5514)
- new DOMException (line 5556)
- new ObjectEntry (line 5641)
- new DomNodeState (line 5645)
- new Variable (line 5652)
- new ObjectEntry (line 5852)
- new DomNodeState (line 5856)
- new Variable (line 5863)
- new ObjectEntry (line 5883)
- new DomNodeState (line 5886)
- new Variable (line 5894)
- new Variable (line 6042)
- new DOMException (line 6143)
- new DOMException (line 6150)
- new DOMException (line 6157)
- new DOMException (line 6161)
- new DOMException (line 6164)
- new DOMException (line 6173)
- new Variable (line 7011)
- new Variable (line 7024)
- new DOMException (line 7107)
- new DOMException (line 7134)
- new DOMException (line 7165)
- new DOMException (line 7229)
- new DOMException (line 7237)
- new DOMException (line 7246)
- 334 class method(s)
- 2 closure(s)

### `ext/dom/VmDomInstanceInvoke.php`
Expand Down Expand Up @@ -8174,7 +8174,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/iconv/JitIconv.php`

**Warnings** (review for bootstrap subset):
- 5 class method(s)
- 4 class method(s)

### `ext/iconv/JitIconvString.php`

Expand Down Expand Up @@ -8209,7 +8209,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/iconv/iconv.php`

**Warnings** (review for bootstrap subset):
- new ArgumentCountError (line 31)
- new ArgumentCountError (line 30)
- 2 class method(s)
- 1 closure(s)

Expand Down
6 changes: 3 additions & 3 deletions docs/bootstrap-selfhost.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

**Gen-0 without Zend:** `BOOTSTRAP_M5_NO_ZEND=1 make bootstrap-selfhost-link` installs `prelinked/bootstrap-gen0/bin-compile-aot` and links `compiler_minimal` without `php bin/compile.php` ([#3053](https://github.com/PurHur/php-compiler/issues/3053)). **M5 lib spine compile:** `BOOTSTRAP_NO_ZEND_FALLBACK=1 make bootstrap-selfhost-lib-spine-smoke` (default in link script) refuses host `php bin/compile.php` on the spine emit path ([#8716](https://github.com/PurHur/php-compiler/issues/8716)). **Contributor workflow:** [bootstrap-dev-workflow.md](bootstrap-dev-workflow.md) (tiered gen-1+ path, spine checklist, CI).

**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **5023** / **5023** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **3/3** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella).
**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **5030** / **5030** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **3/3** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella).

## Current gates

| Gate | Command | Status |
|------|---------|--------|
| Phase A inventory | `make bootstrap-inventory-check` | ✅ vm.php-path inventory; **0** source blockers; M2 ratio SSOT: `Phase A inventory files` row in `docs/bootstrap-inventory.md` (no ratio-deferred paths — [#2543](https://github.com/PurHur/php-compiler/issues/2543)); `lib/JIT/Builtin/StringPregMatch.php` and `lib/AOT/Linker.php` **included** in spine |
| Spine PHPCfg parse | `php script/bootstrap-spine-php-cfg-parse-check.php` (`--minimal` for M0 bundle) | ✅ no unsupported php-cfg expr/stmt on spine ([#2575](https://github.com/PurHur/php-compiler/issues/2575)); `BOOTSTRAP_SPINE_PHPCFG_PARSE_GATE=1` in `ci-fast.sh` |
| Phase B lib AOT lint | `php bin/compile.php -l lib/*.php` (with `script/php-env.sh`) | ✅ **5023/5023** top-level `lib/*.php` units ([#534](https://github.com/PurHur/php-compiler/pull/534)) |
| Phase B lib AOT lint | `php bin/compile.php -l lib/*.php` (with `script/php-env.sh`) | ✅ **5030/5030** top-level `lib/*.php` units ([#534](https://github.com/PurHur/php-compiler/pull/534)) |
| Phase B fixture lint | `php script/bootstrap-aot-lint.php` | ✅ **13** procedural targets under `test/bootstrap-aot/` + `examples/000-HelloWorld` |
| Phase C native run | `make bootstrap-aot-link` or `./script/bootstrap-aot-link.sh` | ✅ **5023/5023** link targets OK |
| Phase C native run | `make bootstrap-aot-link` or `./script/bootstrap-aot-link.sh` | ✅ **5030/5030** link targets OK |
| Phase D `lib/` link | `make bootstrap-aot-link-lib` or `./script/bootstrap-aot-link-lib.sh` | ✅ `test/bootstrap-aot/lib_opcode/main.php` bundles `lib/OpCode.php` ([#540](https://github.com/PurHur/php-compiler/issues/540)) |
| Bundled `lib/Compiler.php` lint | `./script/bootstrap-selfhost-lint.sh` | ✅ `test/selfhost/compiler_minimal/main.php` + literal `require_once` units toward `bin/vm.php` (no `vendor/`) ([#559](https://github.com/PurHur/php-compiler/issues/559)) |
| Compiler compile smoke lint | `php bin/compile.php -l test/selfhost/compiler_compile_smoke/main.php` | ✅ `compiler_minimal` bundle + literal `require_once` of `test/bootstrap-aot/compiler_smoke.php` (named function CFG) |
Expand Down
Loading
Loading