Chez Phase 3 inc9a: self-contained Chez bootstrap (no Janet in the loop)
Makes the inc8 fixpoint the actual build. host/chez/bootstrap.ss loads a seed
(prelude, image) pair and rebuilds the clojure.core prelude + compiler image from
source via the on-Chez compiler — read/analyze/emit all on Chez, zero Janet.
The seed (host/chez/seed/{prelude,image}.ss) is the checked-in bootstrap
compiler, minted once via the fixpoint (driver/mint-chez-seed* iterates
bootstrap.ss from the Janet-emitted pair to a joint byte-fixpoint). It's a joint
fixpoint: rebuilding from an up-to-date seed reproduces it exactly. So a fresh
checkout + Chez (no Janet) yields a working jolt.
test/chez/bootstrap-test.janet spawns only chez, asserts the rebuilt artifacts
match the seed byte-for-byte and compile+run real cases. Drift (seed sources
changed) fails the test with a re-mint pointer; host/chez/seed/README documents
re-minting.
This commit is contained in:
parent
81e587b2d7
commit
2c74476aed
6 changed files with 1490 additions and 0 deletions
39
host/chez/seed/README.md
Normal file
39
host/chez/seed/README.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
# Chez bootstrap seed
|
||||
|
||||
These two files are the **bootstrap compiler** for jolt-on-Chez — the seed that
|
||||
makes the build self-hosting with no Janet in the loop:
|
||||
|
||||
- `prelude.ss` — the `clojure.core` prelude (all tiers + clojure.string/walk/
|
||||
template/edn/set/pprint) as Scheme `def-var!` forms.
|
||||
- `image.ss` — the compiler image (`jolt.ir` + `jolt.analyzer` +
|
||||
`jolt.backend-scheme`) as Scheme `def-var!` forms.
|
||||
|
||||
Both are **generated**, not hand-written. They are checked in because a fresh
|
||||
checkout must be able to build jolt-on-Chez using only Chez: `host/chez/bootstrap.ss`
|
||||
loads this seed, then rebuilds the prelude + image from the `.clj`/`.ss` sources via
|
||||
the on-Chez compiler (read → analyze → emit, all on Chez). The seed is a **joint
|
||||
byte-fixpoint**: rebuilding from an up-to-date seed reproduces it exactly
|
||||
(`test/chez/bootstrap-test.janet` verifies this).
|
||||
|
||||
Janet was used once, historically, to mint the very first seed (the Janet analyzer/
|
||||
emitter cross-compiled the sources, then the on-Chez compiler iterated to the
|
||||
fixpoint — see `test/chez/fixpoint-test.janet`). After that, Janet is never needed
|
||||
to build or run jolt-on-Chez.
|
||||
|
||||
## Re-minting
|
||||
|
||||
When the seed sources change (the core tiers, the compiler namespaces, the host
|
||||
contract, the reader, `emit-image.ss`), the seed drifts and `bootstrap-test`
|
||||
fails. Re-mint it:
|
||||
|
||||
```janet
|
||||
(import host/chez/driver :as d)
|
||||
(import host/chez/jolt-chez :as jc)
|
||||
(def ctx (d/make-ctx))
|
||||
(d/mint-chez-seed* (jc/ensure-prelude ctx)
|
||||
(d/ensure-compiler-image ctx "/tmp/stage1.ss")
|
||||
"host/chez/seed/prelude.ss"
|
||||
"host/chez/seed/image.ss")
|
||||
```
|
||||
|
||||
Then commit the refreshed `prelude.ss` / `image.ss`.
|
||||
174
host/chez/seed/image.ss
Normal file
174
host/chez/seed/image.ss
Normal file
File diff suppressed because one or more lines are too long
1108
host/chez/seed/prelude.ss
Normal file
1108
host/chez/seed/prelude.ss
Normal file
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue