Files
hakorune/docs/development/selfhosting/quickstart.md
nyash-codex 4b6b75932c chore(phase152-b): Static method 宣言整理(箱化モジュール化)
- MainDetectionHelper で main() 検出ロジックを箱化
- Legacy "static method main" と Modern "static box Main { main() }" の両パターン対応
- stage1_run_min.hako を modern 形式に統一
- ドキュメント更新(quickstart 等で static box スタイルに統一)
- パーサ新構文追加なし(仕様統一性保持)
- 後方互換性維持(Stage-B ヘルパーで legacy もサポート)
- テスト結果: 全スモーク PASS

Phase 152-B: Static Method 宣言の整理(Stage-3 仕様統一)

実装パターン: 箱化モジュール化(Phase 133/134 継承)

修正ファイル:
- lang/src/compiler/entry/compiler_stageb.hako: MainDetectionHelper (+103 lines)
- lang/src/compiler/entry/compiler.hako: Legacy Stage-A コメント (+3 lines)
- apps/tests/stage1_run_min.hako: Modern syntax に統一 (-1 line)
- docs/development/selfhosting/quickstart.md: サンプルコード更新
- CURRENT_TASK.md: Phase 152-B 完了記録

MainDetectionHelper 設計:
- findMainBody(): Entry point
- tryLegacyPattern(): "static method main" detection
- tryModernPattern(): "static box Main { main() }" detection
- findPattern(): Pattern search helper
- extractBodyFromPosition(): Brace matching extraction

利点:
 明確な責任分離(各パターン検出が独立モジュール)
 テスタビリティ(各メソッド個別テスト可能)
 拡張性(新パターン追加時は新メソッド追加のみ)
 後方互換性(Legacy パターン削除は tryLegacyPattern 削除のみ)

テスト結果:
- stage1_run_min.hako: RC 0
- Selfhost depth-1: RC 0
- 全スモーク: 30/31 PASS (1 timeout は無関係)
2025-12-04 13:54:45 +09:00

2.7 KiB
Raw Blame History

SelfHosting Quickstart (Phase 15 — Resume)

This note shows how to run the Nyash selfhost compiler MVP to emit MIR(JSON v0) and execute it with the current VM line. The flow keeps defaults unchanged and uses small, optin flags for development.

Layout (migrated)

  • Compiler entry (StageB): lang/src/compiler/entry/compiler_stageb.hako
  • Compiler entry (compat, StageA/AOT): lang/src/compiler/entry/compiler.hako
  • Shared helpers live under lang/src/shared/
  • VM/Core live under lang/src/vm/

Run the selfhost compiler

Compile a minimal program (string embedded in the compiler) and print JSON v0:

./target/release/nyash lang/src/compiler/entry/compiler_stageb.hako -- --stage3 --source 'static box Main { main() { return 7 } }'

ENV → child args (透過):

  • NYASH_NY_COMPILER_MIN_JSON=1-- --min-json
  • NYASH_SELFHOST_READ_TMP=1-- --read-tmp (reads tmp/ny_parser_input.ny)
  • NYASH_NY_COMPILER_STAGE3=1-- --stage3 (Stage3 surface enable)
  • NYASH_NY_COMPILER_CHILD_ARGS="..." → passes extra args verbatim

Examples:

NYASH_NY_COMPILER_MIN_JSON=1 ./target/release/nyash lang/src/compiler/entry/compiler_stageb.hako -- --stage3 --source 'static box Main { main() { return 1+2 } }' > /tmp/out.json
NYASH_SELFHOST_READ_TMP=1 ./target/release/nyash lang/src/compiler/entry/compiler_stageb.hako -- --min-json --stage3

Execute MIR(JSON v0)

Use the VM line (Rust) or PyVM harness as needed.

Rust VM (default):

./target/release/nyash --backend vm apps/examples/json_query/main.hako

PyVM reference (when verifying parity):

NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/examples/json_query/main.hako

LLVM harness (llvmlite):

NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --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 a minimal endtoend smoke that tries to emit JSON (besteffort) and verifies VM outputs match with Known rewrite ON/OFF:

tools/selfhost_smoke.sh

It does not modify defaults and is safe to run locally.

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.