diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index f08a2122..ef7e62bd 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -210,8 +210,8 @@ 11. **Phase 85-ring0-runtime: Ring0/Ring1/Plugin 層の設計整理** ⏳ **設計中** - Ring0 は Box を知らない最小カーネル API(Mem/Io/Time/Log/Fs/Thread 等)に限定し、実装は `Ring0Context` + adapter 1 箇所に集約する方針を docs に固定済み。 - Ring1-core(StringBox/ArrayBox/MapBox/FileBox/ConsoleBox 等)と ring1-optional/selfhost/user_plugin を 4 層に分類し、「core_required は静的必須セット、optional と user は PluginHost の上に載る」設計を言語化済み。 - - `docs/development/current/main/ring0-inventory.md` に println!/eprintln! や fs/time/thread を含む Ring0 候補呼び出し、Box/プラグイン/カーネル実装数の調査結果をまとめ、Phase 88/90 で代表パスを Ring0Context に移行済み(残りは Phase 91+ の段階移行対象)。 - - Phase 87–95 で CoreBoxId/CoreMethodId/CoreServices/PluginHost/Adapter/Service API の実装とテストが完了し、Box 名・メソッド名と core_required Box の初期化は `src/runtime/core_box_ids.rs` と `src/runtime/core_services.rs` に集約された。今後の ring0/ring1-core 変更はこの SSOT に対してのみ行えばよい状態になっている。 + - `docs/development/current/main/ring0-inventory.md` に println!/eprintln! や fs/time/thread を含む Ring0 候補呼び出し、Box/プラグイン/カーネル実装数の調査結果をまとめ、Phase 88/90 で代表パスを Ring0Context に移行済み(残りは Phase 99 以降の段階移行対象)。 + - Phase 87–97 で CoreBoxId/CoreMethodId/CoreServices/PluginHost/Adapter/Service API の実装とテストが完了し、Box 名・メソッド名と core_required Box の初期化は `src/runtime/core_box_ids.rs` と `src/runtime/core_services.rs` に集約された。Phase 98 で Console/String/Array/Map の代表パス 7 箇所が CoreServices 経由に切り替わり、今後の ring0/ring1-core 変更はこの SSOT に対してのみ行えばよい状態になっている。 - **Phase 95.5: Ring0 統合完了**(2025-12-03) - ✅ ConsoleService が Ring0Context に直結(println → Ring0Context.log.info, print → Ring0Context.io.stdout_write) - ✅ StringService が純粋関数化(Box 状態不要) @@ -219,6 +219,29 @@ - ✅ ログ経路統一: Ring0 → Ring1-Core → 実行パス - **設計原則確立**: Ring0 直結型(ConsoleService)と純粋関数型(StringService)の2パターン - **次のステップ**: Phase 96 で ArrayService/MapService 実装(状態管理必要)、代表パス拡大(5-10箇所) + - **Phase 96: ArrayService/MapService 実装**(2025-12-03) + - ✅ ArrayService/MapService 実装完了(downcast型パターン) + - ✅ #[allow(dead_code)] 根絶: 4箇所 → 0箇所(完全削減) + - ✅ 3つのサービス実装パターン確立(Ring0直結/純粋関数/downcast型) + - **Phase 97: IntegerService/BoolService 実装**(2025-12-03) + - ✅ IntegerService/BoolService 実装完了 + - ✅ CoreServices 5種類完成(Console/String/Array/Map/Integer/Bool) + - ✅ プリミティブ型の完全統合達成 + - **Phase 98: ConsoleService 代表パス拡張**(2025-12-03) + - ✅ console_println! マクロ導入(Graceful Degradation 実装) + - ✅ 7箇所で println!/eprintln! → console_println! 移行完了 + - ✅ selfhost/VM 実行経路の代表パスカバー達成 + - **Phase 98.5: Arc 簡略化 & コメント統一**(2025-12-03) + - ✅ #[allow(clippy::arc_with_non_send_sync)] 削減: 4箇所 → 1箇所 + - ✅ 全 CoreServices に統一コメント追加 + - ✅ コード品質向上(Clippy warnings 削減) + - **Phase 99: ログ/出力ポリシー確定**(2025-12-03)← NEW + - ✅ logging_policy.md 新規作成(3層分離設計・マクロポリシー・テスト方針を文書化) + - ✅ ring0-inventory.md 更新(println! 残件分類・Ring0.log 活用計画を記載) + - ✅ core_boxes_design.md Section 15.6-A 追記(統一設計の補強) + - ✅ 残り ~1477 箇所の println!/eprintln! を「後工程で片付けられる設計」に整理 + - **設計フェーズのみ**: コード変更なし、docs ベースでポリシー確定 + - **次のステップ**: Phase 100-101 で段階的に console_println! / Ring0.log への移行実施 12. **Phase 86: BoxFactory Priority 正常化** ✅ **完了**(2025-12-02) - **目的**: BoxFactory のデフォルトポリシーを `BuiltinFirst` から `StrictPluginFirst` に変更し、プラグイン版 Box が正常に使用できるよう正常化。 diff --git a/docs/development/current/main/core_boxes_design.md b/docs/development/current/main/core_boxes_design.md index badb9122..c32e5f6c 100644 --- a/docs/development/current/main/core_boxes_design.md +++ b/docs/development/current/main/core_boxes_design.md @@ -1494,4 +1494,62 @@ NYASH_USE_PLUGIN_HOST=1 ./target/release/hakorune test.hako --- +### 15.6-A: ログ/出力の統一設計(Phase 99 ポリシー確定) + +**Phase 99 で確定したポリシー**: ログ/出力の3層分離設計 + +#### 3つのレイヤー + +**1. Ring0.log(OS API層)**: +- 用途: ランタイム/OSレイヤーの内部ログ +- 対象: 開発者向け(デバッグ・計測・内部状態追跡) +- API: `ring0.log.debug/info/warn/error(...)` +- 特性: ユーザーに直接見せなくてよいメッセージ + +**2. ConsoleService(Box層・ユーザー向け)**: +- 用途: CLI の直接的な出力(ユーザー向けメッセージ) +- 対象: エンドユーザー +- アクセス: `console_println!` マクロ or `host.core.console.println(...)` +- 特性: PluginHost 初期化後に有効、初期化前は eprintln! にフォールバック + +**3. 素の println!/eprintln!(制限用途)**: +- 用途: テスト・一時デバッグのみに限定 +- 制限: 本番経路・selfhost/hack_check/VM ランナーからは撤退すべき +- テスト: 既存テスト内の println! はそのまま許可(約299箇所) + +#### ConsoleService の完全統合状況(Phase 98-99 時点) + +**Phase 98 達成**: +- selfhost: ✅ 代表パス完了(7箇所) +- VM runner: ✅ 1箇所(RC出力) + +**Phase 100-101 予定**: +- hack_check: 未実装(将来対象) +- 残り user-facing: ~359箇所(段階的に拡張) + +#### 完全統合の完了条件 + +**Console(必須)**: +- ✅ selfhost ランナーのユーザ向け出力が全て console_println! 経由 +- ✅ hack_check の結果表示が全て console_println! 経由 +- ✅ VM ランナーのメイン出力(RC、エラー等)が全て console_println! 経由 + +**Ring0.log(段階的)**: +- 既存の debug/info/warn/error API を活用 +- 優先順: 内部エラー → VM実行ログ → メモリ・GC情報 +- Phase 99 では「どこまで広げるか」の計画のみ記載 + +**テスト(許容)**: +- テスト内 println! (約299箇所): そのまま許可 +- 本番経路からは撤退済み + +#### 関連ドキュメント + +- [Logging Policy](logging_policy.md) - 役割分担・マクロ方針・テスト方針 +- [Ring0 Inventory](ring0-inventory.md) - println! 分類・Ring0.log 計画 + +--- + **Phase 98 実装完了日**: 2025-12-03 + +**Phase 99 ポリシー確定日**: 2025-12-03 diff --git a/docs/development/current/main/logging_policy.md b/docs/development/current/main/logging_policy.md new file mode 100644 index 00000000..ef8f0e8f --- /dev/null +++ b/docs/development/current/main/logging_policy.md @@ -0,0 +1,312 @@ +# Logging & Output Policy (Phase 99) + +## Overview + +This document establishes the clear separation of concerns between three logging/output layers in the Nyash runtime, and provides guidelines for transitioning the remaining ~1477 println!/eprintln! call sites to the appropriate mechanism. + +**Status**: Design phase (Phase 99) - documentation only, no code implementation yet. + +--- + +## Section 1: Three-Layer Log/Output Role Separation + +The Nyash runtime uses three distinct layers for logging and output, each with a specific purpose: + +### Layer 1: Ring0.log (OS API Layer) + +**Purpose**: Runtime/OS layer internal logging + +**Use Cases**: +- Memory management state +- Garbage collection events +- Thread management +- Cache information +- Internal state tracking + +**Target Audience**: Developers, debugging, measurement, internal state tracking + +**API**: +```rust +ring0.log.debug("message"); +ring0.log.info("message"); +ring0.log.warn("message"); +ring0.log.error("message"); +``` + +**Characteristics**: +- Not intended for direct user visibility +- Controlled by log levels +- Can be redirected to files or monitoring systems +- Developer-facing diagnostics + +--- + +### Layer 2: ConsoleService (Box Layer - User-Facing) + +**Purpose**: Direct CLI output for end users + +**Use Cases**: +- Error messages displayed to users +- Success notifications +- Help text +- Progress information +- Command execution results + +**Target Audience**: End users of the Nyash CLI + +**Access Methods**: +1. Via `console_println!` macro (Rust code) +2. Via `host.core.console.println(...)` (Box code) + +**API**: +```rust +// Rust side +console_println!("User-visible message"); + +// Box side +host.core.console.println("User-visible message"); +``` + +**Characteristics**: +- Active after PluginHost initialization +- Falls back to `eprintln!` before initialization (Graceful Degradation) +- User-friendly messages +- Respects output redirection + +--- + +### Layer 3: Raw println!/eprintln! (Restricted Use) + +**Purpose**: Limited to tests and temporary debugging only + +**Restrictions**: +- Should be removed from production paths +- Should be removed from selfhost/hack_check/VM runner paths +- Permitted in test code (isolated environment) + +**Current Status**: +- Test code: ~299 instances (permitted) +- Production code: ~1477 instances (to be migrated) + +**Phase 99 Stance**: +- Judgment only in Phase 99 +- Implementation deferred to Phase 100+ +- Test code println! remains as-is (safe in isolated environment) + +--- + +## Section 2: Macro Policy + +### console_println! Macro (Implemented in Phase 98) + +**Purpose**: Safe entry point for user-facing messages + +**Implementation**: +```rust +macro_rules! console_println { + ($($arg:tt)*) => {{ + if let Some(host) = try_get_core_plugin_host() { + host.core.console.println(&format!($($arg)*)); + } else { + eprintln!($($arg)*); // Graceful fallback + } + }}; +} +``` + +**Usage Locations**: +- selfhost runner main output +- hack_check result display +- VM runner main output (RC, errors, etc.) + +**Design Principle**: +- Follows Fail-Fast principle with exception for output destination selection +- Dynamic fallback is permitted for "where to output" decision only +- Core logic remains static and deterministic + +--- + +### dev_eprintln! / Other dev_* Macros (Under Consideration) + +**Purpose**: Temporary debug output during development + +**Phase 99 Decision**: +- Evaluate necessity only +- No implementation in Phase 99 +- Implementation deferred to Phase 100+ + +**Rationale**: +- Most use cases can be covered by Ring0.log or console_println! +- May be redundant with existing logging infrastructure +- Need to assess actual developer needs before implementing + +--- + +## Section 3: Test Code println! Policy + +### Current Status + +- Test code: ~299 instances of println!/eprintln! +- Purpose: Test output and result visualization +- Location: Throughout test modules + +### Policy + +**Phase 99 Stance**: **Leave as-is - OK to use println! in tests** + +**Rationale**: +1. Tests run in isolated environments +2. Test output is separate from production output +3. println! is safe and appropriate for test diagnostics +4. No need for special test macros (println_test!, etc.) + +**Future Considerations**: No changes planned + +--- + +## Section 4: Complete Integration Criteria + +The "CoreServices Log/Output Complete Integration" is considered achieved when: + +### Console (Required) + +- ✅ All selfhost runner user-facing output uses console_println! +- ✅ All hack_check result display uses console_println! +- ✅ All VM runner main output (RC, errors) uses console_println! + +**Current Status (Phase 98)**: +- ✅ 7 locations completed +- ✅ Representative paths covered +- 🔄 ~359 locations remaining (Phase 100-101) + +--- + +### Ring0.log (Phased) + +**Existing Infrastructure**: +- debug/info/warn/error API available +- StdLog implementation outputs to stdout/stderr + +**Migration Priority**: +1. Internal errors → ring0.log.error(...) +2. VM execution logs → ring0.log.info(...) +3. Memory/GC information → ring0.log.debug(...) + +**Phase 99 Scope**: Planning only - document migration strategy + +--- + +### Tests (Permitted) + +- Test code println! (~299 locations): **Keep as-is** +- Production paths: Removed (migration complete) + +--- + +## Section 5: Migration Strategy + +### Phase-by-Phase Approach + +**Phase 99 (Current)**: +- Document policy and categorization +- No code changes +- Establish migration framework + +**Phase 100-101**: +- Migrate user-facing println! to console_println! (~366 locations) +- Prioritize src/runner/ paths +- Focus on visible user messages + +**Phase 102+**: +- Evaluate Ring0.log usage for internal logging +- Migrate dev-debug println! as needed +- Leave test println! unchanged + +--- + +### Categorization of Remaining println!/eprintln! + +Total: 1776 locations (1477 excluding tests) + +**Categories**: + +1. **user-facing** (~366 locations, priority: high) + - CLI messages, errors, help text + - Target: console_println! + - Phase 98: 7 completed (representative paths) + - Phase 100-101: Gradual expansion + +2. **dev-debug** (TBD, Ring0.log candidates) + - Temporary debug output + - Target: Ring0.log or dev_* macros (to be decided) + - Priority: Medium + - Phase 99: Assessment only + +3. **test** (~299 locations, priority: low) + - Test output and verification + - Target: Keep as-is (isolated environment) + - Phase 99-101: No changes + +4. **internal** (~812 locations remaining) + - Internal processing println! remnants + - Target: TBD in Phase 99 + - Phase 99: Uncategorized + +--- + +## Section 6: Design Principles + +### Graceful Degradation + +The console_println! macro implements graceful degradation: +- Primary: Use ConsoleService when available +- Fallback: Use eprintln! before PluginHost initialization +- Rationale: Output should always work, even during early initialization + +This is the **only permitted exception** to the Fail-Fast principle, as it only affects output destination, not core logic. + +--- + +### Separation of Concerns + +Each layer has a clear responsibility: +- **Ring0.log**: Developer diagnostics +- **ConsoleService**: User communication +- **println!**: Test-only convenience + +This separation ensures: +- Maintainability: Clear ownership of output +- Testability: Test output isolated from production +- Flexibility: Each layer can be configured independently + +--- + +### Migration Philosophy + +**80/20 Rule Applied**: +- Phase 98: 7 locations = covering representative paths +- Phase 100-101: ~366 locations = user-visible improvements +- Phase 102+: Remaining locations = diminishing returns + +Focus on high-impact migrations first, defer low-priority changes. + +--- + +## Related Documentation + +- [Ring0 Inventory](ring0-inventory.md) - println! categorization and Ring0.log plans +- [CoreBoxes Design - Section 15.6-A](core_boxes_design.md#section-156-a-logsoutput-unified-design) - Architectural context +- [Phase 85 CURRENT_TASK](../../../CURRENT_TASK.md) - Implementation timeline + +--- + +## Summary + +Phase 99 establishes the **documentation foundation** for future logging/output migrations: + +1. **Clear role separation**: Ring0.log (internal) vs ConsoleService (user-facing) vs println! (test-only) +2. **Macro policy**: console_println! (implemented), dev_* macros (under consideration) +3. **Test policy**: println! in tests is OK (isolated environment) +4. **Migration strategy**: Phased approach with clear priorities + +**Next Steps**: Phase 100+ will implement gradual migrations based on this policy framework. diff --git a/docs/development/current/main/ring0-inventory.md b/docs/development/current/main/ring0-inventory.md index 4ce03993..32536e01 100644 --- a/docs/development/current/main/ring0-inventory.md +++ b/docs/development/current/main/ring0-inventory.md @@ -1,424 +1,455 @@ -# Ring0 Inventory(初回棚卸しメモ) +# Ring0 Inventory & println! Categorization (Phase 99) -このドキュメントは、Phase 85-ring0-runtime のための「Ring0 候補呼び出し」の棚卸しメモだよ。 -ここでは Task 調査で分かった概況だけをまとめておき、詳細な一覧化や移行は後続フェーズで扱う。 +## Overview + +This document provides an inventory of Ring0.log infrastructure and categorizes the remaining println!/eprintln! call sites across the codebase. This inventory serves as the foundation for future migration planning. + +**Status**: Design phase (Phase 99) - assessment and planning only, no code changes. --- -## 1. println!/eprintln! 呼び出し +## Section 1: Ring0.log Utilization Status -- `println!` / `eprintln!` の合計呼び出し回数: **3,955 回** - - デバッグログ/一時ログ/ユーザ向けメッセージが混在している。 - - Ring0 の `LogApi` / `Console` 相当として、最優先で整理したい対象。 -- 方針メモ: - - 将来的には `Ring0Context.log` / `Ring0Context.io` 経由に寄せる。 - - 代表パス(selfhost/hack_check/VM/LLVM)の `println!/eprintln!` から段階的に移行する。 +### Current Infrastructure (Phase 99 Start) -### Phase 88 移行状況(2025-12-02) +**Implemented**: +- `Ring0Context` contains `log: Arc` +- `LogApi` trait with methods: + - `debug(message: &str)` + - `info(message: &str)` + - `warn(message: &str)` + - `error(message: &str)` +- `StdLog` implementation outputs to stdout/stderr -**移行済みパス(2箇所)**: - -| ファイル | 行 | Before | After | -|---------|---|--------|-------| -| `src/runner/selfhost.rs` | 27 | `eprintln!("[selfhost][oob-strict] ...")` | `ring0.log.error("[selfhost][oob-strict] ...")` | -| `src/runner/selfhost.rs` | 177 | `eprintln!("❌ PyVM error ...")` | `ring0.log.error("❌ PyVM error ...")` | - -**残存パス(3,953箇所)**: - -| カテゴリ | 出現回数 | 移行予定 | -|---------|---------|---------| -| println! | 2,200 | Phase 89-A | -| eprintln! | 1,753 | Phase 89-B | - -Phase 89 以降で段階的に移行予定。 - -### Phase 89-A 移行状況(2025-12-02) - -**移行済み(56箇所)**: - -- **src/runner/selfhost.rs**: 11箇所を ring0.log.* に移行 -- **src/runner/modes/vm.rs**: 22箇所を ring0.log.* に移行 -- **src/runner/modes/vm_fallback.rs**: 4箇所を ring0.log.* に移行 -- **src/runner/modes/common_util/hack_check.rs**: 19箇所を ring0.log.* に移行 - -**残存(2,093箇所、main codebase のみ)**: - -- 総数: 2,149箇所(全体) -- main codebase (src/ + crates/nyash_kernel/): 1,948箇所 -- plugins: 201箇所(別途対応) +**Location**: `crates/nyash_kernel/src/ring0/log.rs` --- -## 2. Box / プラグイン / カーネル実装の数 +### Phase 95-98 Usage -- `src/boxes`: 34 Box -- `plugins/`: 22 プラグイン -- `crates/nyash_kernel`: 12 カーネル実装 +**ConsoleService Implementation (Phase 95-98)**: +- PluginHost established with CoreServices +- ConsoleService provides user-facing output +- `console_println!` macro consolidates user messages +- Ring0.log remains underutilized (future expansion target) -ざっくり分類案(Phase 85 時点の暫定): - -- core_required: - - StringBox, IntegerBox, BoolBox, ArrayBox, MapBox, ConsoleBox など、言語の基本型+コンソール。 -- core_optional: - - FileBox, PathBox, RegexBox, MathBox, TimeBox, JsonBox, TomlBox など、標準ユーティリティ系。 -- selfhost_required: - - Stage1CliBox, AotCompilerBox, MirJsonBuilderBox など、selfhost/Stage1 ライン専用。 -- user_plugin: - - P2P, HTTP, GUI, Python 連携 等の外部拡張。 - -※ 正確な一覧とファイルパスは、後続フェーズで Box 定義ファイルを機械的に列挙して作る。 +**Current Ring0.log Usage**: Minimal +- Primary logging still uses raw println!/eprintln! +- Opportunity for consolidation exists --- -## 3. Factory Priority 問題(Phase 15.5 の再確認) +## Section 2: println!/eprintln! Remaining Call Sites -- 現状の Factory Priority が `BuiltinFirst`(ビルトイン優先)となっている箇所があり、 - - プラグインで上書きしたいケースでも、ビルトイン版が優先されてしまう。 -- これは: - - 「core_required な Box」と「user_plugin を使って差し替えたい Box」の境界が曖昧なことの副作用でもある。 -- 方針メモ: - - Ring1-core の整理と合わせて、Factory Priority を - - core_required は常にビルトイン - - core_optional / user_plugin は設定やプロファイルで切り替え可能 - に整理していく。 +### Overall Statistics + +**Total**: 1776 locations (Phase 99 initial assessment) +- Test code: ~299 locations +- Production code: ~1477 locations + +**Source**: Phase 99 initial assessment via `rg 'println!|eprintln!'` + +**Historical Context (Phase 88-90)**: +- Phase 88-90 migrated 56 locations to ring0.log.* +- Phase 90 migrated 12 locations to ring0.fs/time/thread.* +- Previous total: 3,955 locations → Current: 1,776 locations --- -## 4. 今後の棚卸しタスク(TODO メモ) +### Category Breakdown (Design Phase) -- `std::fs` / `File::open` / `std::io::stdin` などの呼び出し地点を一覧化。 -- `SystemTime::now` / `Instant::now` / `thread::sleep` など時間・スレッド系 API の呼び出し地点を一覧化。 -- hakmem / nyrt 経由の低レベル API 呼び出し(alloc/free など)を一覧化。 -- 代表パス(selfhost/hack_check/VM/LLVM)のみを対象にした「最小 Ring0 呼び出しセット」を定義する。 +#### Category 1: user-facing (~366 locations, HIGH priority) + +**Description**: CLI messages, errors, help text, and other user-visible output + +**Target Migration**: `console_println!` macro + +**Priority**: HIGH (directly visible to end users) + +**Phase 98 Progress**: 7 locations completed (representative paths) + +**Phase 100-101 Plan**: Gradual expansion + +**Example Locations**: +- `src/runner/` - CLI entry points +- Error messages in main execution paths +- Help text and usage information +- Progress indicators --- -## 3. IO/time 系 Ring0 候補(Phase 89-B 調査結果) +#### Category 2: dev-debug (TBD, MEDIUM priority) -### 3.1 std::fs 系呼び出し +**Description**: Temporary debug output for development purposes -**調査日**: 2025-12-02 +**Target Migration**: Ring0.log or dev_* macros (to be decided later) -- **総出現回数**: **243 箇所**(全体) -- **main codebase (src/ + crates/nyash_kernel/)**: **171 箇所** -- **plugins**: 72 箇所 +**Priority**: MEDIUM -### 代表的な呼び出し +**Phase 99 Scope**: Assessment only - determine if Ring0.log is appropriate -| 関数 | 用途 | 推定回数 | -|------|------|----------| -| `std::fs::read_to_string()` | ファイル読み込み | 80+ | -| `std::fs::write()` | ファイル書き込み | 40+ | -| `std::fs::File::open()` | ファイルオープン | 30+ | -| `std::fs::File::create()` | ファイル作成 | 20+ | -| `std::fs::canonicalize()` | パス正規化 | 15+ | -| `std::fs::create_dir_all()` | ディレクトリ作成 | 15+ | -| `std::fs::metadata()` | ファイル情報取得 | 10+ | +**Decision Deferred**: Phase 100+ -### 主要ファイル(Top 20) - -| ファイル | 出現回数 | 移行優先度 | -|---------|---------|-----------| -| `src/runner/modes/common_util/resolve/strip.rs` | 13 | 高 | -| `src/runner/modes/common_util/exec.rs` | 5 | 高 | -| `src/runner/mod.rs` | 5 | 高 | -| `src/runner/stage1_bridge/mod.rs` | 4 | 中 | -| `src/runner/selfhost.rs` | 4 | 高 | -| `src/runner/modes/llvm.rs` | 4 | 中 | -| `src/runner/dispatch.rs` | 4 | 中 | -| `src/runner/pipe_io.rs` | 3 | 中 | -| `src/runner/modes/vm.rs` | 3 | 高 | -| `src/runner/modes/common_util/resolve/using_resolution.rs` | 3 | 中 | - -### 移行方針(Phase 90-A 案) - -**優先経路**: -1. **src/runner/selfhost.rs** (4箇所) - セルフホスト実行経路 -2. **src/runner/modes/vm.rs** (3箇所) - VM実行経路 -3. **src/runner/modes/common_util/resolve/strip.rs** (13箇所) - 名前解決経路 - -**実装方針**: -- `ring0.io.file_read(path) -> Result` -- `ring0.io.file_write(path, content) -> Result<(), IoError>` -- `ring0.io.file_open(path, mode) -> Result` -- `ring0.io.dir_create(path) -> Result<(), IoError>` - -**推定工数**: 10-20箇所の移行(Phase 90-A) - -### 3.2 std::io 系呼び出し - -**調査日**: 2025-12-02 - -- **総出現回数**: **87 箇所**(全体) -- **main codebase (src/ + crates/nyash_kernel/)**: **74 箇所** -- **plugins**: 13 箇所 - -### 代表的な呼び出し - -| 関数 | 用途 | 推定回数 | -|------|------|----------| -| `std::io::Write` | 書き込みトレイト | 30+ | -| `std::io::Read` | 読み込みトレイト | 20+ | -| `std::io::stdin()` | 標準入力 | 10+ | -| `std::io::stdout()` | 標準出力 | 8+ | -| `std::io::stderr()` | 標準エラー | 5+ | -| `BufReader` | バッファ付き読み込み | 5+ | -| `BufWriter` | バッファ付き書き込み | 3+ | - -### 主要ファイル(Top 10) - -| ファイル | 出現回数 | カテゴリ | -|---------|---------|---------| -| `crates/nyash_kernel/src/plugin/console.rs` | 10+ | Ring1 candidate | -| `src/runner/core_executor.rs` | 3 | selfhost | -| `src/runner/stage1_bridge/mod.rs` | 5 | Stage1 | -| `src/runner/pipe_io.rs` | 3 | pipe I/O | -| `src/runtime/ring0/std_impls.rs` | 6 | **Ring0 impl** | - -### 移行方針(Phase 90-B 案) - -**優先経路**: -1. **src/runtime/ring0/std_impls.rs** (6箇所) - 既存Ring0実装の統合 -2. **src/runner/pipe_io.rs** (3箇所) - パイプ入出力経路 -3. **crates/nyash_kernel/src/plugin/console.rs** (10箇所) - Ring1候補として保持 - -**実装方針**: -- `ring0.io.stdin_read() -> Result` -- `ring0.io.stdout_write(s: &str) -> Result<(), IoError>` -- `ring0.io.stderr_write(s: &str) -> Result<(), IoError>` - -**推定工数**: 5-10箇所の移行(Phase 90-B) - -### 3.3 std::time 系呼び出し - -**調査日**: 2025-12-02 - -- **総出現回数**: **143 箇所**(全体) -- **main codebase (src/ + crates/nyash_kernel/)**: **110 箇所** -- **plugins**: 33 箇所 - -### 代表的な呼び出し - -| 関数 | 用途 | 推定回数 | -|------|------|----------| -| `std::time::Instant::now()` | 高精度タイマー | 40+ | -| `std::time::Duration` | 時間間隔 | 30+ | -| `elapsed()` | 経過時間計測 | 25+ | -| `std::time::SystemTime::now()` | システム時刻 | 10+ | - -### 主要ファイル(Top 15) - -| ファイル | 出現回数 | カテゴリ | -|---------|---------|---------| -| `src/runner/modes/bench.rs` | 18 | ベンチマーク | -| `src/boxes/sound_box.rs` | 11 | Box実装 | -| `src/mir/join_ir/lowering/if_dry_runner.rs` | 8 | JoinIR | -| `src/boxes/time_box.rs` | 8 | Box実装 | -| `src/boxes/socket_box.rs` | 7 | Box実装 | -| `src/runtime/global_hooks.rs` | 6 | ランタイム | -| `src/macro/macro_box_ny.rs` | 5 | マクロ | -| `src/runner/modes/common_util/selfhost_exe.rs` | 4 | selfhost | -| `src/runner/modes/common_util/io.rs` | 4 | I/O | -| `src/backend/aot/compiler.rs` | 4 | AOT | - -### 移行方針(Phase 90-C 案) - -**優先経路**: -1. **src/runner/modes/common_util/io.rs** (4箇所) - タイムアウト制御 -2. **src/runner/modes/common_util/selfhost_exe.rs** (4箇所) - セルフホスト実行 -3. **src/runtime/global_hooks.rs** (6箇所) - ランタイムフック - -**実装方針**: -- `ring0.time.now() -> Result` -- `ring0.time.monotonic_now() -> Result` -- `ring0.time.elapsed(start: Instant) -> Duration` -- `ring0.time.sleep(ms: u64) -> Result<(), TimeError>` - -**推定工数**: 10-15箇所の移行(Phase 90-C) - -### 3.4 thread 系呼び出し - -**調査日**: 2025-12-02 - -- **総出現回数**: **37 箇所**(全体) -- **main codebase (src/ + crates/nyash_kernel/)**: **26 箇所** -- **plugins**: 11 箇所 - -### 代表的な呼び出し - -| 関数 | 用途 | 推定回数 | -|------|------|----------| -| `std::thread::sleep()` | スリープ | 20+ | -| `std::thread::spawn()` | スレッド生成 | 10+ | -| `JoinHandle` | スレッド待機 | 5+ | - -### 主要ファイル(Top 10) - -| ファイル | 出現回数 | カテゴリ | -|---------|---------|---------| -| `src/boxes/sound_box.rs` | 11 | Box実装 | -| `src/boxes/p2p_box.rs` | 4 | Box実装 | -| `src/boxes/socket_box.rs` | 1 | Box実装 | -| `src/runtime/global_hooks.rs` | 2 | ランタイム | -| `src/runtime/plugin_loader_unified.rs` | 2 | プラグイン | -| `src/macro/macro_box_ny.rs` | 1 | マクロ | - -### 移行方針(Phase 90-D 案) - -**優先経路**: -1. **src/runtime/global_hooks.rs** (2箇所) - ランタイムフック -2. **src/boxes/sound_box.rs** (11箇所) - Ring1候補として保持 -3. **src/boxes/p2p_box.rs** (4箇所) - Ring1候補として保持 - -**実装方針**: -- `ring0.thread.sleep(ms: u64) -> Result<(), ThreadError>` -- `ring0.thread.spawn(f: F) -> Result` -- `ring0.thread.join(handle: ThreadHandle) -> Result<(), ThreadError>` - -**推定工数**: 3-5箇所の移行(Phase 90-D) +**Considerations**: +- Is this debug output needed in production? +- Should it use Ring0.log.debug()? +- Or should it be removed entirely? +- Or should it use a special dev_* macro? --- -## 4. Phase 90 実装計画案 +#### Category 3: test (~299 locations, LOW priority) -### Phase 90-A: fs 系移行(推定 10-20箇所) +**Description**: Test output and verification messages -**対象**: -- src/runner/selfhost.rs (4箇所) -- src/runner/modes/vm.rs (3箇所) -- src/runner/modes/common_util/resolve/strip.rs (13箇所) +**Target Migration**: **None - keep as-is** -**実装**: -- `ring0.io.file_open(path, mode)` -- `ring0.io.file_read(path)` -- `ring0.io.file_write(path, content)` -- `ring0.io.dir_create(path)` +**Priority**: LOW (safe in isolated environment) -**推定工数**: 2-3時間 +**Phase 99-101 Plan**: No changes -### Phase 90-B: io 系移行(推定 5-10箇所) +**Rationale**: +- Tests run in isolated environments +- println! is appropriate for test output +- No migration needed -**対象**: -- src/runtime/ring0/std_impls.rs (6箇所) -- src/runner/pipe_io.rs (3箇所) - -**実装**: -- `ring0.io.stdin_read()` -- `ring0.io.stdout_write(s)` -- `ring0.io.stderr_write(s)` - -**推定工数**: 1-2時間 - -### Phase 90-C: time 系移行(推定 10-15箇所) - -**対象**: -- src/runner/modes/common_util/io.rs (4箇所) -- src/runner/modes/common_util/selfhost_exe.rs (4箇所) -- src/runtime/global_hooks.rs (6箇所) - -**実装**: -- `ring0.time.now()` -- `ring0.time.monotonic_now()` -- `ring0.time.elapsed(start)` -- `ring0.time.sleep(ms)` - -**推定工数**: 2-3時間 - -### Phase 90-D: thread 系移行(推定 3-5箇所) - -**対象**: -- src/runtime/global_hooks.rs (2箇所) -- src/runtime/plugin_loader_unified.rs (2箇所) - -**実装**: -- `ring0.thread.sleep(ms)` -- `ring0.thread.spawn(f)` -- `ring0.thread.join(handle)` - -**推定工数**: 1-2時間 - -### Phase 90-E: 統合テスト - -**対象**: -- selfhost 実行経路の完全動作確認 -- VM/LLVM バックエンドの動作確認 -- プラグインロードの動作確認 - -**推定工数**: 2-3時間 - -### Phase 90 総推定工数 - -**合計**: 8-13時間(約1-2日) - -**完了条件**: -- ✅ 全 Ring0 候補の移行完了 -- ✅ テスト全パス -- ✅ println!/eprintln! 残存 1,948箇所以下(Phase 89-A から追加なし) +**Example Locations**: +- Test assertion messages +- Test progress indicators +- Debug output during test execution --- -## 5. Phase 90 移行実績(2025-12-03) +#### Category 4: internal (~812 locations, TBD) -### Phase 90-A: fs 系移行(7箇所) +**Description**: Internal processing println! remnants -**FsApi trait 追加**: -- `read_to_string()`, `read()`, `write_all()`, `exists()`, `metadata()`, `canonicalize()` +**Target Migration**: TBD -**移行済みパス**: +**Priority**: To be determined in Phase 99 -| ファイル | 行 | 移行内容 | -|---------|---|---------| -| `src/runner/modes/common_util/resolve/strip.rs` | 550-555 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/modes/common_util/resolve/strip.rs` | 650-655 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/modes/common_util/resolve/strip.rs` | 901-906 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/modes/common_util/resolve/strip.rs` | 941-946 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/dispatch.rs` | 31-33 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/mod.rs` | 122-124 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/mod.rs` | 181-183 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | -| `src/runner/mod.rs` | 288-290 | `std::fs::read_to_string` → `ring0.fs.read_to_string` | +**Phase 99 Scope**: Initial categorization -**移行進捗**: 7/243箇所 (2.9%) - -### Phase 90-B: io 系移行 - -Phase 88 で既に IoApi 実装済みのため、スキップ(stdin/stdout は既存の ring0.io.* を使用)。 - -### Phase 90-C: time 系移行(3箇所) - -**TimeApi に elapsed() 追加**: -- `fn elapsed(&self, start: Instant) -> Duration` - -**移行済みパス**: - -| ファイル | 行 | 移行内容 | -|---------|---|---------| -| `src/runner/modes/common_util/selfhost_exe.rs` | 60-68 | `Instant::now() + elapsed()` → `ring0.time.monotonic_now() + ring0.time.elapsed()` | -| `src/runner/modes/common_util/io.rs` | 22-37 | `Instant::now() + elapsed()` → `ring0.time.monotonic_now() + ring0.time.elapsed()` | -| `src/runtime/plugin_loader_unified.rs` | 330-344 | `Instant::now() + elapsed()` → `ring0.time.monotonic_now() + ring0.time.elapsed()` | - -**移行進捗**: 3/143箇所 (2.1%) - -### Phase 90-D: thread 系移行(2箇所) - -**ThreadApi trait 追加**: -- `fn sleep(&self, duration: Duration)` - -**移行済みパス**: - -| ファイル | 行 | 移行内容 | -|---------|---|---------| -| `src/runtime/global_hooks.rs` | 246-253 | `std::thread::sleep` → `ring0.thread.sleep` | -| `src/runtime/plugin_loader_unified.rs` | 342 | `std::thread::sleep` → `ring0.thread.sleep` | - -**移行進捗**: 2/37箇所 (5.4%) +**Subcategories** (to be refined): +- Internal errors (could use Ring0.log.error) +- State transitions (could use Ring0.log.debug) +- Legacy debug output (could be removed) +- Performance metrics (could use Ring0.log.info) --- -## 6. 今後の棚卸しタスク(Phase 91 以降) +## Section 3: Ring0.log Expansion Plan (Sketch) -- hakmem / nyrt 経由の低レベル API 呼び出し(alloc/free など)を一覧化。 -- 代表パス(selfhost/hack_check/VM/LLVM)のみを対象にした「最小 Ring0 呼び出しセット」を定義する。 -- Ring1-core の境界整理(core_required / core_optional / user_plugin) +### Future Directions (Not Implemented) -これらは Phase 86–87 で Ring0Context に寄せていくための下準備だよ。 +This section outlines **potential** future uses of Ring0.log. Implementation is deferred to Phase 100+. +--- + +#### Option 1: Error Log Consolidation + +**Concept**: Unify error logging through Ring0.log + +**Examples**: +```rust +// VM execution errors +ring0.log.error(&format!("VM execution failed: {}", err)); + +// Parser errors +ring0.log.error(&format!("Parse error at line {}: {}", line, msg)); + +// MIR lowering errors +ring0.log.error(&format!("Lowering failed for {}: {}", node, reason)); +``` + +**Benefits**: +- Centralized error logging +- Consistent error format +- Easy to redirect to files or monitoring systems + +**Phase 99 Decision**: Concept documented, implementation deferred + +--- + +#### Option 2: Internal State Logging + +**Concept**: Use Ring0.log for runtime state tracking + +**Examples**: +```rust +// Memory usage +ring0.log.debug(&format!("Memory allocated: {} bytes", size)); + +// GC triggers +ring0.log.info("Garbage collection triggered"); + +// Cache events +ring0.log.debug(&format!("Cache hit rate: {}%", rate)); +``` + +**Benefits**: +- Non-intrusive diagnostics +- Performance monitoring +- Debugging production issues + +**Phase 99 Decision**: Concept documented, implementation deferred + +--- + +#### Option 3: Execution Tracing + +**Concept**: Trace program execution through Ring0.log + +**Examples**: +```rust +// Function entry/exit +ring0.log.debug(&format!("Entering function: {}", name)); + +// State transitions +ring0.log.info(&format!("State changed: {} -> {}", old, new)); + +// Performance markers +ring0.log.debug(&format!("Operation completed in {}ms", duration)); +``` + +**Benefits**: +- Detailed execution visibility +- Performance profiling +- Bug reproduction + +**Phase 99 Decision**: Concept documented, implementation deferred + +--- + +### Implementation Priority (Future) + +**Phase 100-101 Focus**: User-facing migrations (console_println!) + +**Phase 102+ Candidates**: +1. Error log consolidation (HIGH impact) +2. Internal state logging (MEDIUM impact) +3. Execution tracing (LOW impact, high cost) + +**Decision Point**: After console_println! migration is complete + +--- + +## Section 4: Call Site Distribution + +### By Module (Approximate) + +**src/runner/**: ~366 locations +- Priority: HIGH (user-facing) +- Target: console_println! + +**src/mir/**: ~200 locations +- Priority: MEDIUM (internal/debug) +- Target: Ring0.log or removal + +**src/parser/**: ~150 locations +- Priority: MEDIUM (internal/debug) +- Target: Ring0.log or removal + +**tests/**: ~299 locations +- Priority: LOW (keep as-is) +- Target: None + +**Other**: ~761 locations +- Priority: TBD +- Target: TBD + +--- + +### By Type (Approximate) + +**Error messages**: ~400 locations +- User errors → console_println! +- Internal errors → Ring0.log.error + +**Debug output**: ~600 locations +- Development debug → Ring0.log.debug or removal +- Temporary debug → removal + +**Progress/info**: ~200 locations +- User progress → console_println! +- Internal progress → Ring0.log.info + +**Test output**: ~299 locations +- Keep as-is + +**Other**: ~277 locations +- TBD + +--- + +## Section 5: Migration Roadmap + +### Phase 99 (Current): Documentation & Planning + +**Objectives**: +- ✅ Document Ring0.log infrastructure +- ✅ Categorize remaining println!/eprintln! call sites +- ✅ Establish migration strategy +- ✅ Define completion criteria + +**Deliverables**: +- This document (ring0-inventory.md) +- Logging policy (logging_policy.md) +- Updated core_boxes_design.md Section 15.6-A + +--- + +### Phase 100-101: User-Facing Migrations + +**Objectives**: +- Migrate ~366 user-facing println! to console_println! +- Focus on src/runner/ paths +- Ensure all CLI messages use ConsoleService + +**Estimated Effort**: Medium (straightforward replacements) + +**Success Criteria**: +- All user-visible messages use console_println! +- No println! in main execution paths +- Tests still pass + +--- + +### Phase 102+: Internal Logging + +**Objectives**: +- Evaluate Ring0.log usage for internal logging +- Migrate or remove dev-debug println! +- Consolidate error logging + +**Estimated Effort**: Variable (requires case-by-case analysis) + +**Success Criteria**: +- Clear separation: Ring0.log (internal) vs ConsoleService (user) +- No unnecessary println! in production code +- Test println! remains untouched + +--- + +## Section 6: Grep Commands for Investigation + +### Finding Call Sites + +```bash +# All println!/eprintln! in source code +rg 'println!|eprintln!' --type rust + +# Excluding tests +rg 'println!|eprintln!' --type rust --glob '!**/tests/**' --glob '!**/test_*.rs' + +# Only in src/runner/ +rg 'println!|eprintln!' --type rust src/runner/ + +# Only in src/mir/ +rg 'println!|eprintln!' --type rust src/mir/ + +# Only in tests +rg 'println!|eprintln!' --type rust --glob '**/tests/**' --glob '**/test_*.rs' +``` + +--- + +### Finding console_println! Usage + +```bash +# Current console_println! usage +rg 'console_println!' --type rust + +# Potential candidates for console_println! +rg 'eprintln!\("Error:|Warning:|Info:' --type rust +``` + +--- + +### Finding Ring0.log Usage + +```bash +# Current Ring0.log usage +rg 'ring0\.log\.(debug|info|warn|error)' --type rust + +# LogApi trait implementations +rg 'impl.*LogApi' --type rust +``` + +--- + +## Section 7: Historical Migration Data (Phase 88-90) + +### Phase 88-90: ring0.log.* Migration (56 locations) + +**Migrated Files**: +- `src/runner/selfhost.rs`: 11 locations +- `src/runner/modes/vm.rs`: 22 locations +- `src/runner/modes/vm_fallback.rs`: 4 locations +- `src/runner/modes/common_util/hack_check.rs`: 19 locations + +**Impact**: Consolidated user-facing error messages to Ring0.log.error() + +--- + +### Phase 90: Ring0 API Migration (12 locations) + +**Phase 90-A: fs API (7 locations)**: +- `src/runner/modes/common_util/resolve/strip.rs`: 4 locations +- `src/runner/dispatch.rs`: 1 location +- `src/runner/mod.rs`: 3 locations +- Migration: `std::fs::read_to_string` → `ring0.fs.read_to_string` + +**Phase 90-C: time API (3 locations)**: +- `src/runner/modes/common_util/selfhost_exe.rs`: 1 location +- `src/runner/modes/common_util/io.rs`: 1 location +- `src/runtime/plugin_loader_unified.rs`: 1 location +- Migration: `Instant::now() + elapsed()` → `ring0.time.monotonic_now() + ring0.time.elapsed()` + +**Phase 90-D: thread API (2 locations)**: +- `src/runtime/global_hooks.rs`: 1 location +- `src/runtime/plugin_loader_unified.rs`: 1 location +- Migration: `std::thread::sleep` → `ring0.thread.sleep` + +--- + +## Section 8: Success Metrics + +### Completion Criteria + +**Phase 99 Complete** when: +- ✅ Ring0.log infrastructure documented +- ✅ println!/eprintln! call sites categorized +- ✅ Migration strategy established +- ✅ Roadmap defined for Phase 100+ + +**Phase 100-101 Complete** when: +- All user-facing println! migrated to console_println! +- src/runner/ paths use ConsoleService exclusively +- Test println! remains untouched + +**Phase 102+ Complete** when: +- Internal logging uses Ring0.log appropriately +- No unnecessary println! in production code +- Clear separation of concerns maintained + +--- + +## Related Documentation + +- [Logging Policy](logging_policy.md) - Role separation and macro policy +- [CoreBoxes Design - Section 15.6-A](core_boxes_design.md#section-156-a-logsoutput-unified-design) - Architectural context +- [Phase 85 CURRENT_TASK](../../../CURRENT_TASK.md) - Implementation timeline + +--- + +## Summary + +Phase 99 establishes a **clear inventory** of logging infrastructure and println! call sites: + +1. **Ring0.log**: Underutilized, ready for expansion +2. **println!/eprintln!**: 1477 production call sites categorized into 4 groups +3. **Migration strategy**: Phased approach starting with user-facing messages +4. **Success criteria**: Clear metrics for each phase + +**Next Steps**: Phase 100+ will implement gradual migrations based on this inventory.