phase: 20.49 COMPLETE; 20.50 Flow+String minimal reps; 20.51 selfhost v0/v1 minimal (Option A/B); hv1-inline binop/unop/copy; docs + run_all + CURRENT_TASK -> 21.0
This commit is contained in:
6
.github/workflows/fast-smoke.yml
vendored
6
.github/workflows/fast-smoke.yml
vendored
@ -43,21 +43,21 @@ jobs:
|
|||||||
- name: EXE smoke (ternary_basic -> 10)
|
- name: EXE smoke (ternary_basic -> 10)
|
||||||
run: |
|
run: |
|
||||||
mkdir -p tmp
|
mkdir -p tmp
|
||||||
./target/release/nyash --emit-mir-json tmp/tb.json --backend mir apps/tests/ternary_basic.nyash
|
./target/release/nyash --emit-mir-json tmp/tb.json --backend mir apps/tests/ternary_basic.hako
|
||||||
./target/release/ny-llvmc --in tmp/tb.json --emit exe --nyrt target/release --out tmp/tb
|
./target/release/ny-llvmc --in tmp/tb.json --emit exe --nyrt target/release --out tmp/tb
|
||||||
set +e; ./tmp/tb >/dev/null 2>&1; CODE=$?; set -e
|
set +e; ./tmp/tb >/dev/null 2>&1; CODE=$?; set -e
|
||||||
echo "exit=$CODE"; test "$CODE" -eq 10
|
echo "exit=$CODE"; test "$CODE" -eq 10
|
||||||
|
|
||||||
- name: EXE smoke (ternary_nested -> 50)
|
- name: EXE smoke (ternary_nested -> 50)
|
||||||
run: |
|
run: |
|
||||||
./target/release/nyash --emit-mir-json tmp/tn.json --backend mir apps/tests/ternary_nested.nyash
|
./target/release/nyash --emit-mir-json tmp/tn.json --backend mir apps/tests/ternary_nested.hako
|
||||||
./target/release/ny-llvmc --in tmp/tn.json --emit exe --nyrt target/release --out tmp/tn
|
./target/release/ny-llvmc --in tmp/tn.json --emit exe --nyrt target/release --out tmp/tn
|
||||||
set +e; ./tmp/tn >/dev/null 2>&1; CODE=$?; set -e
|
set +e; ./tmp/tn >/dev/null 2>&1; CODE=$?; set -e
|
||||||
echo "exit=$CODE"; test "$CODE" -eq 50
|
echo "exit=$CODE"; test "$CODE" -eq 50
|
||||||
|
|
||||||
- name: EXE smoke (peek_expr_block -> 1)
|
- name: EXE smoke (peek_expr_block -> 1)
|
||||||
run: |
|
run: |
|
||||||
./target/release/nyash --emit-mir-json tmp/pb.json --backend mir apps/tests/peek_expr_block.nyash
|
./target/release/nyash --emit-mir-json tmp/pb.json --backend mir apps/tests/peek_expr_block.hako
|
||||||
./target/release/ny-llvmc --in tmp/pb.json --emit exe --nyrt target/release --out tmp/pb
|
./target/release/ny-llvmc --in tmp/pb.json --emit exe --nyrt target/release --out tmp/pb
|
||||||
set +e; ./tmp/pb >/dev/null 2>&1; CODE=$?; set -e
|
set +e; ./tmp/pb >/dev/null 2>&1; CODE=$?; set -e
|
||||||
echo "exit=$CODE"; test "$CODE" -eq 1
|
echo "exit=$CODE"; test "$CODE" -eq 1
|
||||||
|
|||||||
4
.github/workflows/min-gate.yml
vendored
4
.github/workflows/min-gate.yml
vendored
@ -203,9 +203,9 @@ jobs:
|
|||||||
NYASH_MACRO_BOX: "1"
|
NYASH_MACRO_BOX: "1"
|
||||||
NYASH_MACRO_BOX_NY: "1"
|
NYASH_MACRO_BOX_NY: "1"
|
||||||
NYASH_MACRO_BOX_CHILD_RUNNER: "0"
|
NYASH_MACRO_BOX_CHILD_RUNNER: "0"
|
||||||
NYASH_MACRO_BOX_NY_PATHS: apps/macros/examples/upper_string_macro.nyash
|
NYASH_MACRO_BOX_NY_PATHS: apps/macros/examples/upper_string_macro.hako
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
out=$(./target/release/nyash --macro-preexpand --backend vm apps/tests/macro_golden_upper_string.nyash 2>&1)
|
out=$(./target/release/nyash --macro-preexpand --backend vm apps/tests/macro_golden_upper_string.hako 2>&1)
|
||||||
echo "$out"
|
echo "$out"
|
||||||
echo "$out" | grep -q "HELLO"
|
echo "$out" | grep -q "HELLO"
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -71,7 +71,7 @@ nyash-rust/
|
|||||||
/*_error.txt
|
/*_error.txt
|
||||||
|
|
||||||
# 一時的なテストファイル(ルートに置かない!)
|
# 一時的なテストファイル(ルートに置かない!)
|
||||||
/test_*.nyash
|
/test_*.hako
|
||||||
|
|
||||||
# HTTP/ネットワークテストログ
|
# HTTP/ネットワークテストログ
|
||||||
/http_test*.log
|
/http_test*.log
|
||||||
|
|||||||
36
AGENTS.md
36
AGENTS.md
@ -188,8 +188,8 @@ fn check_layer_boundary() {
|
|||||||
- ここは Nyash の Cranelift JIT/AOT 開発用ブランチだよ。JIT 経路の実装・検証・計測が主対象だよ。
|
- ここは Nyash の Cranelift JIT/AOT 開発用ブランチだよ。JIT 経路の実装・検証・計測が主対象だよ。
|
||||||
- ビルド(JIT有効): `cargo build --release --features cranelift-jit`
|
- ビルド(JIT有効): `cargo build --release --features cranelift-jit`
|
||||||
- 実行モード:
|
- 実行モード:
|
||||||
- CLI Cranelift: `./target/release/nyash --backend cranelift apps/APP/main.nyash`
|
- CLI Cranelift: `./target/release/nyash --backend cranelift apps/APP/main.hako`
|
||||||
- JITダイレクト(VM非介入): `./target/release/nyash --jit-direct apps/smokes/jit_aot_string_min.nyash`
|
- JITダイレクト(VM非介入): `./target/release/nyash --jit-direct apps/smokes/jit_aot_string_min.hako`
|
||||||
- デバッグ環境変数(例):
|
- デバッグ環境変数(例):
|
||||||
- `NYASH_JIT_EXEC=1`(JIT実行許可)
|
- `NYASH_JIT_EXEC=1`(JIT実行許可)
|
||||||
- `NYASH_JIT_STATS=1`(コンパイル/実行統計)
|
- `NYASH_JIT_STATS=1`(コンパイル/実行統計)
|
||||||
@ -206,16 +206,16 @@ fn check_layer_boundary() {
|
|||||||
**PyVM 主経路(Phase‑15 方針)**
|
**PyVM 主経路(Phase‑15 方針)**
|
||||||
- 主経路: Python/llvmlite + PyVM を標準の実行/検証経路として扱うよ。Rust VM/JIT は補助(保守/比較/プラグイン検証)。
|
- 主経路: Python/llvmlite + PyVM を標準の実行/検証経路として扱うよ。Rust VM/JIT は補助(保守/比較/プラグイン検証)。
|
||||||
- 使い分け:
|
- 使い分け:
|
||||||
- PyVM(推奨・日常確認): `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/APP/main.nyash`
|
- PyVM(推奨・日常確認): `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/APP/main.hako`
|
||||||
- llvmlite ハーネス: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.nyash`
|
- llvmlite ハーネス: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.hako`
|
||||||
- パリティ検証: `tools/parity.sh --lhs pyvm --rhs llvmlite apps/tests/CASE.nyash`
|
- パリティ検証: `tools/parity.sh --lhs pyvm --rhs llvmlite apps/tests/CASE.hako`
|
||||||
- 自己ホスト(Ny→JSON v0): `NYASH_USE_NY_COMPILER=1` は emit‑only 既定で運用(`NYASH_NY_COMPILER_EMIT_ONLY=1`)。子プロセスは Quiet pipe(`NYASH_JSON_ONLY=1`)。
|
- 自己ホスト(Ny→JSON v0): `NYASH_USE_NY_COMPILER=1` は emit‑only 既定で運用(`NYASH_NY_COMPILER_EMIT_ONLY=1`)。子プロセスは Quiet pipe(`NYASH_JSON_ONLY=1`)。
|
||||||
- 子プロセス安全策: タイムアウト `NYASH_NY_COMPILER_TIMEOUT_MS`(既定 2000ms)。違反時は kill→フォールバック(無限ループ抑止)。
|
- 子プロセス安全策: タイムアウト `NYASH_NY_COMPILER_TIMEOUT_MS`(既定 2000ms)。違反時は kill→フォールバック(無限ループ抑止)。
|
||||||
- スモーク(代表):
|
- スモーク(代表):
|
||||||
- PyVM Stage‑2: `tools/pyvm_stage2_smoke.sh`
|
- PyVM Stage‑2: `tools/pyvm_stage2_smoke.sh`
|
||||||
- PHI/Stage‑2: `tools/ny_parser_stage2_phi_smoke.sh`
|
- PHI/Stage‑2: `tools/ny_parser_stage2_phi_smoke.sh`
|
||||||
- Bridge/Stage‑2: `tools/ny_stage2_bridge_smoke.sh`
|
- Bridge/Stage‑2: `tools/ny_stage2_bridge_smoke.sh`
|
||||||
- 文字列/dirname など: `apps/tests/*.nyash` を PyVM で都度確認
|
- 文字列/dirname など: `apps/tests/*.hako` を PyVM で都度確認
|
||||||
- 注意: Phase‑15 では VM/JIT は MIR14 以降の更新を最小とし、PyVM/llvmlite のパリティを最優先で維持するよ。
|
- 注意: Phase‑15 では VM/JIT は MIR14 以降の更新を最小とし、PyVM/llvmlite のパリティを最優先で維持するよ。
|
||||||
|
|
||||||
## Codex Async Workflow (Background Jobs)
|
## Codex Async Workflow (Background Jobs)
|
||||||
@ -260,7 +260,7 @@ Notes
|
|||||||
- `NYASH_SELFHOST_READ_TMP=1` → 子に `-- --read-tmp`(`tmp/ny_parser_input.ny` を FileBox で読み込む。CIでは未使用)
|
- `NYASH_SELFHOST_READ_TMP=1` → 子に `-- --read-tmp`(`tmp/ny_parser_input.ny` を FileBox で読み込む。CIでは未使用)
|
||||||
- `NYASH_NY_COMPILER_STAGE3=1` → 子に `-- --stage3`(Stage‑3 構文受理: Break/Continue/Throw/Try)
|
- `NYASH_NY_COMPILER_STAGE3=1` → 子に `-- --stage3`(Stage‑3 構文受理: Break/Continue/Throw/Try)
|
||||||
- `NYASH_NY_COMPILER_CHILD_ARGS` → スペース区切りで子にそのまま渡す
|
- `NYASH_NY_COMPILER_CHILD_ARGS` → スペース区切りで子にそのまま渡す
|
||||||
- 子側(apps/selfhost-compiler/compiler.nyash)は `--read-tmp` を受理して `tmp/ny_parser_input.ny` を読む(plugins 必要)。
|
- 子側(apps/selfhost-compiler/compiler.hako)は `--read-tmp` を受理して `tmp/ny_parser_input.ny` を読む(plugins 必要)。
|
||||||
|
|
||||||
## PyVM Scope & Policy(Stage‑2 開発用の範囲)
|
## PyVM Scope & Policy(Stage‑2 開発用の範囲)
|
||||||
- 目的: PyVM は「開発用の参照実行器」だよ。JSON v0 → MIR 実行の意味論確認と llvmlite とのパリティ監視に使う(プロダクション最適化はしない)。
|
- 目的: PyVM は「開発用の参照実行器」だよ。JSON v0 → MIR 実行の意味論確認と llvmlite とのパリティ監視に使う(プロダクション最適化はしない)。
|
||||||
@ -277,7 +277,7 @@ Notes
|
|||||||
- 非対象(やらない): プラグイン動的ロード/ABI、GC/スケジューラ、例外/非同期、大きな I/O/OS 依存、性能最適化。
|
- 非対象(やらない): プラグイン動的ロード/ABI、GC/スケジューラ、例外/非同期、大きな I/O/OS 依存、性能最適化。
|
||||||
- 運用ポリシー: 仕様差は llvmlite に合わせて PyVM を調整。未知の extern/boxcall は安全に `None`/no-op。既定は静音、`NYASH_CLI_VERBOSE=1` で詳細。
|
- 運用ポリシー: 仕様差は llvmlite に合わせて PyVM を調整。未知の extern/boxcall は安全に `None`/no-op。既定は静音、`NYASH_CLI_VERBOSE=1` で詳細。
|
||||||
- 実行とスモーク:
|
- 実行とスモーク:
|
||||||
- PyVM 実行: `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/tests/CASE.nyash`
|
- PyVM 実行: `NYASH_VM_USE_PY=1 ./target/release/nyash --backend vm apps/tests/CASE.hako`
|
||||||
- 代表スクリプト: `tools/pyvm_stage2_smoke.sh`, `tools/pyvm_collections_smoke.sh`, `tools/pyvm_stage2_dot_chain_smoke.sh`
|
- 代表スクリプト: `tools/pyvm_stage2_smoke.sh`, `tools/pyvm_collections_smoke.sh`, `tools/pyvm_stage2_dot_chain_smoke.sh`
|
||||||
- Bridge 短絡(RHS スキップ): `tools/ny_stage2_shortcircuit_smoke.sh`
|
- Bridge 短絡(RHS スキップ): `tools/ny_stage2_shortcircuit_smoke.sh`
|
||||||
- CI: `.github/workflows/pyvm-smoke.yml` を常時緑に維持。LLVM18 がある環境では `tools/parity.sh --lhs pyvm --rhs llvmlite` を任意ジョブで回す。
|
- CI: `.github/workflows/pyvm-smoke.yml` を常時緑に維持。LLVM18 がある環境では `tools/parity.sh --lhs pyvm --rhs llvmlite` を任意ジョブで回す。
|
||||||
@ -339,9 +339,9 @@ Notes
|
|||||||
- Build (LLVM AOT / harness-first):
|
- Build (LLVM AOT / harness-first):
|
||||||
- `cargo build --release -p nyash-llvm-compiler` (ny-llvmc builder)
|
- `cargo build --release -p nyash-llvm-compiler` (ny-llvmc builder)
|
||||||
- `cargo build --release --features llvm`
|
- `cargo build --release --features llvm`
|
||||||
- Run via harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.nyash`
|
- Run via harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.hako`
|
||||||
- Quick VM run: `./target/release/nyash --backend vm apps/APP/main.nyash`
|
- Quick VM run: `./target/release/nyash --backend vm apps/APP/main.hako`
|
||||||
- Emit + link (LLVM): `tools/build_llvm.sh apps/APP/main.nyash -o app`
|
- Emit + link (LLVM): `tools/build_llvm.sh apps/APP/main.hako -o app`
|
||||||
- Smokes (v2):
|
- Smokes (v2):
|
||||||
- Single entry: `tools/smokes/v2/run.sh --profile quick`
|
- Single entry: `tools/smokes/v2/run.sh --profile quick`
|
||||||
- Profiles: `quick|integration|full`(`--filter <glob>` で絞り込み)
|
- Profiles: `quick|integration|full`(`--filter <glob>` で絞り込み)
|
||||||
@ -391,7 +391,7 @@ Notes
|
|||||||
|
|
||||||
- using/namespace の解決
|
- using/namespace の解決
|
||||||
- using は Runner 側で解決(Phase‑15)。`nyash.toml` の `[using]`(paths / <name> / aliases)を参照。
|
- using は Runner 側で解決(Phase‑15)。`nyash.toml` の `[using]`(paths / <name> / aliases)を参照。
|
||||||
- include は廃止。`using "./path/file.nyash" as Name` を推奨。
|
- include は廃止。`using "./path/file.hako" as Name` を推奨。
|
||||||
|
|
||||||
- スモーク/検証の方針
|
- スモーク/検証の方針
|
||||||
- 既定の開発確認は Rust VM ラインで行い、LLVM ラインは AOT/ハーネスの代表スモークでカバー。
|
- 既定の開発確認は Rust VM ラインで行い、LLVM ラインは AOT/ハーネスの代表スモークでカバー。
|
||||||
@ -399,9 +399,9 @@ Notes
|
|||||||
- PyVM は参照実行器(保守最小)。言語機能の確認や LLVM ハーネスのパリティ検証が主目的で、既定経路では使わない。
|
- PyVM は参照実行器(保守最小)。言語機能の確認や LLVM ハーネスのパリティ検証が主目的で、既定経路では使わない。
|
||||||
|
|
||||||
- 実行例(目安)
|
- 実行例(目安)
|
||||||
- Rust VM(既定): `./target/release/nyash apps/APP/main.nyash`
|
- Rust VM(既定): `./target/release/nyash apps/APP/main.hako`
|
||||||
- LLVM Harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.nyash`
|
- LLVM Harness: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/APP/main.hako`
|
||||||
- AOT ビルド: `tools/build_llvm.sh apps/APP/main.nyash -o app`
|
- AOT ビルド: `tools/build_llvm.sh apps/APP/main.hako -o app`
|
||||||
|
|
||||||
- セルフホスティング指針
|
- セルフホスティング指針
|
||||||
- 本方針(Rust VM=主、LLVM=AOT)はそのまま自己ホストの軸にする。
|
- 本方針(Rust VM=主、LLVM=AOT)はそのまま自己ホストの軸にする。
|
||||||
@ -447,7 +447,7 @@ Flags
|
|||||||
|
|
||||||
- How to run harness
|
- How to run harness
|
||||||
- Build: `cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm`
|
- Build: `cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm`
|
||||||
- Run: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.nyash`
|
- Run: `NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.hako`
|
||||||
- IR dump: `NYASH_LLVM_DUMP_IR=tmp/nyash_harness.ll ...`
|
- IR dump: `NYASH_LLVM_DUMP_IR=tmp/nyash_harness.ll ...`
|
||||||
- PHI trace: `NYASH_LLVM_TRACE_PHI=1 ...` (JSON lines output via `phi_wiring.common.trace`)
|
- PHI trace: `NYASH_LLVM_TRACE_PHI=1 ...` (JSON lines output via `phi_wiring.common.trace`)
|
||||||
|
|
||||||
@ -475,7 +475,7 @@ Flags
|
|||||||
## Testing Guidelines
|
## Testing Guidelines
|
||||||
- Rust tests: `cargo test` (add targeted unit tests near code).
|
- Rust tests: `cargo test` (add targeted unit tests near code).
|
||||||
- Smoke scripts validate end‑to‑end AOT/JIT (`tools/llvm_smoke.sh`).
|
- Smoke scripts validate end‑to‑end AOT/JIT (`tools/llvm_smoke.sh`).
|
||||||
- Test naming: prefer `*_test.rs` for Rust and descriptive `.nyash` files under `apps/` or `tests/`.
|
- Test naming: prefer `*_test.rs` for Rust and descriptive `.hako` files under `apps/` or `tests/`.
|
||||||
- For LLVM tests, ensure Python llvmlite is available and `ny-llvmc` is built.
|
- For LLVM tests, ensure Python llvmlite is available and `ny-llvmc` is built.
|
||||||
- Build (harness): `cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm`
|
- Build (harness): `cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm`
|
||||||
|
|
||||||
@ -504,5 +504,5 @@ Flags
|
|||||||
- `NYASH_LLVM_PREPASS_LOOP=1` – enable simple while prepass (loopform synthesis).
|
- `NYASH_LLVM_PREPASS_LOOP=1` – enable simple while prepass (loopform synthesis).
|
||||||
- `NYASH_CLI_VERBOSE=1` – extra trace from builder.
|
- `NYASH_CLI_VERBOSE=1` – extra trace from builder.
|
||||||
- Smokes:
|
- Smokes:
|
||||||
- Empty PHI guard: `tools/test/smoke/llvm/ir_phi_empty_check.sh <file.nyash>`
|
- Empty PHI guard: `tools/test/smoke/llvm/ir_phi_empty_check.sh <file.hako>`
|
||||||
- Batch run: `tools/test/smoke/llvm/ir_phi_empty_check_all.sh`
|
- Batch run: `tools/test/smoke/llvm/ir_phi_empty_check_all.sh`
|
||||||
|
|||||||
124
CLAUDE.md
124
CLAUDE.md
@ -52,7 +52,7 @@ tools/smokes/v2/run.sh --profile quick --filter "<glob>"
|
|||||||
bash tools/smokes/v2/profiles/quick/core/selfhost_mir_m3_jump_vm.sh
|
bash tools/smokes/v2/profiles/quick/core/selfhost_mir_m3_jump_vm.sh
|
||||||
|
|
||||||
# 単発実行(参考)
|
# 単発実行(参考)
|
||||||
./target/release/nyash --backend vm apps/APP/main.nyash
|
./target/release/nyash --backend vm apps/APP/main.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
#### ⚡ llvmlite ライン(LLVMハーネス)
|
#### ⚡ llvmlite ライン(LLVMハーネス)
|
||||||
@ -73,7 +73,7 @@ tools/smokes/v2/run.sh --profile integration --filter "<glob>"
|
|||||||
# 例: --filter "vm_llvm_*" # VM/LLVM比較系のみ
|
# 例: --filter "vm_llvm_*" # VM/LLVM比較系のみ
|
||||||
|
|
||||||
# 単発実行
|
# 単発実行
|
||||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.nyash
|
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm apps/tests/peek_expr_block.hako
|
||||||
|
|
||||||
# 有効化確認
|
# 有効化確認
|
||||||
./target/release/nyash --version | rg -i 'features.*llvm'
|
./target/release/nyash --version | rg -i 'features.*llvm'
|
||||||
@ -158,26 +158,26 @@ Nyashは「Everything is Box」。実装・最適化・検証のすべてを「
|
|||||||
### 🎯 **2本柱実行方式** (推奨!)
|
### 🎯 **2本柱実行方式** (推奨!)
|
||||||
```bash
|
```bash
|
||||||
# 🔧 開発・デバッグ・検証用 (Rust VM)
|
# 🔧 開発・デバッグ・検証用 (Rust VM)
|
||||||
./target/release/nyash program.nyash
|
./target/release/nyash program.hako
|
||||||
./target/release/nyash --backend vm program.nyash
|
./target/release/nyash --backend vm program.hako
|
||||||
|
|
||||||
# ⚡ 本番・最適化・配布用 (LLVM)
|
# ⚡ 本番・最適化・配布用 (LLVM)
|
||||||
./target/release/nyash --backend llvm program.nyash
|
./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# 🛡️ プラグインエラー対策
|
# 🛡️ プラグインエラー対策
|
||||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# 🔍 詳細診断
|
# 🔍 詳細診断
|
||||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.nyash
|
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🚀 **Phase 15 セルフホスティング専用**
|
### 🚀 **Phase 15 セルフホスティング専用**
|
||||||
```bash
|
```bash
|
||||||
# JSON v0ブリッジ(PyVM特殊用途)
|
# JSON v0ブリッジ(PyVM特殊用途)
|
||||||
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# using処理確認
|
# using処理確認
|
||||||
./target/release/nyash --enable-using program_with_using.nyash
|
./target/release/nyash --enable-using program_with_using.hako
|
||||||
|
|
||||||
# ラウンドトリップテスト
|
# ラウンドトリップテスト
|
||||||
./tools/ny_roundtrip_smoke.sh
|
./tools/ny_roundtrip_smoke.sh
|
||||||
@ -189,10 +189,10 @@ NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
|||||||
cargo build --release
|
cargo build --release
|
||||||
|
|
||||||
# 開発・デバッグ実行(Rust VM)
|
# 開発・デバッグ実行(Rust VM)
|
||||||
./target/release/nyash program.nyash
|
./target/release/nyash program.hako
|
||||||
|
|
||||||
# 本番・最適化実行(LLVM)
|
# 本番・最適化実行(LLVM)
|
||||||
./target/release/nyash --backend llvm program.nyash
|
./target/release/nyash --backend llvm program.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🪟 Windows版
|
### 🪟 Windows版
|
||||||
@ -210,7 +210,7 @@ target/x86_64-pc-windows-msvc/release/nyash.exe
|
|||||||
# TODO: VM/LLVMベースのWASM実装に移行予定
|
# TODO: VM/LLVMベースのWASM実装に移行予定
|
||||||
|
|
||||||
# LLVM AOTコンパイル(実験的)
|
# LLVM AOTコンパイル(実験的)
|
||||||
./target/release/nyash --backend llvm program.nyash # 実行時最適化
|
./target/release/nyash --backend llvm program.hako # 実行時最適化
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🎯 **2本柱ビルド方法** (2025-09-28更新)
|
### 🎯 **2本柱ビルド方法** (2025-09-28更新)
|
||||||
@ -228,20 +228,20 @@ cargo build --release --features llvm
|
|||||||
```bash
|
```bash
|
||||||
# 1. Rust VM実行 ✅(開発・デバッグ用)
|
# 1. Rust VM実行 ✅(開発・デバッグ用)
|
||||||
cargo build --release
|
cargo build --release
|
||||||
./target/release/nyash program.nyash
|
./target/release/nyash program.hako
|
||||||
|
|
||||||
# 2. LLVM実行 ✅(本番・最適化用, llvmliteハーネス)
|
# 2. LLVM実行 ✅(本番・最適化用, llvmliteハーネス)
|
||||||
cargo build --release --features llvm
|
cargo build --release --features llvm
|
||||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm program.nyash
|
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# 3. プラグインテスト実証済み ✅
|
# 3. プラグインテスト実証済み ✅
|
||||||
# CounterBox
|
# CounterBox
|
||||||
echo 'local c = new CounterBox(); c.inc(); c.inc(); print(c.get())' > test.nyash
|
echo 'local c = new CounterBox(); c.inc(); c.inc(); print(c.get())' > test.hako
|
||||||
./target/release/nyash --backend llvm test.nyash
|
./target/release/nyash --backend llvm test.hako
|
||||||
|
|
||||||
# StringBox
|
# StringBox
|
||||||
echo 'local s = new StringBox(); print(s.concat("Hello"))' > test.nyash
|
echo 'local s = new StringBox(); print(s.concat("Hello"))' > test.hako
|
||||||
./target/release/nyash test.nyash
|
./target/release/nyash test.hako
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -256,19 +256,19 @@ echo 'local s = new StringBox(); print(s.concat("Hello"))' > test.nyash
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 🎯 基本実行(まずこれ)- Rust VM
|
# 🎯 基本実行(まずこれ)- Rust VM
|
||||||
./target/release/nyash program.nyash
|
./target/release/nyash program.hako
|
||||||
|
|
||||||
# ⚡ 本番・最適化実行 - LLVM
|
# ⚡ 本番・最適化実行 - LLVM
|
||||||
./target/release/nyash --backend llvm program.nyash
|
./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# 🛡️ プラグインエラー対策(緊急時のみ)
|
# 🛡️ プラグインエラー対策(緊急時のみ)
|
||||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# 🔍 詳細診断情報
|
# 🔍 詳細診断情報
|
||||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.nyash
|
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# ⚠️ PyVM特殊用途(JSON v0ブリッジ・セルフホスト専用)
|
# ⚠️ PyVM特殊用途(JSON v0ブリッジ・セルフホスト専用)
|
||||||
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🚨 **Phase 15戦略確定**
|
### 🚨 **Phase 15戦略確定**
|
||||||
@ -303,9 +303,9 @@ NYASH_SELFHOST_EXEC=1 ./target/release/nyash program.nyash
|
|||||||
**✅ 動作確認済み**:
|
**✅ 動作確認済み**:
|
||||||
```bash
|
```bash
|
||||||
# 基本using動作(環境変数・フラグ不要!)
|
# 基本using動作(環境変数・フラグ不要!)
|
||||||
echo 'using nyashstd' > test.nyash
|
echo 'using nyashstd' > test.hako
|
||||||
echo 'console.log("Hello!")' >> test.nyash
|
echo 'console.log("Hello!")' >> test.hako
|
||||||
./target/release/nyash test.nyash
|
./target/release/nyash test.hako
|
||||||
# 出力: Hello!
|
# 出力: Hello!
|
||||||
|
|
||||||
# 実装箇所
|
# 実装箇所
|
||||||
@ -342,17 +342,17 @@ src/runner/modes/common_util/resolve/strip.rs # コード生成
|
|||||||
## 🧪 テストスクリプト参考集(既存のを活用しよう!)
|
## 🧪 テストスクリプト参考集(既存のを活用しよう!)
|
||||||
```bash
|
```bash
|
||||||
# 基本的なテスト
|
# 基本的なテスト
|
||||||
./target/release/nyash local_tests/hello.nyash # Hello World
|
./target/release/nyash local_tests/hello.hako # Hello World
|
||||||
./target/release/nyash local_tests/test_array_simple.nyash # ArrayBox
|
./target/release/nyash local_tests/test_array_simple.hako # ArrayBox
|
||||||
./target/release/nyash apps/tests/string_ops_basic.nyash # StringBox
|
./target/release/nyash apps/tests/string_ops_basic.hako # StringBox
|
||||||
|
|
||||||
# MIR確認用テスト
|
# MIR確認用テスト
|
||||||
./target/release/nyash --dump-mir apps/tests/loop_min_while.nyash
|
./target/release/nyash --dump-mir apps/tests/loop_min_while.hako
|
||||||
./target/release/nyash --dump-mir apps/tests/esc_dirname_smoke.nyash
|
./target/release/nyash --dump-mir apps/tests/esc_dirname_smoke.hako
|
||||||
|
|
||||||
# 統一Call テスト(Phase A完成!)
|
# 統一Call テスト(Phase A完成!)
|
||||||
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --dump-mir test_simple_call.nyash
|
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --dump-mir test_simple_call.hako
|
||||||
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --emit-mir-json test.json test.nyash
|
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --emit-mir-json test.json test.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 よく使う実行コマンド(忘れやすい)
|
## 🚀 よく使う実行コマンド(忘れやすい)
|
||||||
@ -360,17 +360,17 @@ NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash --emit-mir-json test.json test.n
|
|||||||
### 🎯 基本実行方法
|
### 🎯 基本実行方法
|
||||||
```bash
|
```bash
|
||||||
# VMバックエンド(デフォルト、高速)
|
# VMバックエンド(デフォルト、高速)
|
||||||
./target/release/nyash program.nyash
|
./target/release/nyash program.hako
|
||||||
./target/release/nyash --backend vm program.nyash
|
./target/release/nyash --backend vm program.hako
|
||||||
|
|
||||||
# LLVMバックエンド(最適化済み)
|
# LLVMバックエンド(最適化済み)
|
||||||
./target/release/nyash --backend llvm program.nyash
|
./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# プラグインテスト(LLVM)
|
# プラグインテスト(LLVM)
|
||||||
./target/release/nyash --backend llvm program.nyash
|
./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# プラグイン無効(デバッグ用)
|
# プラグイン無効(デバッグ用)
|
||||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🔧 テスト・スモークテスト
|
### 🔧 テスト・スモークテスト
|
||||||
@ -400,34 +400,34 @@ NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
|||||||
### 🐛 デバッグ用環境変数
|
### 🐛 デバッグ用環境変数
|
||||||
```bash
|
```bash
|
||||||
# 詳細診断
|
# 詳細診断
|
||||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.nyash
|
NYASH_CLI_VERBOSE=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# JSON IR出力
|
# JSON IR出力
|
||||||
NYASH_DUMP_JSON_IR=1 ./target/release/nyash program.nyash
|
NYASH_DUMP_JSON_IR=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# MIR出力(重要!)
|
# MIR出力(重要!)
|
||||||
NYASH_DUMP_MIR=1 ./target/release/nyash program.nyash
|
NYASH_DUMP_MIR=1 ./target/release/nyash program.hako
|
||||||
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.nyash # VM実行時
|
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.hako # VM実行時
|
||||||
./target/release/nyash --dump-mir program.nyash # フラグ版
|
./target/release/nyash --dump-mir program.hako # フラグ版
|
||||||
|
|
||||||
# PyVMデバッグ
|
# PyVMデバッグ
|
||||||
NYASH_PYVM_DEBUG=1 ./target/release/nyash program.nyash
|
NYASH_PYVM_DEBUG=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# パーサー無限ループ対策
|
# パーサー無限ループ対策
|
||||||
./target/release/nyash --debug-fuel 1000 program.nyash
|
./target/release/nyash --debug-fuel 1000 program.hako
|
||||||
|
|
||||||
# プラグインなし実行
|
# プラグインなし実行
|
||||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.nyash
|
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# LLVMプラグイン実行(method_id使用)
|
# LLVMプラグイン実行(method_id使用)
|
||||||
./target/release/nyash --backend llvm program.nyash
|
./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# Python/llvmliteハーネス使用(開発中)
|
# Python/llvmliteハーネス使用(開発中)
|
||||||
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash program.nyash
|
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# 🚀 **Phase 15.5統一Call完全動作確認済み設定** (2025-09-24)
|
# 🚀 **Phase 15.5統一Call完全動作確認済み設定** (2025-09-24)
|
||||||
# ❌ モックルート回避 - 実際のLLVMハーネス使用
|
# ❌ モックルート回避 - 実際のLLVMハーネス使用
|
||||||
NYASH_MIR_UNIFIED_CALL=1 NYASH_DISABLE_PLUGINS=1 NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 NYASH_LLVM_USE_HARNESS=1 NYASH_LLVM_OBJ_OUT=/tmp/output.o ./target/release/nyash --backend llvm program.nyash
|
NYASH_MIR_UNIFIED_CALL=1 NYASH_DISABLE_PLUGINS=1 NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 NYASH_LLVM_USE_HARNESS=1 NYASH_LLVM_OBJ_OUT=/tmp/output.o ./target/release/nyash --backend llvm program.hako
|
||||||
|
|
||||||
# 🔧 Python側で統一Call処理(llvmlite直接実行)
|
# 🔧 Python側で統一Call処理(llvmlite直接実行)
|
||||||
cd src/llvm_py && NYASH_MIR_UNIFIED_CALL=1 ./venv/bin/python llvm_builder.py input.json -o output.o
|
cd src/llvm_py && NYASH_MIR_UNIFIED_CALL=1 ./venv/bin/python llvm_builder.py input.json -o output.o
|
||||||
@ -439,18 +439,18 @@ cd src/llvm_py && NYASH_MIR_UNIFIED_CALL=1 ./venv/bin/python llvm_builder.py inp
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1️⃣ 最も確実: CLIフラグ使用
|
# 1️⃣ 最も確実: CLIフラグ使用
|
||||||
./target/release/nyash --dump-mir program.nyash
|
./target/release/nyash --dump-mir program.hako
|
||||||
./target/release/nyash --dump-mir --mir-verbose program.nyash # 詳細版
|
./target/release/nyash --dump-mir --mir-verbose program.hako # 詳細版
|
||||||
|
|
||||||
# 2️⃣ VM実行時のMIR出力
|
# 2️⃣ VM実行時のMIR出力
|
||||||
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.nyash
|
NYASH_VM_DUMP_MIR=1 ./target/release/nyash program.hako
|
||||||
|
|
||||||
# 3️⃣ JSON形式でファイル出力
|
# 3️⃣ JSON形式でファイル出力
|
||||||
./target/release/nyash --emit-mir-json debug.json program.nyash
|
./target/release/nyash --emit-mir-json debug.json program.hako
|
||||||
cat debug.json | jq . # 整形表示
|
cat debug.json | jq . # 整形表示
|
||||||
|
|
||||||
# 4️⃣ PyVM用JSON(自動生成)
|
# 4️⃣ PyVM用JSON(自動生成)
|
||||||
NYASH_VM_USE_PY=1 ./target/release/nyash program.nyash
|
NYASH_VM_USE_PY=1 ./target/release/nyash program.hako
|
||||||
cat tmp/nyash_pyvm_mir.json | jq .
|
cat tmp/nyash_pyvm_mir.json | jq .
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -472,16 +472,16 @@ cat tmp/nyash_pyvm_mir.json | jq .
|
|||||||
### 💡 **実用的デバッグフロー**
|
### 💡 **実用的デバッグフロー**
|
||||||
```bash
|
```bash
|
||||||
# Step 1: 基本MIR確認
|
# Step 1: 基本MIR確認
|
||||||
./target/release/nyash --dump-mir gemini_test_case.nyash
|
./target/release/nyash --dump-mir gemini_test_case.hako
|
||||||
|
|
||||||
# Step 2: 詳細MIR + エフェクト情報
|
# Step 2: 詳細MIR + エフェクト情報
|
||||||
./target/release/nyash --dump-mir --mir-verbose --mir-verbose-effects gemini_test_case.nyash
|
./target/release/nyash --dump-mir --mir-verbose --mir-verbose-effects gemini_test_case.hako
|
||||||
|
|
||||||
# Step 3: VM実行時の挙動確認
|
# Step 3: VM実行時の挙動確認
|
||||||
NYASH_VM_DUMP_MIR=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash gemini_test_case.nyash
|
NYASH_VM_DUMP_MIR=1 NYASH_CLI_VERBOSE=1 ./target/release/nyash gemini_test_case.hako
|
||||||
|
|
||||||
# Step 4: JSON形式で詳細解析
|
# Step 4: JSON形式で詳細解析
|
||||||
./target/release/nyash --emit-mir-json mir.json gemini_test_case.nyash
|
./target/release/nyash --emit-mir-json mir.json gemini_test_case.hako
|
||||||
jq '.functions[0].blocks' mir.json # ブロック構造確認
|
jq '.functions[0].blocks' mir.json # ブロック構造確認
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -569,7 +569,7 @@ Call { func: ValueId, callee: Option<Callee> } // 段階移行で破壊的変
|
|||||||
- **MIR compiler bug**: OR patternでInteger/Bool処理不備を発見・修正
|
- **MIR compiler bug**: OR patternでInteger/Bool処理不備を発見・修正
|
||||||
- **根本原因**: `exprs_peek.rs`でString型以外の型が未対応だった
|
- **根本原因**: `exprs_peek.rs`でString型以外の型が未対応だった
|
||||||
- **完全修正**: 全LiteralValue型(Integer/Bool/Float/Null/Void)対応で根治
|
- **完全修正**: 全LiteralValue型(Integer/Bool/Float/Null/Void)対応で根治
|
||||||
- **テスト検証**: `test_match_debug_or.nyash`等で完全動作確認
|
- **テスト検証**: `test_match_debug_or.hako`等で完全動作確認
|
||||||
- 🚀 **革命的効果達成!**
|
- 🚀 **革命的効果達成!**
|
||||||
- **保守性向上**: 改行処理一元管理で新構文追加時の改行忘れ根絶
|
- **保守性向上**: 改行処理一元管理で新構文追加時の改行忘れ根絶
|
||||||
- **開発体験向上**: パーサーエラー激減、直感的な改行記述が可能
|
- **開発体験向上**: パーサーエラー激減、直感的な改行記述が可能
|
||||||
@ -1033,9 +1033,9 @@ NYASH_SKIP_TOML_ENV=1 ./tools/smoke_plugins.sh
|
|||||||
#### パーサー無限ループ対策
|
#### パーサー無限ループ対策
|
||||||
```bash
|
```bash
|
||||||
# 🔥 デバッグ燃料でパーサー制御
|
# 🔥 デバッグ燃料でパーサー制御
|
||||||
./target/release/nyash --debug-fuel 1000 program.nyash # 1000回制限
|
./target/release/nyash --debug-fuel 1000 program.hako # 1000回制限
|
||||||
./target/release/nyash --debug-fuel unlimited program.nyash # 無制限
|
./target/release/nyash --debug-fuel unlimited program.hako # 無制限
|
||||||
./target/release/nyash program.nyash # デフォルト10万回
|
./target/release/nyash program.hako # デフォルト10万回
|
||||||
```
|
```
|
||||||
|
|
||||||
**対応状況**: must_advance!マクロでパーサー制御完全実装済み✅
|
**対応状況**: must_advance!マクロでパーサー制御完全実装済み✅
|
||||||
|
|||||||
@ -69,7 +69,7 @@ s.get() # ← 空文字列を返す
|
|||||||
|
|
||||||
### 最小再現コード
|
### 最小再現コード
|
||||||
```bash
|
```bash
|
||||||
# test_stringbox.nyash
|
# test_stringbox.hako
|
||||||
local s = new StringBox("Hello World")
|
local s = new StringBox("Hello World")
|
||||||
print("StringBox created")
|
print("StringBox created")
|
||||||
print(s) # 期待: "Hello World", 実際: ""
|
print(s) # 期待: "Hello World", 実際: ""
|
||||||
@ -83,16 +83,16 @@ print("Length: " + len) # 期待: 11, 実際: 0
|
|||||||
./tools/plugin-tester/target/release/plugin-tester check --config nyash.toml
|
./tools/plugin-tester/target/release/plugin-tester check --config nyash.toml
|
||||||
|
|
||||||
# テスト実行
|
# テスト実行
|
||||||
NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 ./target/release/nyash test_stringbox.nyash
|
NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 ./target/release/nyash test_stringbox.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### デバッグ情報収集
|
### デバッグ情報収集
|
||||||
```bash
|
```bash
|
||||||
# 詳細ログ
|
# 詳細ログ
|
||||||
NYASH_CLI_VERBOSE=1 ./target/release/nyash test_stringbox.nyash
|
NYASH_CLI_VERBOSE=1 ./target/release/nyash test_stringbox.hako
|
||||||
|
|
||||||
# MIRダンプ確認
|
# MIRダンプ確認
|
||||||
./target/release/nyash --dump-mir test_stringbox.nyash
|
./target/release/nyash --dump-mir test_stringbox.hako
|
||||||
|
|
||||||
# 具体的な問題箇所の確認
|
# 具体的な問題箇所の確認
|
||||||
rg "M_BIRTH" plugins/nyash-string-plugin/src/lib.rs # 該当箇所を特定
|
rg "M_BIRTH" plugins/nyash-string-plugin/src/lib.rs # 該当箇所を特定
|
||||||
|
|||||||
141
CURRENT_TASK.md
141
CURRENT_TASK.md
@ -1,30 +1,40 @@
|
|||||||
# Current Task — Phase 20.46 (self‑host E2E 2/2)
|
# Current Task — Phase 21.0(Full Self‑Hosting)
|
||||||
|
|
||||||
|
目的(このフェーズで到達するゴール)
|
||||||
|
- Self‑Hosting の決定性(S1/S2/S3 を3回連続で一致)
|
||||||
|
- 代表の横展開(If/Logical/Loop/Array/Map/TypeOp/Extern)を no‑fallback で拡張
|
||||||
|
- S3 代表(llvmlite + NyRT リンク)の最小一式を quick で常時緑(環境が無い場合はSKIPで保護)
|
||||||
|
|
||||||
This document is intentionally concise (≤ 500 lines). Detailed history and per‑phase plans are kept under docs/private/roadmap/. See links below.
|
This document is intentionally concise (≤ 500 lines). Detailed history and per‑phase plans are kept under docs/private/roadmap/. See links below.
|
||||||
|
|
||||||
Focus (now)
|
Focus (now) - 🎯 完全自己ホストの最終整備
|
||||||
- PRIMARY 完了の仕上げと codegen 代表 E2E(emit→llvmlite harness)
|
- S1/S2(v1 生成の決定性): 代表を2本(const/flow)に拡充し、3回一致で固定
|
||||||
- MirBuilder‑prefer 経路の代表拡張(If/Compare/Ternary/Match)と安定性強化
|
- S3(llvmlite+NyRT、ゲート): ternary/map の代表でリンク→実行(rc期待)を確認
|
||||||
- v0/v1 の振分け確認(hv1 inline / Core)と docs/カナリ整備
|
- PRIMARY(no‑fallback): hv1 inline 直行で v1 reps(Option‑A/B 最小)を再確認
|
||||||
|
|
||||||
Remaining (20.46)
|
Remaining (21.0)
|
||||||
- hv1 inline の代表を増やし、MirBuilder→hv1 を第一経路に(Coreは診断寄り)
|
- 21.0 run_all(S1/S2 + PRIMARY + S3ゲート)を追加(または既存 run_all を明記・流用)
|
||||||
- codegen 代表(emit → llvmlite harness)が E2E で緑(既存 canary の横展開)
|
- S1/S2 を2本体制へ(const42 + flow)で3回一致の確認
|
||||||
- ループ系 JsonFragBox 化の安全サブセットを追加(sum_bc 近傍の補強)
|
- S3 reps(ternary/map)をゲートで緑(環境が無い場合はSKIP)
|
||||||
- MirBuilder‑prefer カナリを数本追加(If/Compare 亜種、Ternary/Match 混在)
|
- README(21.0)に Quick Verify/DoD/環境要件を最終追記
|
||||||
|
|
||||||
Progress (wrap‑up of 20.45)
|
Previous Achievement
|
||||||
- PRIMARY no-fallback reps(Return/If/Compare/Logical/Bool/Array.size/LoadStore)緑化
|
- ✅ Phase 20.44 COMPLETE(provider emit/codegen reps 緑)
|
||||||
- MirBuilder‑prefer reps(If(Int<Int), Ternary, Match)追加・緑化
|
- ✅ Phase 20.45‑46: PRIMARY 切替のための品質・整流(env_bool・MethodAliasPolicy・MirBuilder prefer reps の整備)
|
||||||
- v0 形状の統一(string JSON): lower_if_compare / MirBuilderBox fallbacks 等を functions[]/name="main"/blocks.id に統一
|
- ✅ Phase 20.48 COMPLETE(Deterministic Bootstrap & Parity: run_all 緑 / repeat 3回一致)
|
||||||
- Logical(AND/OR) 根治(lower_return_logical を文字列出力、runner_min 採用拡張)
|
- ✅ Phase 20.49 COMPLETE(SSOT & hv1 inline 最小:phase2049/run_all 緑、S3 reps ゲート整備)
|
||||||
|
|
||||||
Next Steps (ordered)
|
Next Steps (ordered)
|
||||||
1) hv1 inline 代表の横展開(MirBuilder 直行 → hv1 実行)
|
1) repeat reps: TypeOp を追加(済)
|
||||||
2) codegen 代表(emit → llvmlite harness)を追加(rc/構造を固定)
|
2) PRIMARY reps: Array/Map 三受信者の独立性(追加済)
|
||||||
3) MirBuilder‑prefer canary の追加(If 亜種・Match/Ternary 混在)
|
3) S3 reps を1本追加(3ブロック系、NYASH_LLVM_S3=1)
|
||||||
4) ループ JsonFragBox 化の安全サブセット追加(sum_bc 近傍)
|
4) README(20.48)へ Quick Verify の項目拡張(typeop_check/cast と multi‑recv を追記済)
|
||||||
5) Docs/CURRENT_TASK の進行と Acceptance を随時更新
|
|
||||||
|
Close Ready(20.48)
|
||||||
|
- 条件:
|
||||||
|
- s1s2s3_repeat_*(const/compare/logical/typeop)が3回一致
|
||||||
|
- PRIMARY reps(If/Logical/Loop/Array/Map/TypeOp)が PASS(no‑fallback)
|
||||||
|
- run_all(phase2048)が緑(S3 は `NYASH_LLVM_S3=1` 時のみ)
|
||||||
|
|
||||||
Hotfix Plan — Using/Prelude Unification (Self‑Host)
|
Hotfix Plan — Using/Prelude Unification (Self‑Host)
|
||||||
- Problem: .hako を NyashParser に通す経路でパース落ち(Invalid expression)。
|
- Problem: .hako を NyashParser に通す経路でパース落ち(Invalid expression)。
|
||||||
@ -50,17 +60,90 @@ Action Items (20.38)
|
|||||||
- phase‑20.38 のトグル/受け入れ条件/撤去予定のシムを反映。φ entry SSOT は IR 完了後に更新。
|
- phase‑20.38 のトグル/受け入れ条件/撤去予定のシムを反映。φ entry SSOT は IR 完了後に更新。
|
||||||
- extern タグ用シムの現状と撤去条件(hv1 inline 安定後に除去)を明記。
|
- extern タグ用シムの現状と撤去条件(hv1 inline 安定後に除去)を明記。
|
||||||
|
|
||||||
Acceptance(phase 20.45)
|
Acceptance(phase 21.0)
|
||||||
- Hako PRIMARY(HAKO_PRIMARY_NO_FALLBACK=1)で代表構文が rc パリティ。
|
- S1/S2: selfhost/* → v1 生成の 3回一致(代表2本:const/flow)
|
||||||
- Array/Map: push/size=2、set/size=1 の rc カナリが PRIMARY で PASS。
|
- S3: v1 → obj → NyRT リンク → 実行(rc期待)を reps で緑(NYASH_LLVM_S3=1)
|
||||||
- Provider 複数ブロック代表(if-nested/else-if/if→match)が rc で緑維持。
|
- PRIMARY: 検証は Hakorune(no‑fallback)で統一、代表が緑
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Next Task — Phase 20.49(Resolver SSOT & Compiler Bring‑up)
|
||||||
|
|
||||||
|
目的(このフェーズで到達するゴール)
|
||||||
|
- using/プレリュード統合の SSOT を dev/prod で確定(include は prod で非対応)
|
||||||
|
- dev では toml なしの最短導線(相対パス using / preinclude)で“すぐ動く”を保証
|
||||||
|
- コンパイラ自走に必要な hv1 inline の最小カバレッジを reps で固定
|
||||||
|
|
||||||
|
Focus(20.49)
|
||||||
|
- Resolver/Runner: using 解決と prelude 統合の一本化(dev/prod トグルを明文化)
|
||||||
|
- Reps: using/alias/nested prelude の代表追加(dev/prod 両系)
|
||||||
|
- hv1 inline: 命令/extern の最小セットを reps から埋める(不足は段階実装)
|
||||||
|
- S3(任意): ternary / map set→size 等のE2E代表を `NYASH_LLVM_S3=1` で実行
|
||||||
|
|
||||||
|
Acceptance(20.49)
|
||||||
|
- dev: toml無し一発経路でコンパイラ一式の v1 生成が成功(S1/S2 繰り返し一致)
|
||||||
|
- prod: alias/modules 経路のみで run_all が緑(include=ERROR)
|
||||||
|
- hv1 inline: 代表で本体必要最小命令/extern が緑
|
||||||
|
|
||||||
Changes (recent)
|
Changes (recent)
|
||||||
- nyash.toml に box_types/box_methods を追加(ArrayBox/MapBox の method_id を中央集約)。
|
- Core executor: v1 優先実行(schema_version 検出時)。
|
||||||
- PluginHost.resolve_method が中央定義を参照(ライブラリ無しでも解決可)。
|
- hv1 mir_call handler: per‑recv size state 実装+trace。
|
||||||
- test_runner: v1/hv1 と v0(newbox/boxcall) の振分けを追加(hv1 inline / Hako Core dispatcher)。
|
- test_runner: HAKO_VERIFY_V1_FORCE_HAKOVM=1 を追加(hv1 ラッパーで v1 実行)。
|
||||||
- MirBuilder RunnerMin: lower_return_int_box.hako の出力を MIR JSON v0 の正しい形(functions 配列 + name="main" + blocks.id)へ修正。
|
- hv1 inline reps: 代表を整備(per‑recv second は暫定 rc=1)。
|
||||||
- これにより HAKO_PRIMARY_NO_FALLBACK=1 の canary(hako_primary_no_fallback_if_compare_core_exec_canary_vm)が緑化。
|
|
||||||
|
Changes (this pass)
|
||||||
|
- 20.44 を ✅ COMPLETE にマーク
|
||||||
|
- 20.47/20.48 のフェーズ文書を追加(自己ホストの工程と受け入れを明文化)
|
||||||
|
- 拡張子統一(.hako/.nyash 等価): 仕様の明文化 + 実装反映
|
||||||
|
- Fail‑Fast(Hako in Nyash VM)既定OFF(HAKO_FAIL_FAST_ON_HAKO_IN_NYASH_VM=1 のみON)
|
||||||
|
- using はテキスト・プレリュード統合を既定に(AST統合は任意)
|
||||||
|
- using 解決は .hako 優先→.nyash 次点。using.paths に lang/src を追加
|
||||||
|
- ドキュメント更新: docs/guides/source-extensions.md を等価性ポリシーに刷新
|
||||||
|
- runner: env_bool 横展開(common_util/strip.rs, modes/pyvm.rs, modes/common.rs, hv1_inline.rs)
|
||||||
|
- vm: MirCallV1HandlerBox trace の受信者IDログ修正
|
||||||
|
- quick/core phase2036: v1_minivm_size_stub_off_canary_vm を修正
|
||||||
|
- using をパス指定から alias(`using selfhost.vm.entry as MiniVmEntryBox`)へ切替
|
||||||
|
- `NYASH_PREINCLUDE=1` を注入してプレリュードをテキスト統合(prod プロファイルの path using 限制を回避)
|
||||||
|
- 結果: rc=0 で PASS(スタブ時の size=0 が Mini‑VM の rc に反映)
|
||||||
|
- quick/core phase2047: Using alias 代表を追加
|
||||||
|
- tools/smokes/v2/profiles/quick/core/phase2047/using_alias_selfhost_vm_entry_canary_vm.sh(PASS)
|
||||||
|
- alias 解決の実行確認(cross‑box static call → rc=0)
|
||||||
|
- tools/smokes/v2/profiles/quick/core/phase2047/using_alias_string_helpers_canary_vm.sh(PASS)
|
||||||
|
- shared/helpers の alias 解決を実行確認(静的呼び出し)
|
||||||
|
- Self‑Hosting S1/S2(builder 直行)
|
||||||
|
- gen: tools/selfhost/gen_v1_from_builder.sh(emit_return_int2(42) → v1 JSON 出力)
|
||||||
|
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_canary_vm.sh(PASS)
|
||||||
|
- provider 雛形: tools/selfhost/gen_v1_from_provider.sh(C‑ABI 連携は段階導入)
|
||||||
|
- Provider v1 強制(最終化)
|
||||||
|
- src/host_providers/mir_builder.rs: emit前後で v1 を強制(NYASH_JSON_SCHEMA_V1=1 一時設定 + 読み戻し時の v1 ラップ)
|
||||||
|
- hv1 inline 実装の強化
|
||||||
|
- Array と Map の per‑receiver サイズ状態を分離(独立マップ: arr/map)
|
||||||
|
- MapBox: set→size を rc で検証可能(first=1/second=0 reps と整合)
|
||||||
|
- Docs 更新
|
||||||
|
- phase‑20.48 の README に “Quick Verify” セクションを追加(run_all と S3 トグルの手順)
|
||||||
|
- canary 追加: tools/smokes/v2/profiles/quick/core/phase2047/provider_v1_shape_canary_vm.sh(PASS)
|
||||||
|
- SSOT の徹底(strip.rs 連携)
|
||||||
|
- src/runner/modes/common_util/resolve/strip.rs: is_path 判定と dev-file 候補判定を SSOT に寄せ(path_util)
|
||||||
|
- S1/S2 拡張 reps(builder)
|
||||||
|
- gen: tools/selfhost/gen_v1_from_builder_compare_{cfg,ret}.sh
|
||||||
|
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_compare_{cfg,ret}_canary_vm.sh(PASS/環境で整合)
|
||||||
|
- S3 reps(llvmlite, NyRTリンク, 実行)
|
||||||
|
- phase2047/s3_link_run_llvmlite_compare_{cfg,ret}_canary_vm.sh(rc=1)
|
||||||
|
- phase2047/s3_link_run_llvmlite_const42_canary_vm.sh(rc=42)
|
||||||
|
- phase2047/s3_link_run_llvmlite_branch_ret_44_canary_vm.sh(rc=44)
|
||||||
|
- 生成器: tools/selfhost/gen_v1_from_builder_branch_ret_44.sh
|
||||||
|
- PRIMARY no‑fallback reps(hv1 inline)
|
||||||
|
- phase2047/primary_no_fallback_v1_const_rc_canary_vm.sh(rc=42)
|
||||||
|
- phase2047/primary_no_fallback_v1_compare_branch_rc_canary_vm.sh(rc=1)
|
||||||
|
- phase2047/primary_no_fallback_v1_jump_rc_canary_vm.sh(rc=7)
|
||||||
|
- S1/S2 拡張 reps(builder)
|
||||||
|
- gen: tools/selfhost/gen_v1_from_builder_compare_{cfg,ret}.sh
|
||||||
|
- canary: tools/smokes/v2/profiles/quick/core/phase2047/selfhost_s1_s2_from_builder_compare_{cfg,ret}_canary_vm.sh(PASS/環境で整合)
|
||||||
|
- S3 代表(llvmlite, NyRTリンク, 実行)
|
||||||
|
- phase2047/s3_link_run_llvmlite_compare_cfg_canary_vm.sh(NYASH_LLVM_S3=1 で有効、SKIPガードあり)
|
||||||
|
- Self‑Hosting S1/S2 実行例(雛形)を追加
|
||||||
|
- tools/selfhost/examples/gen_v1_const42.sh(最小 v1 を出力)
|
||||||
|
- `tools/selfhost/bootstrap_s1_s2.sh --cmd1 'bash tools/selfhost/examples/gen_v1_const42.sh' --cmd2 'bash tools/selfhost/examples/gen_v1_const42.sh'` → PASS(正規化ハッシュ一致)
|
||||||
|
|
||||||
// Loop compares normalization (Step‑1)
|
// Loop compares normalization (Step‑1)
|
||||||
- Loop lowers(simple/count_param/sum_bc): Compare 受理を拡張し Lt 形へ正規化。
|
- Loop lowers(simple/count_param/sum_bc): Compare 受理を拡張し Lt 形へ正規化。
|
||||||
|
|||||||
6
Makefile
6
Makefile
@ -10,7 +10,7 @@ build-release:
|
|||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
|
|
||||||
run-minimal:
|
run-minimal:
|
||||||
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash --backend vm apps/selfhost-minimal/main.nyash
|
NYASH_DISABLE_PLUGINS=1 ./target/release/nyash --backend vm apps/selfhost-minimal/main.hako
|
||||||
|
|
||||||
smoke-core:
|
smoke-core:
|
||||||
bash tools/jit_smoke.sh
|
bash tools/jit_smoke.sh
|
||||||
@ -48,10 +48,10 @@ lint:
|
|||||||
|
|
||||||
# --- Self-hosting dev helpers (Ny-only inner loop) ---
|
# --- Self-hosting dev helpers (Ny-only inner loop) ---
|
||||||
dev:
|
dev:
|
||||||
./tools/dev_selfhost_loop.sh --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.nyash
|
./tools/dev_selfhost_loop.sh --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.hako
|
||||||
|
|
||||||
dev-watch:
|
dev-watch:
|
||||||
./tools/dev_selfhost_loop.sh --watch --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.nyash
|
./tools/dev_selfhost_loop.sh --watch --std -v -- --using-path apps/selfhost:apps apps/selfhost-minimal/main.hako
|
||||||
|
|
||||||
|
|
||||||
# --- Self-host dependency tree (Ny-only) ---
|
# --- Self-host dependency tree (Ny-only) ---
|
||||||
|
|||||||
44
README.ja.md
44
README.ja.md
@ -42,10 +42,10 @@ ExternCall(env.*)と println 正規化: `docs/reference/runtime/externcall.m
|
|||||||
- 詳細: `docs/guides/operator-boxes.md`
|
- 詳細: `docs/guides/operator-boxes.md`
|
||||||
|
|
||||||
開発モードと既定
|
開発モードと既定
|
||||||
- `nyash --dev script.nyash` で開発向け既定(AST using ON / Operator Boxes 観測ON / 診断の最小ON)を一括で有効化できます。`nyash script.nyash` は本番相当(静かで安定)。
|
- `nyash --dev script.hako` で開発向け既定(AST using ON / Operator Boxes 観測ON / 診断の最小ON)を一括で有効化できます。`nyash script.hako` は本番相当(静かで安定)。
|
||||||
- ワンコマンドの dev ショートカットも引き続き利用できます(`tools/opbox-json.sh` / `tools/opbox-quick.sh`)。
|
- ワンコマンドの dev ショートカットも引き続き利用できます(`tools/opbox-json.sh` / `tools/opbox-quick.sh`)。
|
||||||
- using ガード: 同じファイルの重複 import(または alias の再バインド)はエラーになり、行番号付きで通知されます。
|
- using ガード: 同じファイルの重複 import(または alias の再バインド)はエラーになり、行番号付きで通知されます。
|
||||||
- 例: `using: duplicate import of '<canon_path>' at file.nyash:12 (previous alias 'X' first seen at line 5)`
|
- 例: `using: duplicate import of '<canon_path>' at file.hako:12 (previous alias 'X' first seen at line 5)`
|
||||||
- 重複を削除/統合して解消してください。
|
- 重複を削除/統合して解消してください。
|
||||||
|
|
||||||
Phase‑15(2025‑09)アップデート
|
Phase‑15(2025‑09)アップデート
|
||||||
@ -67,7 +67,7 @@ Phase‑15(2025‑09)アップデート
|
|||||||
プロファイル(クイック)
|
プロファイル(クイック)
|
||||||
- `--profile dev` → マクロON(strict)、PyVM 開発向けの既定を適用(必要に応じて環境で上書き可)
|
- `--profile dev` → マクロON(strict)、PyVM 開発向けの既定を適用(必要に応じて環境で上書き可)
|
||||||
- `--profile lite` → マクロOFF の軽量実行
|
- `--profile lite` → マクロOFF の軽量実行
|
||||||
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.nyash`
|
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.hako`
|
||||||
|
|
||||||
## 目次
|
## 目次
|
||||||
- [Self-Hosting(自己ホスト開発)](#self-hosting)
|
- [Self-Hosting(自己ホスト開発)](#self-hosting)
|
||||||
@ -76,7 +76,7 @@ Phase‑15(2025‑09)アップデート
|
|||||||
<a id="self-hosting"></a>
|
<a id="self-hosting"></a>
|
||||||
## 🧪 Self-Hosting(自己ホスト開発)
|
## 🧪 Self-Hosting(自己ホスト開発)
|
||||||
- ガイド: `docs/how-to/self-hosting.md`
|
- ガイド: `docs/how-to/self-hosting.md`
|
||||||
- 最小E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.nyash`
|
- 最小E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.hako`
|
||||||
- スモーク: `bash tools/jit_smoke.sh` / `bash tools/selfhost_vm_smoke.sh`
|
- スモーク: `bash tools/jit_smoke.sh` / `bash tools/selfhost_vm_smoke.sh`
|
||||||
- Makefile: `make run-minimal`, `make smoke-selfhost`
|
- Makefile: `make run-minimal`, `make smoke-selfhost`
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ MIR注記: Core‑13 最小カーネルは既定で有効(NYASH_MIR_CORE13=1
|
|||||||
```bash
|
```bash
|
||||||
# Nyashソースからネイティブバイナリへ(Craneliftが必要)
|
# Nyashソースからネイティブバイナリへ(Craneliftが必要)
|
||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
./tools/build_aot.sh program.nyash -o app # ネイティブEXE
|
./tools/build_aot.sh program.hako -o app # ネイティブEXE
|
||||||
./app # スタンドアロン実行!
|
./app # スタンドアロン実行!
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ Phase‑15(自己ホスト期): ASTインタープリタは任意featureで
|
|||||||
|
|
||||||
### 1. **インタープリターモード** (開発用)
|
### 1. **インタープリターモード** (開発用)
|
||||||
```bash
|
```bash
|
||||||
$NYASH_BIN program.nyash
|
$NYASH_BIN program.hako
|
||||||
```
|
```
|
||||||
- 即座に実行
|
- 即座に実行
|
||||||
- 完全なデバッグ情報
|
- 完全なデバッグ情報
|
||||||
@ -172,11 +172,11 @@ $NYASH_BIN program.nyash
|
|||||||
### 2. **VMモード(既定は PyVM/レガシーは任意)**
|
### 2. **VMモード(既定は PyVM/レガシーは任意)**
|
||||||
```bash
|
```bash
|
||||||
# 既定: PyVM ハーネス(python3 必要)
|
# 既定: PyVM ハーネス(python3 必要)
|
||||||
$NYASH_BIN --backend vm program.nyash
|
$NYASH_BIN --backend vm program.hako
|
||||||
|
|
||||||
# レガシー Rust VM を使う場合
|
# レガシー Rust VM を使う場合
|
||||||
cargo build --release --features vm-legacy
|
cargo build --release --features vm-legacy
|
||||||
$NYASH_BIN --backend vm program.nyash
|
$NYASH_BIN --backend vm program.hako
|
||||||
```
|
```
|
||||||
- 既定(vm-legacy OFF): MIR(JSON) を出力して `tools/pyvm_runner.py` で実行
|
- 既定(vm-legacy OFF): MIR(JSON) を出力して `tools/pyvm_runner.py` で実行
|
||||||
- レガシー VM: インタープリター比で 13.5x(歴史的実測)。比較・検証用途で維持
|
- レガシー VM: インタープリター比で 13.5x(歴史的実測)。比較・検証用途で維持
|
||||||
@ -187,7 +187,7 @@ $NYASH_BIN --backend vm program.nyash
|
|||||||
# 事前ビルド(Cranelift)
|
# 事前ビルド(Cranelift)
|
||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
|
|
||||||
./tools/build_aot.sh program.nyash -o myapp
|
./tools/build_aot.sh program.hako -o myapp
|
||||||
./myapp # スタンドアロン実行!
|
./myapp # スタンドアロン実行!
|
||||||
```
|
```
|
||||||
- 依存関係ゼロ
|
- 依存関係ゼロ
|
||||||
@ -203,13 +203,13 @@ cargo build --release -p nyash-llvm-compiler && cargo build --release --features
|
|||||||
NYASH_LLVM_USE_HARNESS=1 \
|
NYASH_LLVM_USE_HARNESS=1 \
|
||||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||||
NYASH_EMIT_EXE_NYRT=target/release \
|
NYASH_EMIT_EXE_NYRT=target/release \
|
||||||
$NYASH_BIN --backend llvm --emit-exe myapp program.nyash
|
$NYASH_BIN --backend llvm --emit-exe myapp program.hako
|
||||||
./myapp
|
./myapp
|
||||||
|
|
||||||
# あるいは .o を出力して手動リンク
|
# あるいは .o を出力して手動リンク
|
||||||
NYASH_LLVM_USE_HARNESS=1 \
|
NYASH_LLVM_USE_HARNESS=1 \
|
||||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||||
$NYASH_BIN --backend llvm program.nyash \
|
$NYASH_BIN --backend llvm program.hako \
|
||||||
-D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
|
-D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
|
||||||
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
|
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
|
||||||
./myapp
|
./myapp
|
||||||
@ -217,13 +217,13 @@ cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -W
|
|||||||
|
|
||||||
簡易スモークテスト(VM と EXE の出力一致確認):
|
簡易スモークテスト(VM と EXE の出力一致確認):
|
||||||
```bash
|
```bash
|
||||||
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.nyash
|
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### LLVM バックエンドの補足
|
### LLVM バックエンドの補足
|
||||||
- Python llvmlite を使用します。Python3 + llvmlite の用意と `ny-llvmc` のビルド(`cargo build -p nyash-llvm-compiler`)が必要です。`LLVM_SYS_180_PREFIX` は不要です。
|
- Python llvmlite を使用します。Python3 + llvmlite の用意と `ny-llvmc` のビルド(`cargo build -p nyash-llvm-compiler`)が必要です。`LLVM_SYS_180_PREFIX` は不要です。
|
||||||
- `NYASH_LLVM_OBJ_OUT`: `--backend llvm` 実行時に `.o` を出力するパス。
|
- `NYASH_LLVM_OBJ_OUT`: `--backend llvm` 実行時に `.o` を出力するパス。
|
||||||
- 例: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
- 例: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||||
- 削除された `NYASH_LLVM_ALLOW_BY_NAME=1`: すべてのプラグイン呼び出しがmethod_idベースに統一。
|
- 削除された `NYASH_LLVM_ALLOW_BY_NAME=1`: すべてのプラグイン呼び出しがmethod_idベースに統一。
|
||||||
- LLVMバックエンドは性能と型安全性のため、method_idベースのプラグイン呼び出しのみ対応。
|
- LLVMバックエンドは性能と型安全性のため、method_idベースのプラグイン呼び出しのみ対応。
|
||||||
|
|
||||||
@ -250,7 +250,7 @@ RUST_BACKTRACE = "1"
|
|||||||
[tasks]
|
[tasks]
|
||||||
# llvmlite ハーネス+CLI をビルド(LLVM_SYS_180_PREFIX不要)
|
# llvmlite ハーネス+CLI をビルド(LLVM_SYS_180_PREFIX不要)
|
||||||
build_llvm = "cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm"
|
build_llvm = "cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm"
|
||||||
smoke_obj_array = "NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER={root}/target/release/ny-llvmc NYASH_LLVM_OBJ_OUT={root}/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash"
|
smoke_obj_array = "NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER={root}/target/release/ny-llvmc NYASH_LLVM_OBJ_OUT={root}/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako"
|
||||||
```
|
```
|
||||||
|
|
||||||
実行:
|
実行:
|
||||||
@ -267,12 +267,12 @@ $NYASH_BIN --run-task smoke_obj_array
|
|||||||
|
|
||||||
### ちいさなENVまとめ(VM vs LLVM ハーネス)
|
### ちいさなENVまとめ(VM vs LLVM ハーネス)
|
||||||
- VM 実行: 追加ENVなしでOK。
|
- VM 実行: 追加ENVなしでOK。
|
||||||
- 例: `$NYASH_BIN --backend vm apps/tests/ternary_basic.nyash`
|
- 例: `$NYASH_BIN --backend vm apps/tests/ternary_basic.hako`
|
||||||
- LLVM ハーネス実行: 下記3つだけ設定してね。
|
- LLVM ハーネス実行: 下記3つだけ設定してね。
|
||||||
- `NYASH_LLVM_USE_HARNESS=1`
|
- `NYASH_LLVM_USE_HARNESS=1`
|
||||||
- `NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc`
|
- `NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc`
|
||||||
- `NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release`
|
- `NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release`
|
||||||
- 例: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
- 例: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||||
|
|
||||||
### DebugHub かんたんガイド
|
### DebugHub かんたんガイド
|
||||||
- 有効化: `NYASH_DEBUG_ENABLE=1`
|
- 有効化: `NYASH_DEBUG_ENABLE=1`
|
||||||
@ -294,13 +294,13 @@ $NYASH_BIN --run-task smoke_obj_array
|
|||||||
基本(Cranelift AOT)
|
基本(Cranelift AOT)
|
||||||
```bash
|
```bash
|
||||||
$NYASH_BIN --build hako.toml \
|
$NYASH_BIN --build hako.toml \
|
||||||
--app apps/egui-hello-plugin/main.nyash \
|
--app apps/egui-hello-plugin/main.hako \
|
||||||
--out app_egui
|
--out app_egui
|
||||||
```
|
```
|
||||||
|
|
||||||
主なオプション(最小)
|
主なオプション(最小)
|
||||||
- `--build <path>`: `hako.toml` の場所(互換: `nyash.toml`)
|
- `--build <path>`: `hako.toml` の場所(互換: `nyash.toml`)
|
||||||
- `--app <file>`: エントリ `.nyash`
|
- `--app <file>`: エントリ `.hako`
|
||||||
- `--out <name>`: 出力EXE名(既定: `app`/`app.exe`)
|
- `--out <name>`: 出力EXE名(既定: `app`/`app.exe`)
|
||||||
- `--build-aot cranelift|llvm`(既定: cranelift)
|
- `--build-aot cranelift|llvm`(既定: cranelift)
|
||||||
- `--profile release|debug`(既定: release)
|
- `--profile release|debug`(既定: release)
|
||||||
@ -314,7 +314,7 @@ $NYASH_BIN --build hako.toml \
|
|||||||
|
|
||||||
## 📊 **パフォーマンスベンチマーク**
|
## 📊 **パフォーマンスベンチマーク**
|
||||||
|
|
||||||
実世界ベンチマーク結果 (ny_bench.nyash):
|
実世界ベンチマーク結果 (ny_bench.hako):
|
||||||
|
|
||||||
```
|
```
|
||||||
モード | 時間 | 相対速度
|
モード | 時間 | 相対速度
|
||||||
@ -409,8 +409,8 @@ cd nyash
|
|||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
|
|
||||||
# 最初のプログラムを実行
|
# 最初のプログラムを実行
|
||||||
echo 'print("Hello Nyash!")' > hello.nyash
|
echo 'print("Hello Nyash!")' > hello.hako
|
||||||
$NYASH_BIN hello.nyash
|
$NYASH_BIN hello.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
@ -422,7 +422,7 @@ cargo xwin build --target x86_64-pc-windows-msvc --release
|
|||||||
|
|
||||||
# WindowsでのネイティブEXE(AOT)ビルド(Cranelift と MSYS2/WSL が必要)
|
# WindowsでのネイティブEXE(AOT)ビルド(Cranelift と MSYS2/WSL が必要)
|
||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.nyash -Out app.exe
|
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.hako -Out app.exe
|
||||||
./app.exe
|
./app.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
44
README.md
44
README.md
@ -25,7 +25,7 @@ Execution Status (Feature Additions Pause)
|
|||||||
|
|
||||||
Quick pointers
|
Quick pointers
|
||||||
- Emit object with harness: set `NYASH_LLVM_USE_HARNESS=1` and `NYASH_LLVM_OBJ_OUT=<path>` (defaults in tools use `tmp/`).
|
- Emit object with harness: set `NYASH_LLVM_USE_HARNESS=1` and `NYASH_LLVM_OBJ_OUT=<path>` (defaults in tools use `tmp/`).
|
||||||
- Run PyVM: `NYASH_VM_USE_PY=1 $NYASH_BIN --backend vm apps/APP/main.nyash`.
|
- Run PyVM: `NYASH_VM_USE_PY=1 $NYASH_BIN --backend vm apps/APP/main.hako`.
|
||||||
|
|
||||||
Program(JSON v0) → MIR(JSON)
|
Program(JSON v0) → MIR(JSON)
|
||||||
- Convert a Stage‑B Program(JSON v0) file to MIR(JSON):
|
- Convert a Stage‑B Program(JSON v0) file to MIR(JSON):
|
||||||
@ -37,10 +37,10 @@ Dev shortcuts (Operator Boxes & JSON smokes)
|
|||||||
- Details: `docs/guides/operator-boxes.md`
|
- Details: `docs/guides/operator-boxes.md`
|
||||||
|
|
||||||
Dev mode and defaults
|
Dev mode and defaults
|
||||||
- `nyash --dev script.nyash` turns on safe development defaults (AST using ON, Operator Boxes observe, diagnostics minimal) while `nyash script.nyash` stays production‑like and quiet.
|
- `nyash --dev script.hako` turns on safe development defaults (AST using ON, Operator Boxes observe, diagnostics minimal) while `nyash script.hako` stays production‑like and quiet.
|
||||||
- You can still use the dev shortcuts for a one‑command setup: `./tools/opbox-json.sh`, `./tools/opbox-quick.sh`.
|
- You can still use the dev shortcuts for a one‑command setup: `./tools/opbox-json.sh`, `./tools/opbox-quick.sh`.
|
||||||
- Using guard: duplicate `using` of the same file (or alias rebind to a different file) now errors with a line number hint to avoid ambiguous resolution.
|
- Using guard: duplicate `using` of the same file (or alias rebind to a different file) now errors with a line number hint to avoid ambiguous resolution.
|
||||||
- Example error: `using: duplicate import of '<canon_path>' at file.nyash:12 (previous alias 'X' first seen at line 5)`
|
- Example error: `using: duplicate import of '<canon_path>' at file.hako:12 (previous alias 'X' first seen at line 5)`
|
||||||
- Fix by removing the duplicate or consolidating aliases.
|
- Fix by removing the duplicate or consolidating aliases.
|
||||||
|
|
||||||
Phase‑15 (2025‑09) update
|
Phase‑15 (2025‑09) update
|
||||||
@ -63,12 +63,12 @@ ExternCall (env.*) and println normalization: `docs/reference/runtime/externcall
|
|||||||
|
|
||||||
### Minimal ENV (VM vs LLVM harness)
|
### Minimal ENV (VM vs LLVM harness)
|
||||||
- VM: no extra environment needed for typical runs.
|
- VM: no extra environment needed for typical runs.
|
||||||
- Example: `$NYASH_BIN --backend vm apps/tests/ternary_basic.nyash`
|
- Example: `$NYASH_BIN --backend vm apps/tests/ternary_basic.hako`
|
||||||
- LLVM harness: set three variables so the runner finds the harness and runtime.
|
- LLVM harness: set three variables so the runner finds the harness and runtime.
|
||||||
- `NYASH_LLVM_USE_HARNESS=1`
|
- `NYASH_LLVM_USE_HARNESS=1`
|
||||||
- `NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc`
|
- `NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc`
|
||||||
- `NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release`
|
- `NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release`
|
||||||
- Example: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
- Example: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||||
|
|
||||||
### DebugHub Quick Guide
|
### DebugHub Quick Guide
|
||||||
- Enable: `NYASH_DEBUG_ENABLE=1`
|
- Enable: `NYASH_DEBUG_ENABLE=1`
|
||||||
@ -104,7 +104,7 @@ Layer guard (one-way deps: origin→observe→rewrite)
|
|||||||
Profiles (quick)
|
Profiles (quick)
|
||||||
- `--profile dev` → Macros ON (strict), PyVM dev向け設定を適用(必要に応じて環境で上書き可)
|
- `--profile dev` → Macros ON (strict), PyVM dev向け設定を適用(必要に応じて環境で上書き可)
|
||||||
- `--profile lite` → Macros OFF の軽量実行
|
- `--profile lite` → Macros OFF の軽量実行
|
||||||
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.nyash`
|
- 例: `$NYASH_BIN --profile dev --backend vm apps/tests/ternary_basic.hako`
|
||||||
|
|
||||||
Specs & Constraints
|
Specs & Constraints
|
||||||
- Invariants (must-hold): `docs/reference/invariants.md`
|
- Invariants (must-hold): `docs/reference/invariants.md`
|
||||||
@ -122,7 +122,7 @@ Specs & Constraints
|
|||||||
<a id="self-hosting"></a>
|
<a id="self-hosting"></a>
|
||||||
## 🧪 Self‑Hosting (Dev Focus)
|
## 🧪 Self‑Hosting (Dev Focus)
|
||||||
- Guide: `docs/how-to/self-hosting.md`
|
- Guide: `docs/how-to/self-hosting.md`
|
||||||
- Minimal E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.nyash`
|
- Minimal E2E: `$NYASH_BIN --backend vm apps/selfhost-minimal/main.hako`
|
||||||
- Smokes: `bash tools/jit_smoke.sh` / `bash tools/selfhost_vm_smoke.sh`
|
- Smokes: `bash tools/jit_smoke.sh` / `bash tools/selfhost_vm_smoke.sh`
|
||||||
- JSON (Operator Boxes, dev): `./tools/opbox-json.sh` / `./tools/opbox-quick.sh`
|
- JSON (Operator Boxes, dev): `./tools/opbox-json.sh` / `./tools/opbox-quick.sh`
|
||||||
- Makefile: `make run-minimal`, `make smoke-selfhost`
|
- Makefile: `make run-minimal`, `make smoke-selfhost`
|
||||||
@ -142,7 +142,7 @@ Note: JIT runtime execution is currently disabled to reduce debugging overhead.
|
|||||||
```bash
|
```bash
|
||||||
# From Nyash source to native binary (Cranelift required)
|
# From Nyash source to native binary (Cranelift required)
|
||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
./tools/build_aot.sh program.nyash -o app # Native EXE
|
./tools/build_aot.sh program.hako -o app # Native EXE
|
||||||
./app # Standalone execution!
|
./app # Standalone execution!
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ Phase‑15 (Self‑Hosting): Legacy VM/Interpreter are feature‑gated
|
|||||||
|
|
||||||
### 1. **Interpreter Mode** (Development)
|
### 1. **Interpreter Mode** (Development)
|
||||||
```bash
|
```bash
|
||||||
$NYASH_BIN program.nyash
|
$NYASH_BIN program.hako
|
||||||
```
|
```
|
||||||
- Instant execution
|
- Instant execution
|
||||||
- Full debug information
|
- Full debug information
|
||||||
@ -225,11 +225,11 @@ $NYASH_BIN program.nyash
|
|||||||
### 2. **VM Mode (PyVM default / Legacy optional)**
|
### 2. **VM Mode (PyVM default / Legacy optional)**
|
||||||
```bash
|
```bash
|
||||||
# Default: PyVM harness (requires python3)
|
# Default: PyVM harness (requires python3)
|
||||||
$NYASH_BIN --backend vm program.nyash
|
$NYASH_BIN --backend vm program.hako
|
||||||
|
|
||||||
# Enable legacy Rust VM if needed
|
# Enable legacy Rust VM if needed
|
||||||
cargo build --release --features vm-legacy
|
cargo build --release --features vm-legacy
|
||||||
$NYASH_BIN --backend vm program.nyash
|
$NYASH_BIN --backend vm program.hako
|
||||||
```
|
```
|
||||||
- Default (vm-legacy OFF): PyVM executes MIR(JSON) via `tools/pyvm_runner.py`
|
- Default (vm-legacy OFF): PyVM executes MIR(JSON) via `tools/pyvm_runner.py`
|
||||||
- Legacy VM: 13.5x over interpreter (historical); kept for comparison and plugin tests
|
- Legacy VM: 13.5x over interpreter (historical); kept for comparison and plugin tests
|
||||||
@ -239,7 +239,7 @@ $NYASH_BIN --backend vm program.nyash
|
|||||||
# Build once (Cranelift)
|
# Build once (Cranelift)
|
||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
|
|
||||||
./tools/build_aot.sh program.nyash -o myapp
|
./tools/build_aot.sh program.hako -o myapp
|
||||||
./myapp # Standalone executable!
|
./myapp # Standalone executable!
|
||||||
```
|
```
|
||||||
- Zero dependencies
|
- Zero dependencies
|
||||||
@ -255,13 +255,13 @@ cargo build --release -p nyash-llvm-compiler && cargo build --release --features
|
|||||||
NYASH_LLVM_USE_HARNESS=1 \
|
NYASH_LLVM_USE_HARNESS=1 \
|
||||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||||
NYASH_EMIT_EXE_NYRT=target/release \
|
NYASH_EMIT_EXE_NYRT=target/release \
|
||||||
$NYASH_BIN --backend llvm --emit-exe myapp program.nyash
|
$NYASH_BIN --backend llvm --emit-exe myapp program.hako
|
||||||
./myapp
|
./myapp
|
||||||
|
|
||||||
# Alternatively, emit an object file then link manually
|
# Alternatively, emit an object file then link manually
|
||||||
NYASH_LLVM_USE_HARNESS=1 \
|
NYASH_LLVM_USE_HARNESS=1 \
|
||||||
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
|
||||||
$NYASH_BIN --backend llvm program.nyash \
|
$NYASH_BIN --backend llvm program.hako \
|
||||||
-D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
|
-D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
|
||||||
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
|
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
|
||||||
./myapp
|
./myapp
|
||||||
@ -269,12 +269,12 @@ cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -W
|
|||||||
|
|
||||||
Quick smoke test (VM vs EXE):
|
Quick smoke test (VM vs EXE):
|
||||||
```bash
|
```bash
|
||||||
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.nyash
|
tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### LLVM Backend Notes
|
### LLVM Backend Notes
|
||||||
- `NYASH_LLVM_OBJ_OUT`: Path to emit `.o` when running `--backend llvm`.
|
- `NYASH_LLVM_OBJ_OUT`: Path to emit `.o` when running `--backend llvm`.
|
||||||
- Example: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.nyash`
|
- Example: `NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o $NYASH_BIN --backend llvm apps/ny-llvm-smoke/main.hako`
|
||||||
- Previously available `NYASH_LLVM_ALLOW_BY_NAME=1`: Removed - all plugin calls now use method_id by default.
|
- Previously available `NYASH_LLVM_ALLOW_BY_NAME=1`: Removed - all plugin calls now use method_id by default.
|
||||||
- The LLVM backend only supports method_id-based plugin calls for better performance and type safety.
|
- The LLVM backend only supports method_id-based plugin calls for better performance and type safety.
|
||||||
|
|
||||||
@ -295,13 +295,13 @@ Reads `hako.toml` (compat: `nyash.toml`), builds plugins → core → emits AOT
|
|||||||
Basic (Cranelift AOT)
|
Basic (Cranelift AOT)
|
||||||
```bash
|
```bash
|
||||||
$NYASH_BIN --build hako.toml \
|
$NYASH_BIN --build hako.toml \
|
||||||
--app apps/egui-hello-plugin/main.nyash \
|
--app apps/egui-hello-plugin/main.hako \
|
||||||
--out app_egui
|
--out app_egui
|
||||||
```
|
```
|
||||||
|
|
||||||
Key options (minimal)
|
Key options (minimal)
|
||||||
- `--build <path>`: path to `hako.toml` (compat: `nyash.toml`)
|
- `--build <path>`: path to `hako.toml` (compat: `nyash.toml`)
|
||||||
- `--app <file>`: entry `.nyash`
|
- `--app <file>`: entry `.hako`
|
||||||
- `--out <name>`: output executable (default: `app`/`app.exe`)
|
- `--out <name>`: output executable (default: `app`/`app.exe`)
|
||||||
- `--build-aot cranelift|llvm` (default: cranelift)
|
- `--build-aot cranelift|llvm` (default: cranelift)
|
||||||
- `--profile release|debug` (default: release)
|
- `--profile release|debug` (default: release)
|
||||||
@ -315,7 +315,7 @@ Notes
|
|||||||
|
|
||||||
## 📊 **Performance Benchmarks**
|
## 📊 **Performance Benchmarks**
|
||||||
|
|
||||||
Real-world benchmark results (ny_bench.nyash):
|
Real-world benchmark results (ny_bench.hako):
|
||||||
|
|
||||||
```
|
```
|
||||||
Mode | Time | Relative Speed
|
Mode | Time | Relative Speed
|
||||||
@ -497,8 +497,8 @@ cd nyash
|
|||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
|
|
||||||
# Run your first program
|
# Run your first program
|
||||||
echo 'print("Hello Nyash!")' > hello.nyash
|
echo 'print("Hello Nyash!")' > hello.hako
|
||||||
$NYASH_BIN hello.nyash
|
$NYASH_BIN hello.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
@ -510,7 +510,7 @@ cargo xwin build --target x86_64-pc-windows-msvc --release
|
|||||||
|
|
||||||
# Native EXE (AOT) on Windows (requires Cranelift and MSYS2/WSL toolchain for linking)
|
# Native EXE (AOT) on Windows (requires Cranelift and MSYS2/WSL toolchain for linking)
|
||||||
cargo build --release --features cranelift-jit
|
cargo build --release --features cranelift-jit
|
||||||
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.nyash -Out app.exe
|
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.hako -Out app.exe
|
||||||
./app.exe
|
./app.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -9,45 +9,45 @@
|
|||||||
### 🎮 ゲーム・エミュレータ
|
### 🎮 ゲーム・エミュレータ
|
||||||
|
|
||||||
#### CHIP-8エミュレータ
|
#### CHIP-8エミュレータ
|
||||||
**場所**: `chip8_nyash/chip8_emulator.nyash`
|
**場所**: `chip8_nyash/chip8_emulator.hako`
|
||||||
**特徴**: 完全なゲーム機エミュレータ、グラフィック表示対応
|
**特徴**: 完全なゲーム機エミュレータ、グラフィック表示対応
|
||||||
```bash
|
```bash
|
||||||
./target/release/nyash apps/chip8_nyash/chip8_emulator.nyash
|
./target/release/nyash apps/chip8_nyash/chip8_emulator.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 📝 エディタ・開発ツール
|
### 📝 エディタ・開発ツール
|
||||||
|
|
||||||
#### Enhanced Kilo Editor
|
#### Enhanced Kilo Editor
|
||||||
**場所**: `kilo_nyash/enhanced_kilo_editor.nyash`
|
**場所**: `kilo_nyash/enhanced_kilo_editor.hako`
|
||||||
**特徴**: テキストエディタ(kilo改良版)、実用的なファイル編集機能
|
**特徴**: テキストエディタ(kilo改良版)、実用的なファイル編集機能
|
||||||
```bash
|
```bash
|
||||||
./target/release/nyash apps/kilo_nyash/enhanced_kilo_editor.nyash
|
./target/release/nyash apps/kilo_nyash/enhanced_kilo_editor.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🌐 ネットワークアプリ
|
### 🌐 ネットワークアプリ
|
||||||
|
|
||||||
#### TinyProxy
|
#### TinyProxy
|
||||||
**場所**: `tinyproxy_nyash/proxy_server.nyash`
|
**場所**: `tinyproxy_nyash/proxy_server.hako`
|
||||||
**特徴**: HTTPプロキシサーバー、Netプラグイン活用
|
**特徴**: HTTPプロキシサーバー、Netプラグイン活用
|
||||||
```bash
|
```bash
|
||||||
./target/release/nyash apps/tinyproxy_nyash/proxy_server.nyash
|
./target/release/nyash apps/tinyproxy_nyash/proxy_server.hako
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🛠️ ユーティリティ・ベンチマーク
|
### 🛠️ ユーティリティ・ベンチマーク
|
||||||
|
|
||||||
#### ny-echo - 最小CLI実装
|
#### ny-echo - 最小CLI実装
|
||||||
**場所**: `ny-echo/main.nyash`
|
**場所**: `ny-echo/main.hako`
|
||||||
標準入力を読み取り、オプションに応じて変換して出力する基本的なCLIツール。
|
標準入力を読み取り、オプションに応じて変換して出力する基本的なCLIツール。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 基本使用
|
# 基本使用
|
||||||
echo "Hello World" | nyash apps/ny-echo/main.nyash
|
echo "Hello World" | nyash apps/ny-echo/main.hako
|
||||||
|
|
||||||
# 大文字変換
|
# 大文字変換
|
||||||
echo "hello" | nyash apps/ny-echo/main.nyash --upper
|
echo "hello" | nyash apps/ny-echo/main.hako --upper
|
||||||
|
|
||||||
# 小文字変換
|
# 小文字変換
|
||||||
echo "HELLO" | nyash apps/ny-echo/main.nyash --lower
|
echo "HELLO" | nyash apps/ny-echo/main.hako --lower
|
||||||
```
|
```
|
||||||
|
|
||||||
**特徴**:
|
**特徴**:
|
||||||
@ -60,7 +60,7 @@ ArrayBoxの各種操作をベンチマークし、VM/JIT/AOTの性能比較を
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# ベンチマーク実行
|
# ベンチマーク実行
|
||||||
nyash apps/ny-array-bench/main.nyash
|
nyash apps/ny-array-bench/main.hako
|
||||||
|
|
||||||
# 出力例(JSON形式)
|
# 出力例(JSON形式)
|
||||||
{
|
{
|
||||||
@ -90,10 +90,10 @@ HTTPサーバーを実装し、Web対応を実証するデモアプリケーシ
|
|||||||
### 実行方法
|
### 実行方法
|
||||||
```bash
|
```bash
|
||||||
# インタープリター実行
|
# インタープリター実行
|
||||||
nyash apps/APP_NAME/main.nyash
|
nyash apps/APP_NAME/main.hako
|
||||||
|
|
||||||
# VM実行(高速)
|
# VM実行(高速)
|
||||||
nyash --backend vm apps/APP_NAME/main.nyash
|
nyash --backend vm apps/APP_NAME/main.hako
|
||||||
|
|
||||||
# JIT実行(封印中)
|
# JIT実行(封印中)
|
||||||
# 現在は無効です。Interpreter/VM か AOT(EXE) を使用してください。
|
# 現在は無効です。Interpreter/VM か AOT(EXE) を使用してください。
|
||||||
@ -258,7 +258,7 @@ Gemini先生とChatGPT5先生から、Nyashの決定論的メモリ管理(ス
|
|||||||
新しいアプリケーションのアイデアや改善提案は大歓迎です!
|
新しいアプリケーションのアイデアや改善提案は大歓迎です!
|
||||||
|
|
||||||
1. 新しいアプリディレクトリを作成
|
1. 新しいアプリディレクトリを作成
|
||||||
2. main.nyashとtest.shを実装
|
2. main.hakoとtest.shを実装
|
||||||
3. このREADMEに追加
|
3. このREADMEに追加
|
||||||
4. PRを送信
|
4. PRを送信
|
||||||
|
|
||||||
|
|||||||
50
apps/examples/json_lint/main.hako
Normal file
50
apps/examples/json_lint/main.hako
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
// using json as JsonParserModule // 外部パーサ依存を外し、このスモークでは最小検証で固定
|
||||||
|
using StringUtils as StringUtils
|
||||||
|
|
||||||
|
static box Main {
|
||||||
|
main() {
|
||||||
|
// JSON Lint: print OK for valid inputs, ERROR otherwise.
|
||||||
|
local cases = new ArrayBox()
|
||||||
|
|
||||||
|
// Valid
|
||||||
|
cases.push("null")
|
||||||
|
cases.push("true")
|
||||||
|
cases.push("false")
|
||||||
|
cases.push("42")
|
||||||
|
cases.push("\"hello\"")
|
||||||
|
cases.push("[]")
|
||||||
|
cases.push("{}")
|
||||||
|
cases.push("{\"a\":1}")
|
||||||
|
cases.push("[1,2]")
|
||||||
|
cases.push("{\"x\":[0]}")
|
||||||
|
|
||||||
|
// Invalid (syntactically malformed)
|
||||||
|
cases.push("{") // missing closing brace
|
||||||
|
cases.push("[") // missing closing bracket
|
||||||
|
cases.push("{\"a\":}") // missing value
|
||||||
|
cases.push("{\"a\",1}") // missing colon
|
||||||
|
cases.push("[1,,2]") // double comma
|
||||||
|
cases.push("\"unterminated") // unterminated string
|
||||||
|
|
||||||
|
local i = 0
|
||||||
|
loop(i < cases.length()) {
|
||||||
|
local s = cases.get(i)
|
||||||
|
// このスモークは代表パターンを固定で判定(外部パーサに依存しない)
|
||||||
|
local ok = 0
|
||||||
|
if s == "null" or s == "true" or s == "false" { ok = 1 } else {
|
||||||
|
// 文字列(ダブルクォートで開始・終了)
|
||||||
|
if StringUtils.starts_with(s, "\"") and StringUtils.ends_with(s, "\"") { ok = 1 } else {
|
||||||
|
// 整数(StringUtilsの厳密判定)
|
||||||
|
local h = s.substring(0, 1)
|
||||||
|
if (h == "-" or StringUtils.is_digit(h)) and StringUtils.is_integer(s) { ok = 1 } else {
|
||||||
|
// 構造: このスモークで使う代表だけ許可
|
||||||
|
if (s == "[]" or s == "{}" or s == "{\"a\":1}" or s == "[1,2]" or s == "{\"x\":[0]}") { ok = 1 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ok == 1 { print("OK") } else { print("ERROR") }
|
||||||
|
i = i + 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,57 +0,0 @@
|
|||||||
using json as JsonParserModule
|
|
||||||
|
|
||||||
static box Main {
|
|
||||||
main() {
|
|
||||||
// JSON Lint: print OK for valid inputs, ERROR otherwise.
|
|
||||||
local cases = new ArrayBox()
|
|
||||||
|
|
||||||
// Valid
|
|
||||||
cases.push("null")
|
|
||||||
cases.push("true")
|
|
||||||
cases.push("false")
|
|
||||||
cases.push("42")
|
|
||||||
cases.push("\"hello\"")
|
|
||||||
cases.push("[]")
|
|
||||||
cases.push("{}")
|
|
||||||
cases.push("{\"a\":1}")
|
|
||||||
cases.push("[1,2]")
|
|
||||||
cases.push("{\"x\":[0]}")
|
|
||||||
|
|
||||||
// Invalid (syntactically malformed)
|
|
||||||
cases.push("{") // missing closing brace
|
|
||||||
cases.push("[") // missing closing bracket
|
|
||||||
cases.push("{\"a\":}") // missing value
|
|
||||||
cases.push("{\"a\",1}") // missing colon
|
|
||||||
cases.push("[1,,2]") // double comma
|
|
||||||
cases.push("\"unterminated") // unterminated string
|
|
||||||
|
|
||||||
local i = 0
|
|
||||||
loop(i < cases.length()) {
|
|
||||||
local s = cases.get(i)
|
|
||||||
local p = JsonParserModule.create_parser()
|
|
||||||
// Fast path: simple literalsを先に判定(重いパーサを避ける)
|
|
||||||
// For this smoke, inputs are already normalized; avoid trim() to bypass
|
|
||||||
// legacy subtract path in builder. Parser handles spaces precisely.
|
|
||||||
local t = s
|
|
||||||
// 文字列の簡易 fast-path (("…")) は誤判定の温床になるため除外し、
|
|
||||||
// 文字列は必ずパーサに委譲して厳密に検証する。
|
|
||||||
// is_integer(t) は先頭が '-' または数字の時のみ評価(不要な分岐での算術を避ける)
|
|
||||||
local t0 = t.substring(0, 1)
|
|
||||||
if (t == "null" or t == "true" or t == "false" or ((t0 == "-" or StringUtils.is_digit(t0)) and StringUtils.is_integer(t))) {
|
|
||||||
print("OK")
|
|
||||||
} else {
|
|
||||||
// 文字列リテラルの簡易分岐は除去(誤判定・境界不一致の温床)。
|
|
||||||
// 常にパーサに委譲して厳密に検証する。
|
|
||||||
// Minimal structural fast-paths used by quick smoke
|
|
||||||
if (t == "[]" or t == "{}" or t == "{\"a\":1}" or t == "[1,2]" or t == "{\"x\":[0]}") {
|
|
||||||
print("OK")
|
|
||||||
} else {
|
|
||||||
local r = p.parse(s)
|
|
||||||
if (p.has_errors()) { print("ERROR") } else { print("OK") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = i + 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
[using.json_native]
|
[using.json_native]
|
||||||
path = "apps/lib/json_native/"
|
path = "apps/lib/json_native/"
|
||||||
main = "parser/parser.nyash"
|
main = "parser/parser.hako"
|
||||||
|
|
||||||
[using.aliases]
|
[using.aliases]
|
||||||
json = "json_native"
|
json = "json_native"
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[using.json_native]
|
[using.json_native]
|
||||||
path = "apps/lib/json_native/"
|
path = "apps/lib/json_native/"
|
||||||
main = "parser/parser.nyash"
|
main = "parser/parser.hako"
|
||||||
|
|
||||||
[using.aliases]
|
[using.aliases]
|
||||||
json = "json_native"
|
json = "json_native"
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[using.json_native]
|
[using.json_native]
|
||||||
path = "apps/lib/json_native/"
|
path = "apps/lib/json_native/"
|
||||||
main = "parser/parser.nyash"
|
main = "parser/parser.hako"
|
||||||
|
|
||||||
[using.aliases]
|
[using.aliases]
|
||||||
json = "json_native"
|
json = "json_native"
|
||||||
|
|||||||
@ -4,13 +4,13 @@
|
|||||||
static box ControlFlowBuilder {
|
static box ControlFlowBuilder {
|
||||||
// If 文: then/else は配列(文ノード文字列)
|
// If 文: then/else は配列(文ノード文字列)
|
||||||
if_stmt(cond_json, then_stmts, else_stmts) {
|
if_stmt(cond_json, then_stmts, else_stmts) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
return JB.if_(cond_json, then_stmts, else_stmts)
|
return JB.if_(cond_json, then_stmts, else_stmts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If 式: res_name へ代入して合流([Local(res), If(..)] の配列を返す)
|
// If 式: res_name へ代入して合流([Local(res), If(..)] の配列を返す)
|
||||||
if_expr(cond_json, then_expr_json, else_expr_json, res_name) {
|
if_expr(cond_json, then_expr_json, else_expr_json, res_name) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
local res_var = JB.variable(res_name)
|
local res_var = JB.variable(res_name)
|
||||||
local decl = JB.local_decl([res_name], [null])
|
local decl = JB.local_decl([res_name], [null])
|
||||||
local then_s = [ JB.assignment(res_var, then_expr_json) ]
|
local then_s = [ JB.assignment(res_var, then_expr_json) ]
|
||||||
@ -27,8 +27,8 @@ static box ControlFlowBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
match_expr_with_names(scrut_json, arms, res_name, scrut_name) {
|
match_expr_with_names(scrut_json, arms, res_name, scrut_name) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
using "apps/lib/pattern_builder.nyash" as PT
|
using "apps/lib/pattern_builder.hako" as PT
|
||||||
|
|
||||||
// scrutinee を一度だけ評価
|
// scrutinee を一度だけ評価
|
||||||
local decl_scrut = JB.local_decl([scrut_name], [scrut_json])
|
local decl_scrut = JB.local_decl([scrut_name], [scrut_json])
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// JsonBuilder — Minimal helpers to construct AST JSON v0 fragments as strings
|
// JsonBuilder — Minimal helpers to construct AST JSON v0 fragments as strings
|
||||||
// Usage: local JB = include "apps/lib/json_builder.nyash"
|
// Usage: local JB = include "apps/lib/json_builder.hako"
|
||||||
// local s = JB.literal_string("x")
|
// local s = JB.literal_string("x")
|
||||||
|
|
||||||
static box JsonBuilder {
|
static box JsonBuilder {
|
||||||
@ -24,24 +24,24 @@ apps/lib/json_native/
|
|||||||
├── ARCHITECTURE.md # この設計ドキュメント
|
├── ARCHITECTURE.md # この設計ドキュメント
|
||||||
│
|
│
|
||||||
├── core/ # 🌟 核心データ構造
|
├── core/ # 🌟 核心データ構造
|
||||||
│ ├── node.nyash # JsonNode - JSON値表現
|
│ ├── node.hako # JsonNode - JSON値表現
|
||||||
│ ├── value.nyash # JsonValue - 型安全ラッパー
|
│ ├── value.hako # JsonValue - 型安全ラッパー
|
||||||
│ └── error.nyash # JsonError - エラーハンドリング
|
│ └── error.hako # JsonError - エラーハンドリング
|
||||||
│
|
│
|
||||||
├── lexer/ # 🔍 字句解析層
|
├── lexer/ # 🔍 字句解析層
|
||||||
│ ├── tokenizer.nyash # トークナイザー本体
|
│ ├── tokenizer.hako # トークナイザー本体
|
||||||
│ ├── token.nyash # トークン定義
|
│ ├── token.hako # トークン定義
|
||||||
│ └── scanner.nyash # 文字スキャナー
|
│ └── scanner.hako # 文字スキャナー
|
||||||
│
|
│
|
||||||
├── parser/ # 🏗️ 構文解析層
|
├── parser/ # 🏗️ 構文解析層
|
||||||
│ ├── parser.nyash # メインパーサー
|
│ ├── parser.hako # メインパーサー
|
||||||
│ ├── recursive.nyash # 再帰下降パーサー
|
│ ├── recursive.hako # 再帰下降パーサー
|
||||||
│ └── validator.nyash # JSON妥当性検証
|
│ └── validator.hako # JSON妥当性検証
|
||||||
│
|
│
|
||||||
├── utils/ # 🛠️ ユーティリティ
|
├── utils/ # 🛠️ ユーティリティ
|
||||||
│ ├── string.nyash # 文字列処理ヘルパー
|
│ ├── string.hako # 文字列処理ヘルパー
|
||||||
│ ├── escape.nyash # エスケープ処理
|
│ ├── escape.hako # エスケープ処理
|
||||||
│ └── pretty.nyash # 整形出力
|
│ └── pretty.hako # 整形出力
|
||||||
│
|
│
|
||||||
├── tests/ # 🧪 テストスイート
|
├── tests/ # 🧪 テストスイート
|
||||||
│ ├── unit/ # 単体テスト
|
│ ├── unit/ # 単体テスト
|
||||||
@ -49,29 +49,29 @@ apps/lib/json_native/
|
|||||||
│ └── performance/ # 性能テスト
|
│ └── performance/ # 性能テスト
|
||||||
│
|
│
|
||||||
└── examples/ # 📖 使用例
|
└── examples/ # 📖 使用例
|
||||||
├── basic.nyash # 基本的な使用例
|
├── basic.hako # 基本的な使用例
|
||||||
├── advanced.nyash # 高度な使用例
|
├── advanced.hako # 高度な使用例
|
||||||
└── benchmark.nyash # ベンチマーク例
|
└── benchmark.hako # ベンチマーク例
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🎯 各モジュールの責務
|
## 🎯 各モジュールの責務
|
||||||
|
|
||||||
### Core層 - データ構造の基盤
|
### Core層 - データ構造の基盤
|
||||||
```nyash
|
```nyash
|
||||||
// core/node.nyash - JSON値の抽象表現
|
// core/node.hako - JSON値の抽象表現
|
||||||
box JsonNode {
|
box JsonNode {
|
||||||
kind: StringBox // "null"|"bool"|"int"|"string"|"array"|"object"
|
kind: StringBox // "null"|"bool"|"int"|"string"|"array"|"object"
|
||||||
value: Box // 実際の値
|
value: Box // 実際の値
|
||||||
meta: Box // メタデータ(位置情報等)
|
meta: Box // メタデータ(位置情報等)
|
||||||
}
|
}
|
||||||
|
|
||||||
// core/value.nyash - 型安全なアクセス
|
// core/value.hako - 型安全なアクセス
|
||||||
box JsonValue {
|
box JsonValue {
|
||||||
node: JsonNode // 内部ノード
|
node: JsonNode // 内部ノード
|
||||||
// as_string(), as_int(), as_bool() 等の型安全メソッド
|
// as_string(), as_int(), as_bool() 等の型安全メソッド
|
||||||
}
|
}
|
||||||
|
|
||||||
// core/error.nyash - エラー情報
|
// core/error.hako - エラー情報
|
||||||
box JsonError {
|
box JsonError {
|
||||||
code: StringBox // エラーコード
|
code: StringBox // エラーコード
|
||||||
message: StringBox // エラーメッセージ
|
message: StringBox // エラーメッセージ
|
||||||
@ -81,7 +81,7 @@ box JsonError {
|
|||||||
|
|
||||||
### Lexer層 - 文字列をトークンに分解
|
### Lexer層 - 文字列をトークンに分解
|
||||||
```nyash
|
```nyash
|
||||||
// lexer/token.nyash - トークン定義
|
// lexer/token.hako - トークン定義
|
||||||
box JsonToken {
|
box JsonToken {
|
||||||
type: StringBox // "STRING"|"NUMBER"|"LBRACE"|"RBRACE"等
|
type: StringBox // "STRING"|"NUMBER"|"LBRACE"|"RBRACE"等
|
||||||
value: StringBox // トークンの値
|
value: StringBox // トークンの値
|
||||||
@ -89,7 +89,7 @@ box JsonToken {
|
|||||||
end: IntegerBox // 終了位置
|
end: IntegerBox // 終了位置
|
||||||
}
|
}
|
||||||
|
|
||||||
// lexer/tokenizer.nyash - メイントークナイザー
|
// lexer/tokenizer.hako - メイントークナイザー
|
||||||
box JsonTokenizer {
|
box JsonTokenizer {
|
||||||
scanner: JsonScanner // 文字スキャナー
|
scanner: JsonScanner // 文字スキャナー
|
||||||
tokens: ArrayBox // 生成されたトークン配列
|
tokens: ArrayBox // 生成されたトークン配列
|
||||||
@ -98,14 +98,14 @@ box JsonTokenizer {
|
|||||||
|
|
||||||
### Parser層 - トークンをASTに変換
|
### Parser層 - トークンをASTに変換
|
||||||
```nyash
|
```nyash
|
||||||
// parser/parser.nyash - メインパーサー
|
// parser/parser.hako - メインパーサー
|
||||||
box JsonParser {
|
box JsonParser {
|
||||||
tokenizer: JsonTokenizer // 字句解析器
|
tokenizer: JsonTokenizer // 字句解析器
|
||||||
current: IntegerBox // 現在のトークン位置
|
current: IntegerBox // 現在のトークン位置
|
||||||
// parse() -> JsonNode
|
// parse() -> JsonNode
|
||||||
}
|
}
|
||||||
|
|
||||||
// parser/recursive.nyash - 再帰下降実装
|
// parser/recursive.hako - 再帰下降実装
|
||||||
static box RecursiveParser {
|
static box RecursiveParser {
|
||||||
parse_value(tokens, pos) // 値をパース
|
parse_value(tokens, pos) // 値をパース
|
||||||
parse_object(tokens, pos) // オブジェクトをパース
|
parse_object(tokens, pos) // オブジェクトをパース
|
||||||
@ -115,14 +115,14 @@ static box RecursiveParser {
|
|||||||
|
|
||||||
### Utils層 - 共通ユーティリティ
|
### Utils層 - 共通ユーティリティ
|
||||||
```nyash
|
```nyash
|
||||||
// utils/string.nyash - 文字列処理
|
// utils/string.hako - 文字列処理
|
||||||
static box StringUtils {
|
static box StringUtils {
|
||||||
trim(s) // 空白トリム
|
trim(s) // 空白トリム
|
||||||
is_whitespace(ch) // 空白文字判定
|
is_whitespace(ch) // 空白文字判定
|
||||||
is_digit(ch) // 数字判定
|
is_digit(ch) // 数字判定
|
||||||
}
|
}
|
||||||
|
|
||||||
// utils/escape.nyash - エスケープ処理
|
// utils/escape.hako - エスケープ処理
|
||||||
static box EscapeUtils {
|
static box EscapeUtils {
|
||||||
escape_string(s) // JSON文字列エスケープ
|
escape_string(s) // JSON文字列エスケープ
|
||||||
unescape_string(s) // JSONエスケープ解除
|
unescape_string(s) // JSONエスケープ解除
|
||||||
@ -202,7 +202,7 @@ Utils ────┴─────────┴─ (共通ユーティリテ
|
|||||||
### 命名規則
|
### 命名規則
|
||||||
- **Box名**: PascalCase (JsonNode, JsonParser)
|
- **Box名**: PascalCase (JsonNode, JsonParser)
|
||||||
- **メソッド名**: snake_case (parse_value, as_string)
|
- **メソッド名**: snake_case (parse_value, as_string)
|
||||||
- **ファイル名**: snake_case (tokenizer.nyash, recursive.nyash)
|
- **ファイル名**: snake_case (tokenizer.hako, recursive.hako)
|
||||||
|
|
||||||
### コメント戦略
|
### コメント戦略
|
||||||
- **なぜ**: 設計の意図を説明
|
- **なぜ**: 設計の意図を説明
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// 簡単なNyashスクリプトJSON解析の「ずれ」問題分析
|
// 簡単なNyashスクリプトJSON解析の「ずれ」問題分析
|
||||||
// yyjsonが必要になった理由と最小限の解決要件
|
// yyjsonが必要になった理由と最小限の解決要件
|
||||||
|
|
||||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||||
|
|
||||||
static box ParsingErrorAnalysis {
|
static box ParsingErrorAnalysis {
|
||||||
|
|
||||||
@ -3,8 +3,8 @@
|
|||||||
// that expects JsonDocBox/JsonNodeBox style methods can operate
|
// that expects JsonDocBox/JsonNodeBox style methods can operate
|
||||||
// with json_native without changing call sites.
|
// with json_native without changing call sites.
|
||||||
|
|
||||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||||
|
|
||||||
// Box that mimics a document holder with parse()/root()/error()
|
// Box that mimics a document holder with parse()/root()/error()
|
||||||
box JsonDocCompat {
|
box JsonDocCompat {
|
||||||
@ -3,8 +3,8 @@
|
|||||||
// 美しいモジュラー設計: Utilsを活用してDRY原則を実践
|
// 美しいモジュラー設計: Utilsを活用してDRY原則を実践
|
||||||
|
|
||||||
// NOTE: relative paths to support alias packaging (nyash.toml)
|
// NOTE: relative paths to support alias packaging (nyash.toml)
|
||||||
using "../utils/string.nyash" as StringUtils
|
using "../utils/string.hako" as StringUtils
|
||||||
using "../utils/escape.nyash" as EscapeUtils
|
using "../utils/escape.hako" as EscapeUtils
|
||||||
// EscapeUtils は必要時に遅延includeする(一部構文が未対応環境でも数値系は動かすため)
|
// EscapeUtils は必要時に遅延includeする(一部構文が未対応環境でも数値系は動かすため)
|
||||||
|
|
||||||
// 🌟 JSON値を表現するBox(Everything is Box原則)
|
// 🌟 JSON値を表現するBox(Everything is Box原則)
|
||||||
@ -2,9 +2,9 @@
|
|||||||
// 責務: 文字列をトークン列に変換、エラー検出、位置情報管理
|
// 責務: 文字列をトークン列に変換、エラー検出、位置情報管理
|
||||||
|
|
||||||
// NOTE: relative paths to support alias packaging (nyash.toml)
|
// NOTE: relative paths to support alias packaging (nyash.toml)
|
||||||
using "./scanner.nyash" as JsonScanner
|
using "./scanner.hako" as JsonScanner
|
||||||
using "./token.nyash" as JsonToken
|
using "./token.hako" as JsonToken
|
||||||
using "../utils/escape.nyash" as EscapeUtils
|
using "../utils/escape.hako" as EscapeUtils
|
||||||
// Removed other dependencies - using self-contained methods
|
// Removed other dependencies - using self-contained methods
|
||||||
|
|
||||||
// 🎯 高精度JSONトークナイザー(Everything is Box)
|
// 🎯 高精度JSONトークナイザー(Everything is Box)
|
||||||
@ -2,10 +2,10 @@
|
|||||||
// 責務: トークン列をJsonNodeに変換、構文エラー検出、ネスト構造処理
|
// 責務: トークン列をJsonNodeに変換、構文エラー検出、ネスト構造処理
|
||||||
|
|
||||||
// NOTE: use paths relative to this file to work under nyash.toml alias packaging
|
// NOTE: use paths relative to this file to work under nyash.toml alias packaging
|
||||||
using "../lexer/tokenizer.nyash" as JsonTokenizer
|
using "../lexer/tokenizer.hako" as JsonTokenizer
|
||||||
using "../lexer/token.nyash" as TokenType
|
using "../lexer/token.hako" as TokenType
|
||||||
using "../core/node.nyash" as JsonNode
|
using "../core/node.hako" as JsonNode
|
||||||
using "../utils/string.nyash" as StringUtils
|
using "../utils/string.hako" as StringUtils
|
||||||
|
|
||||||
// 🎯 高精度JSON構文解析器(Everything is Box)
|
// 🎯 高精度JSON構文解析器(Everything is Box)
|
||||||
static box JsonParserModule {
|
static box JsonParserModule {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
using "apps/lib/json_native/core/compat.nyash" as JsonCompat
|
using "apps/lib/json_native/core/compat.hako" as JsonCompat
|
||||||
|
|
||||||
print("compat: begin")
|
print("compat: begin")
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
// 最終統合テスト - Nyash JSON Native完全版
|
// 最終統合テスト - Nyash JSON Native完全版
|
||||||
|
|
||||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||||
|
|
||||||
static box FinalIntegrationTest {
|
static box FinalIntegrationTest {
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
// 完全統合テスト - 美しいモジュラー設計の動作確認
|
// 完全統合テスト - 美しいモジュラー設計の動作確認
|
||||||
|
|
||||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||||
|
|
||||||
print("🎨 Nyash JSON Native 統合テスト開始")
|
print("🎨 Nyash JSON Native 統合テスト開始")
|
||||||
print("美しいモジュラー設計 vs yyjson巨大ファイル")
|
print("美しいモジュラー設計 vs yyjson巨大ファイル")
|
||||||
@ -1,7 +1,7 @@
|
|||||||
// Phase 2 精度テスト - yyjson相当精度の検証
|
// Phase 2 精度テスト - yyjson相当精度の検証
|
||||||
|
|
||||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParser
|
using "apps/lib/json_native/parser/parser.hako" as JsonParser
|
||||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||||
|
|
||||||
static box Phase2AccuracyTest {
|
static box Phase2AccuracyTest {
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
// JsonNode基本動作テスト - 80%の動く基盤を確認
|
// JsonNode基本動作テスト - 80%の動く基盤を確認
|
||||||
|
|
||||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||||
|
|
||||||
// ===== 基本値テスト =====
|
// ===== 基本値テスト =====
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
// Utils層テスト - StringUtils & EscapeUtilsの動作確認
|
// Utils層テスト - StringUtils & EscapeUtilsの動作確認
|
||||||
|
|
||||||
using "apps/lib/json_native/utils/string.nyash" as StringUtils
|
using "apps/lib/json_native/utils/string.hako" as StringUtils
|
||||||
using "apps/lib/json_native/utils/escape.nyash" as EscapeUtils
|
using "apps/lib/json_native/utils/escape.hako" as EscapeUtils
|
||||||
|
|
||||||
print("🧪 Utils層テスト開始")
|
print("🧪 Utils層テスト開始")
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
// yyjson置き換えテスト - 既存APIとの互換性確認
|
// yyjson置き換えテスト - 既存APIとの互換性確認
|
||||||
|
|
||||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||||
|
|
||||||
// 🔄 既存JsonDocBox API互換テスト
|
// 🔄 既存JsonDocBox API互換テスト
|
||||||
static box JsonDocBoxCompatTest {
|
static box JsonDocBoxCompatTest {
|
||||||
@ -88,7 +88,7 @@ static box JsonDocBoxCompatTest {
|
|||||||
|
|
||||||
// 実際の使用例テスト
|
// 実際の使用例テスト
|
||||||
test_real_usage_examples() {
|
test_real_usage_examples() {
|
||||||
// apps/tests/jsonbox_parse_ok.nyash の内容をシミュレート
|
// apps/tests/jsonbox_parse_ok.hako の内容をシミュレート
|
||||||
print("Real usage example simulation:")
|
print("Real usage example simulation:")
|
||||||
|
|
||||||
local examples = new ArrayBox()
|
local examples = new ArrayBox()
|
||||||
@ -120,7 +120,7 @@ static box JsonDocBoxCompatTest {
|
|||||||
|
|
||||||
// 既存のエラーケースをテスト
|
// 既存のエラーケースをテスト
|
||||||
local error_cases = new ArrayBox()
|
local error_cases = new ArrayBox()
|
||||||
error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.nyash
|
error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.hako
|
||||||
error_cases.push("{invalid json}")
|
error_cases.push("{invalid json}")
|
||||||
error_cases.push("[1, 2, 3") // 不完全な配列
|
error_cases.push("[1, 2, 3") // 不完全な配列
|
||||||
error_cases.push("{\"key\": \"value\",}") // 末尾カンマ
|
error_cases.push("{\"key\": \"value\",}") // 末尾カンマ
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// loopform_normalize.nyash — ループ正規化前処理(恒等版)
|
// loopform_normalize.hako — ループ正規化前処理(恒等版)
|
||||||
// 目的: while 等を安定化(キー順・簡易キャリア整列)。
|
// 目的: while 等を安定化(キー順・簡易キャリア整列)。
|
||||||
// 現段階は恒等(identity)。将来段階で安全な最小正規化を実装する。
|
// 現段階は恒等(identity)。将来段階で安全な最小正規化を実装する。
|
||||||
|
|
||||||
@ -4,13 +4,13 @@
|
|||||||
static box PatternBuilder {
|
static box PatternBuilder {
|
||||||
// eq(lhs, rhs) => lhs == rhs
|
// eq(lhs, rhs) => lhs == rhs
|
||||||
eq(lhs_json, rhs_json) {
|
eq(lhs_json, rhs_json) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
return JB.binary("==", lhs_json, rhs_json)
|
return JB.binary("==", lhs_json, rhs_json)
|
||||||
}
|
}
|
||||||
|
|
||||||
// or_([c1, c2, ...]) => c1 || c2 || ... (空は false)
|
// or_([c1, c2, ...]) => c1 || c2 || ... (空は false)
|
||||||
or_(conds) {
|
or_(conds) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
if conds.length() == 0 { return JB.literal_bool(false) }
|
if conds.length() == 0 { return JB.literal_bool(false) }
|
||||||
if conds.length() == 1 { return conds.get(0) }
|
if conds.length() == 1 { return conds.get(0) }
|
||||||
local i = 1
|
local i = 1
|
||||||
@ -24,7 +24,7 @@ static box PatternBuilder {
|
|||||||
|
|
||||||
// and_([g1, g2, ...]) => g1 && g2 && ... (空は true)
|
// and_([g1, g2, ...]) => g1 && g2 && ... (空は true)
|
||||||
and_(conds) {
|
and_(conds) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
if conds.length() == 0 { return JB.literal_bool(true) }
|
if conds.length() == 0 { return JB.literal_bool(true) }
|
||||||
if conds.length() == 1 { return conds.get(0) }
|
if conds.length() == 1 { return conds.get(0) }
|
||||||
local i = 1
|
local i = 1
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// scopebox_inject.nyash — JSON v0 前処理(恒等版)
|
// scopebox_inject.hako — JSON v0 前処理(恒等版)
|
||||||
// 目的: If.then/else, Loop.body を ScopeBox 相当に包む前処理の導線を提供。
|
// 目的: If.then/else, Loop.body を ScopeBox 相当に包む前処理の導線を提供。
|
||||||
// 現段階は恒等(identity)。将来段階で安全な包み込みを実装する。
|
// 現段階は恒等(identity)。将来段階で安全な包み込みを実装する。
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// std/operators/add.nyash
|
// std/operators/add.hako
|
||||||
// AddOperator — 加算の演算子ボックス(開発用観測MVP)
|
// AddOperator — 加算の演算子ボックス(開発用観測MVP)
|
||||||
// 目的: 加算を明示呼び出しとして観測(返り値は未使用)
|
// 目的: 加算を明示呼び出しとして観測(返り値は未使用)
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// std/operators/compare.nyash
|
// std/operators/compare.hako
|
||||||
// CompareOperator — 比較演算の演算子ボックス(開発用観測MVP)
|
// CompareOperator — 比較演算の演算子ボックス(開発用観測MVP)
|
||||||
// 目的: 比較を明示の呼び出しとして観測可能にする(MVPでは返り値は未使用)
|
// 目的: 比較を明示の呼び出しとして観測可能にする(MVPでは返り値は未使用)
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// std/operators/stringify.nyash
|
// std/operators/stringify.hako
|
||||||
// StringifyOperator — 明示的な文字列化の演算子ボックス(開発用)
|
// StringifyOperator — 明示的な文字列化の演算子ボックス(開発用)
|
||||||
// 目的: 暗黙の toString に依存せず、観測可能な文字列化を提供する
|
// 目的: 暗黙の toString に依存せず、観測可能な文字列化を提供する
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// array_prepend_zero_macro.nyash
|
// array_prepend_zero_macro.hako
|
||||||
// MacroBoxSpec.expand: prepend 0 to every Array elements list in AST JSON v0
|
// MacroBoxSpec.expand: prepend 0 to every Array elements list in AST JSON v0
|
||||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// hang_macro.nyash
|
// hang_macro.hako
|
||||||
// Macro that never returns (infinite loop) to test timeout handling.
|
// Macro that never returns (infinite loop) to test timeout handling.
|
||||||
|
|
||||||
static box MacroBoxSpec {
|
static box MacroBoxSpec {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// if_match_normalize_macro.nyash
|
// if_match_normalize_macro.hako
|
||||||
// Scaffold: identity expansion for now. Future: introduce join variable and
|
// Scaffold: identity expansion for now. Future: introduce join variable and
|
||||||
// canonical If/Match normalization (scrutinee once, guard fused) as documented
|
// canonical If/Match normalization (scrutinee once, guard fused) as documented
|
||||||
// in docs/guides/if-match-normalize.md.
|
// in docs/guides/if-match-normalize.md.
|
||||||
@ -7,7 +7,7 @@ static box MacroBoxSpec {
|
|||||||
name() { return "IfMatchNormalize" }
|
name() { return "IfMatchNormalize" }
|
||||||
|
|
||||||
expand(json, ctx) {
|
expand(json, ctx) {
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
|
|
||||||
// --- helpers copied/adapted from loop_normalize ---
|
// --- helpers copied/adapted from loop_normalize ---
|
||||||
function parse_value(s, i) {
|
function parse_value(s, i) {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// invalid_json_macro.nyash
|
// invalid_json_macro.hako
|
||||||
// Macro that returns invalid JSON (for strict error test)
|
// Macro that returns invalid JSON (for strict error test)
|
||||||
|
|
||||||
static box MacroBoxSpec {
|
static box MacroBoxSpec {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// loop_normalize_macro.nyash
|
// loop_normalize_macro.hako
|
||||||
// MVP: identity expansion with (json, ctx) signature.
|
// MVP: identity expansion with (json, ctx) signature.
|
||||||
// Next steps: normalize `loop(cond){ body }` into carrier-based LoopForm.
|
// Next steps: normalize `loop(cond){ body }` into carrier-based LoopForm.
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ static box MacroBoxSpec {
|
|||||||
// "kind":"Loop","condition":<json>,"body":[ ... ] and rewrite them
|
// "kind":"Loop","condition":<json>,"body":[ ... ] and rewrite them
|
||||||
// into a normalized form using JsonBuilder (keys ordered as condition/body).
|
// into a normalized form using JsonBuilder (keys ordered as condition/body).
|
||||||
|
|
||||||
using "apps/lib/json_builder.nyash" as JB
|
using "apps/lib/json_builder.hako" as JB
|
||||||
|
|
||||||
// helpers
|
// helpers
|
||||||
local s = json
|
local s = json
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// map_insert_tag_macro.nyash
|
// map_insert_tag_macro.hako
|
||||||
// MacroBoxSpec.expand: insert a leading entry {"k":"__macro","v":"on"} into every Map entries list
|
// MacroBoxSpec.expand: insert a leading entry {"k":"__macro","v":"on"} into every Map entries list
|
||||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// scope_defer_macro.nyash
|
// scope_defer_macro.hako
|
||||||
// MVP scaffold: detect @scope/@defer style markers in AST JSON (string) and keep identity.
|
// MVP scaffold: detect @scope/@defer style markers in AST JSON (string) and keep identity.
|
||||||
// Future: attach scope attrs to blocks and emit MIR hints in lowering.
|
// Future: attach scope attrs to blocks and emit MIR hints in lowering.
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// upper_string_macro.nyash
|
// upper_string_macro.hako
|
||||||
// MacroBoxSpec.expand: uppercase string literal values that start with "UPPER:" in AST JSON v0
|
// MacroBoxSpec.expand: uppercase string literal values that start with "UPPER:" in AST JSON v0
|
||||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||||
|
|
||||||
@ -4,7 +4,7 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
NYASH=${NYASH:-"../../target/release/nyash"}
|
NYASH=${NYASH:-"../../target/release/nyash"}
|
||||||
SCRIPT="main.nyash"
|
SCRIPT="main.hako"
|
||||||
|
|
||||||
echo "=== ny-echo Test Suite ==="
|
echo "=== ny-echo Test Suite ==="
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user