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

100 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.