Files
hakorune/docs/private/roadmap/selfhosting/quickstart.md

100 lines
4.0 KiB
Markdown
Raw Normal View History

# SelfHosting Quickstart (Phase 15 — Resume)
This note shows how to run the hakorune selfhost compiler MVP to emit AST JSON / MIR(JSON v0) and execute it with the current VM line. The flow keeps defaults unchanged and uses small, optin flags for development.
## Layout
- Compiler MVP: `lang/src/compiler/entry/compiler.hako`(移行済。旧パスは互換のみ)
- Runtime helpers (dev): `apps/selfhost-runtime/`
- MiniVM samples (dev): `apps/selfhost/vm/`
## Run the selfhost compilerOfficial runner path
Use the runners selfhost pipeline with parent→child ENV forwarding. Defaults stay unchanged; all flags are optin.
Examples (safe, short, quiet):
```
# Emit minimal AST JSON via pipeline v2 (header must contain {"version", "kind"})
NYASH_DISABLE_PLUGINS=1 \
NYASH_USE_NY_COMPILER=1 \
NYASH_NY_COMPILER_MIN_JSON=1 \
NYASH_NY_COMPILER_CHILD_ARGS="--pipeline-v2" \
NYASH_NY_COMPILER_EMIT_ONLY=1 \
NYASH_NY_COMPILER_SKIP_PY=1 \
NYASH_JSON_ONLY=1 \
timeout 5 ./target/release/hakorune --backend vm apps/examples/string_p0.hako
# Emit minimal MIR(JSON v0) (const→ret)
NYASH_DISABLE_PLUGINS=1 \
NYASH_USE_NY_COMPILER=1 \
NYASH_NY_COMPILER_MIN_JSON=1 \
NYASH_NY_COMPILER_CHILD_ARGS="--emit-mir" \
NYASH_NY_COMPILER_EMIT_ONLY=1 \
NYASH_NY_COMPILER_SKIP_PY=1 \
NYASH_JSON_ONLY=1 \
timeout 5 ./target/release/hakorune --backend vm apps/examples/string_p0.hako
```
Parent→child ENV mappingofficial
- `NYASH_NY_COMPILER_MIN_JSON=1` → child gets `-- --min-json`
- `NYASH_SELFHOST_READ_TMP=1` → child gets `-- --read-tmp` (reads `tmp/ny_parser_input.ny`)
- `NYASH_NY_COMPILER_STAGE3=1` → child gets `-- --stage3`
- `NYASH_NY_COMPILER_CHILD_ARGS="..."` → child gets extra args verbatim
- `NYASH_EMIT_TRACE=1` → child gets `-- --emit-trace` (dev trace: 1行だけ [emit] 出力。最後のJSON行は不変)
- `NYASH_PREFER_CFG=1|NYASH_PREFER_CFG2=1` → child gets `-- --prefer-cfg` or `--prefer-cfg2`CFG優先/材化あり)
- Timeouts / quiet pipe:
- `NYASH_NY_COMPILER_TIMEOUT_MS=2000`default
- `NYASH_JSON_ONLY=1`suppress logs, print JSON only
Direct run (dev only; requires allowing file using):
```
timeout 5 \
NYASH_DISABLE_PLUGINS=1 NYASH_ENABLE_USING=1 NYASH_ALLOW_USING_FILE=1 NYASH_USING_AST=1 NYASH_JSON_ONLY=1 \
./target/release/hakorune --backend vm lang/src/compiler/entry/compiler.hako -- --min-json
# Optional: pipeline v2 (emit-only)
timeout 5 \
NYASH_DISABLE_PLUGINS=1 NYASH_USING=1 NYASH_ALLOW_USING_FILE=1 NYASH_USING_STRATEGY=prelude NYASH_JSON_ONLY=1 \
./target/release/hakorune --backend vm lang/src/compiler/entry/compiler.hako -- --min-json --pipeline-v2
```
## Execute MIR(JSON v0)
Use the VM line (Rust) or PyVM harness as needed.
Rust VM (default):
```
./target/release/hakorune --backend vm apps/examples/json_query/main.hako
```
PyVM reference (when verifying parity):
```
NYASH_VM_USE_PY=1 ./target/release/hakorune --backend vm apps/examples/json_query/main.hako
```
LLVM harness (llvmlite):
```
NYASH_LLVM_USE_HARNESS=1 ./target/release/hakorune --backend llvm apps/examples/json_query/main.hako
```
Notes:
- For selfhost emitted JSON, route the file to your runner pipeline or a small loader script (dev only). Keep defaults unchanged in CI (no new jobs required).
## Oneshot dev smoke
Run quick selfhost checks (JSON header, normalization shapes, VM/LLVM parity when available):
```
tools/smokes/v2/run.sh --profile quick --filter '*selfhost*'
```
Notes on normalization
- Emitter delegates to `JsonProgramBox` which ensures stable shapes for Return/If/Loop/Call/Compare/Logical and always appends `meta.usings`.
## Flags (dev)
- Known rewrite default ON (userbox only, strict guards): `NYASH_REWRITE_KNOWN_DEFAULT=0|1`
- Router trace: `NYASH_ROUTER_TRACE=1`
- KPI sampling: `NYASH_DEBUG_KPI_KNOWN=1` (+ `NYASH_DEBUG_SAMPLE_EVERY=N`)
- Local SSA trace: `NYASH_LOCAL_SSA_TRACE=1`
## Acceptance (P6 resume)
- quick/integration remain green.
- Minimal selfhost emit→execute path PASS in a dev job (no CI change).
- No default behavior changes; all diagnostics under env flags.