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

4.0 KiB
Raw Blame 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-cfg2CFG優先/材化あり)
  • Timeouts / quiet pipe:
    • NYASH_NY_COMPILER_TIMEOUT_MS=2000default
    • NYASH_JSON_ONLY=1suppress 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.