## 🎉 完了項目 - ✅ plugin_box_legacy.rs削除(7.7KB、参照ゼロ確認済み) - ✅ REMOVEDコメント整理(encode.rs簡潔化) - ✅ venv削除(143MB節約、.gitignoreは既存) - ✅ llvm_legacyスタブ化(8KB、compile_error!による安全化) ## 🏆 成果 - **リポジトリサイズ改善**: 151MB削減 - **コード整理**: レガシーコード安全にアーカイブ - **プラグインファースト**: StrictPluginFirst継続動作 ## ✅ 検証完了 - cargo build --release --features llvm (警告のみ、エラーなし) - LLVMハーネス実行: print出力正常 - プラグイン動作: StringBox等正常動作 codex先生の戦略に従った安全な段階的削除を実行 Co-Authored-By: codex <noreply@anthropic.com>
43 lines
2.4 KiB
Markdown
43 lines
2.4 KiB
Markdown
# ExternCall — Runtime Interfaces (env.*)
|
|
|
|
Overview
|
|
- ExternCall represents calls to host-provided interfaces, addressed by an interface name and method, e.g. `env.console.log`.
|
|
- In Nyash, source-level `print/println` normalize to an ExternCall targeting the console interface.
|
|
|
|
Normalization of println/print
|
|
- Builder/Optimizer rewrites language-level printing to ExternCall:
|
|
- `println(x)` or `ConsoleBox.println(x)` → `ExternCall("env.console", "log", [x])`
|
|
- Rationale: unifies backends and keeps ConsoleBox for other roles (vtable optimization, advanced console APIs).
|
|
|
|
Backend Behavior
|
|
- LLVM/AOT (EXE-first):
|
|
- `env.console.log` is normalized in the LLVM builder to kernel exports and links statically.
|
|
- Primary mapping uses pointer-API when possible to avoid handle churn:
|
|
- `nyash.console.log(i8*) -> i64`
|
|
- Fallback to handle-API helpers (`nyash.string.to_i8p_h`) if only a handle is available.
|
|
- Runtime result line: the kernel prints `Result: <code>` after `ny_main()` returns. Set `NYASH_NYRT_SILENT_RESULT=1` to suppress for tests.
|
|
- PyVM:
|
|
- Accepts `env.console.log/warn/error` and writes to stdout (MVP). Return is `0` when a destination is present.
|
|
- JIT:
|
|
- Host-bridge directly prints the first argument to stdout for `env.console.log` minimal parity.
|
|
|
|
MIR JSON v0 Encoding
|
|
- Instruction shape:
|
|
- `{ "op": "externcall", "func": "env.console.log", "args": [<vid>], "dst": <vid|null>, "dst_type": "i64"? }`
|
|
- Builder may also emit `"func": "nyash.console.log"` in some paths; both are accepted by backends. The LLVM builder maps `env.console.*` to `nyash.console.*` automatically.
|
|
|
|
Key Fields (JSON v0, minimal)
|
|
- `op`: literal `"externcall"`.
|
|
- `func`: fully qualified name. Preferred: `"env.console.log"`. Accepted: `"nyash.console.log"`.
|
|
- `args`: value-ids array (each is an integer referencing a producer).
|
|
- `dst`: optional value-id to store result; may be null when ignored.
|
|
- `dst_type` (optional): backend hint. For console methods, `"i64"` is used when `dst` is present.
|
|
|
|
|
|
Return Value Convention
|
|
- Console methods return `i64` status (typically 0). Most user code ignores it; when `dst` is set, backends materialize `0`.
|
|
|
|
Guidance
|
|
- Use `print/println` in Nyash source; the toolchain normalizes to ExternCall.
|
|
- Prefer exit code assertions in EXE-first tests. If you must compare stdout, set `NYASH_NYRT_SILENT_RESULT=1` to hide NyRT's `Result:` line.
|