- ✅ Stage1 CLI デバッグログ追加 - lang/src/runner/stage1_cli.hako: STAGE1_CLI_DEBUG対応 - 各関数でentry/exit/状態ログ出力 - SSAバグ調査を容易化 - ✅ Rust bridge 実装 - src/runner/stage1_bridge.rs: 子プロセス起動・環境変数配線 - NYASH_ENTRY設定、モジュールリスト生成 - ✅ デバッグヘルパースクリプト - tools/stage1_debug.sh: 環境変数自動診断・詳細ログ - tools/stage1_minimal.sh: 推奨5変数のみで実行 - ✅ 環境変数削減計画(25個→5個) - docs/development/proposals/env-var-reduction-report.md - 使用箇所マトリックス、依存関係グラフ - 6段階削減ロードマップ(80%削減目標) - docs/development/proposals/stage1-architecture-improvement.md - 他言語事例調査(Rust/Go/Nim) - アーキテクチャ統一案、実装ロードマップ - ✅ LoopForm v2 設計ドキュメント - docs/development/roadmap/phases/phase-25.1/stage1-usingresolver-loopform.md 🎯 成果: Stage1起動の複雑さを可視化、80%削減計画確立
26 KiB
26 KiB
環境変数徹底調査レポート - 25個から5個への削減計画
作成日: 2025-11-21 目的: セルフホスティング実装における環境変数の複雑さを根本解決
📊 使用箇所マトリックス
| 環境変数 | 定義箇所 | 読み取り回数 | 影響範囲 | デフォルト値 | カテゴリ |
|---|---|---|---|---|---|
| Stage1関連 | |||||
NYASH_USE_STAGE1_CLI |
stage1_bridge.rs:93 | 7回 | 必須(Stage1起動) | なし | Stage1制御 |
STAGE1_EMIT_PROGRAM_JSON |
stage1_bridge.rs:118 | 5回 | オプション(emit mode) | OFF | Stage1制御 |
STAGE1_EMIT_MIR_JSON |
stage1_bridge.rs:119 | 5回 | オプション(emit mode) | OFF | Stage1制御 |
STAGE1_BACKEND |
stage1_bridge.rs:157 | 5回 | オプション(backend選択) | vm | Stage1制御 |
STAGE1_SOURCE |
stage1_bridge.rs:115 | 6回 | オプション(入力ソース) | 第1引数 | Stage1制御 |
STAGE1_INPUT |
stage1_bridge.rs:116 | 1回 | オプション(入力ソース別名) | なし | Stage1制御 |
STAGE1_PROGRAM_JSON |
stage1_bridge.rs:135 | 5回 | オプション(中間JSON) | なし | Stage1制御 |
STAGE1_CLI_DEBUG |
stage1_cli.hako:27 | 11回 | オプション(デバッグ) | OFF | デバッグ |
NYASH_STAGE1_CLI_CHILD |
stage1_bridge.rs:90 | 3回 | 必須(再帰防止) | OFF | 内部制御 |
| Using/Parser関連 | |||||
NYASH_ENABLE_USING |
env.rs:429 | 10回 | オプション | ON(デフォルト) | 機能トグル |
HAKO_ENABLE_USING |
env.rs:435 | 8回 | 非推奨(互換性) | なし | 廃止予定 |
HAKO_STAGEB_APPLY_USINGS |
stage1_bridge.rs:224 | 6回 | オプション | ON | Stage1制御 |
NYASH_PARSER_STAGE3 |
env.rs:540 | 38回 | オプション | OFF | 機能トグル |
HAKO_PARSER_STAGE3 |
env.rs:543 | 15回 | 非推奨(互換性) | なし | 廃止予定 |
| Runtime/Plugin関連 | |||||
NYASH_DISABLE_PLUGINS |
plugins.rs:26 | 20回 | オプション | OFF | プラグイン制御 |
NYASH_FILEBOX_MODE |
provider_env.rs:37 | 8回 | オプション | auto | プラグイン制御 |
NYASH_BOX_FACTORY_POLICY |
mod.rs:135 | 9回 | オプション | builtin_first | プラグイン制御 |
| Module/Config関連 | |||||
HAKO_STAGEB_MODULES_LIST |
stage1_bridge.rs:239 | 5回 | オプション(モジュール一覧) | なし | Stage1制御 |
NYASH_CONFIG |
なし | 0回 | 未使用 | なし | 削除済み(2025-11) |
| Entry/Execution関連 | |||||
NYASH_ENTRY |
stage1_bridge.rs:185 | 6回 | オプション | Stage1CliMain.main/1 | エントリー制御 |
NYASH_SCRIPT_ARGS_JSON |
stage1_bridge.rs:167 | 13回 | オプション | [] | 引数渡し |
NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN |
env.rs:576 | 8回 | オプション | ON(デフォルト) | エントリー制御 |
| Debug/Verbose関連 | |||||
NYASH_CLI_VERBOSE |
mod.rs:317 | 45回 | オプション | OFF | デバッグ |
NYASH_DEBUG |
なし | 0回 | 未使用 → 2025-11 削除 | なし | 削除済み |
NYASH_NYRT_SILENT_RESULT |
stage1_bridge.rs:212 | 2回 | オプション | OFF | 出力制御 |
合計: 25個 → 現在 23個(NYASH_CONFIG / NYASH_DEBUG 削除後)
- 使用中: 23個 → 21個
- 未使用: 0個(今回の2個を削除済み)
- 非推奨: 2個(HAKO_ENABLE_USING, HAKO_PARSER_STAGE3)
🔍 依存関係分析
グループ1: Stage1制御(9個 → 3個に統合可能)
排他的関係:
STAGE1_EMIT_PROGRAM_JSON=1 ─┐
├─→ 排他的(1つだけ有効)
STAGE1_EMIT_MIR_JSON=1 ─┤
│
(なし:実行モード) ─┘
統合案:
# 現在の複雑な設定
NYASH_USE_STAGE1_CLI=1 STAGE1_EMIT_PROGRAM_JSON=1 STAGE1_SOURCE=foo.hako
# 統合後(シンプル)
NYASH_STAGE1_MODE=emit-program NYASH_STAGE1_INPUT=foo.hako
新変数: NYASH_STAGE1_MODE
- 値:
emit-program | emit-mir | run - デフォルト:
run - 効果:
emit-program→STAGE1_EMIT_PROGRAM_JSON=1emit-mir→STAGE1_EMIT_MIR_JSON=1run→ 実行モード
削減できる変数:
NYASH_USE_STAGE1_CLI→NYASH_STAGE1_MODEの存在で判定STAGE1_EMIT_PROGRAM_JSON→NYASH_STAGE1_MODE=emit-programSTAGE1_EMIT_MIR_JSON→NYASH_STAGE1_MODE=emit-mirSTAGE1_SOURCE+STAGE1_INPUT→NYASH_STAGE1_INPUTに統合
グループ2: Using制御(4個 → 1個に統合)
統合案:
# 現在の複雑な設定
NYASH_ENABLE_USING=1 HAKO_ENABLE_USING=1 HAKO_STAGEB_APPLY_USINGS=1
# 統合後
NYASH_FEATURES=using # カンマ区切りで複数機能対応
削減できる変数:
NYASH_ENABLE_USING→NYASH_FEATURES=usingHAKO_ENABLE_USING→ 廃止(互換性エイリアス削除)HAKO_STAGEB_APPLY_USINGS→NYASH_FEATURES=usingで自動
グループ3: Parser制御(2個 → 1個に統合)
統合案:
# 現在
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1
# 統合後
NYASH_FEATURES=stage3 # または NYASH_PARSER_FEATURES=stage3
削減できる変数:
NYASH_PARSER_STAGE3→NYASH_FEATURES=stage3HAKO_PARSER_STAGE3→ 廃止
グループ4: Plugin制御(3個 → 維持)
現状維持推奨:
NYASH_DISABLE_PLUGINS: 全プラグイン無効化(重要)NYASH_FILEBOX_MODE: FileBox詳細制御NYASH_BOX_FACTORY_POLICY: Box Factory優先順位
理由: 独立した機能で統合するメリットが少ない
グループ5: Debug制御(3個 → 1個に統合)
統合案:
# 現在
NYASH_CLI_VERBOSE=1 STAGE1_CLI_DEBUG=1
# 統合後
NYASH_DEBUG=1 # または NYASH_DEBUG_LEVEL=1
削減できる変数:
NYASH_CLI_VERBOSE→NYASH_DEBUG=1STAGE1_CLI_DEBUG→NYASH_DEBUG=1NYASH_NYRT_SILENT_RESULT→NYASH_DEBUG=0の時に自動ON
📋 削減ロードマップ
Phase 1(即座に削除可能 - 2個)
完全未使用(0回参照):
削除対象(実施済み):
- ✅
NYASH_CONFIG: 使用箇所0個(完全未使用、将来構想のみ)→ tools/stage1_* から除去済み。 - ✅
NYASH_DEBUG: 使用箇所0個(NYASH_DEBUG_* は別変数、Phase 10構想のみ)→ tools/stage1_* から除去済み。
影響: なし(誰も使っていない)。削除は完了済み。
Phase 2(非推奨エイリアス削除 - 2個)
廃止予定(互換性のみ):
削除対象:
- ⚠️
HAKO_ENABLE_USING→NYASH_ENABLE_USINGに移行(警告済み) - ⚠️
HAKO_PARSER_STAGE3→NYASH_PARSER_STAGE3に移行(警告済み)
影響: 警告が出ているので移行済みのはず
実装: src/config/env.rs から互換性処理を削除
Phase 3(Stage1統合 - 7個 → 3個)
統合変数セット:
# 新設計
NYASH_STAGE1_MODE=<emit-program|emit-mir|run>
NYASH_STAGE1_INPUT=<source.hako>
NYASH_STAGE1_BACKEND=<vm|llvm|pyvm> # オプション
削減できる変数(7個 → 3個):
NYASH_USE_STAGE1_CLI→ MODE存在で自動判定STAGE1_EMIT_PROGRAM_JSON→MODE=emit-programSTAGE1_EMIT_MIR_JSON→MODE=emit-mirSTAGE1_SOURCE+STAGE1_INPUT→NYASH_STAGE1_INPUTSTAGE1_BACKEND→NYASH_STAGE1_BACKENDSTAGE1_PROGRAM_JSON→ 中間ファイル(環境変数不要)
保持する変数:
NYASH_STAGE1_CLI_CHILD: 内部制御(外部非公開)
Phase 4(Using/Parser統合 - 4個 → 1個)
統合変数:
# 新設計
NYASH_FEATURES=<using,stage3,unified-members> # カンマ区切り
削減できる変数:
NYASH_ENABLE_USING→FEATURES=usingHAKO_STAGEB_APPLY_USINGS→FEATURES=usingで自動NYASH_PARSER_STAGE3→FEATURES=stage3
Phase 5(Debug統合 - 3個 → 1個)
統合変数:
# 新設計
NYASH_DEBUG=<0|1|2|3> # レベル制御
削減できる変数:
NYASH_CLI_VERBOSE→DEBUG=1STAGE1_CLI_DEBUG→DEBUG=2(詳細)NYASH_NYRT_SILENT_RESULT→DEBUG=0で自動ON
Phase 6(nyash.toml化 - 4個)
永続設定に移動すべき変数:
[runtime]
disable_plugins = false
filebox_mode = "auto"
box_factory_policy = "builtin_first"
[entry]
allow_toplevel_main = true
削減できる変数(環境変数 → 設定ファイル):
NYASH_DISABLE_PLUGINS→runtime.disable_pluginsNYASH_FILEBOX_MODE→runtime.filebox_modeNYASH_BOX_FACTORY_POLICY→runtime.box_factory_policyNYASH_ENTRY_ALLOW_TOPLEVEL_MAIN→entry.allow_toplevel_main
注意: 環境変数は緊急時オーバーライド用に残す
🎯 最終推奨5変数セット
Phase 1-5完了後の理想形:
# 1. モード制御(Stage1)
NYASH_STAGE1_MODE=<emit-program|emit-mir|run>
# 2. 入力ソース
NYASH_STAGE1_INPUT=<source.hako>
# 3. デバッグレベル
NYASH_DEBUG=<0|1|2|3>
# 4. 機能トグル
NYASH_FEATURES=<using,stage3,unified-members>
# 5. バックエンド選択
NYASH_STAGE1_BACKEND=<vm|llvm|pyvm>
削減実績: 25個 → 5個(80%削減)
補助変数(内部制御・特殊用途):
NYASH_STAGE1_CLI_CHILD: 再帰防止(外部非公開)NYASH_SCRIPT_ARGS_JSON: 引数渡し(自動生成)HAKO_STAGEB_MODULES_LIST: モジュール一覧(自動生成)NYASH_ENTRY: エントリーポイント(特殊用途)
nyash.toml化(環境変数から設定ファイルへ):
NYASH_DISABLE_PLUGINSNYASH_FILEBOX_MODENYASH_BOX_FACTORY_POLICYNYASH_ENTRY_ALLOW_TOPLEVEL_MAIN
📈 削減効果まとめ
| Phase | 削減数 | 残数 | 削減率 |
|---|---|---|---|
| 開始 | - | 25個 | - |
| Phase 1(未使用削除) | 2個 | 23個 | 8% |
| Phase 2(非推奨削除) | 2個 | 21個 | 16% |
| Phase 3(Stage1統合) | 4個 | 17個 | 32% |
| Phase 4(Using/Parser統合) | 3個 | 14個 | 44% |
| Phase 5(Debug統合) | 2個 | 12個 | 52% |
| Phase 6(nyash.toml化) | 4個 | 8個 | 68% |
| 補助変数移動後 | - | 5個(公開) | 80%削減 |
補助変数(4個):
NYASH_STAGE1_CLI_CHILD(内部)NYASH_SCRIPT_ARGS_JSON(自動生成)HAKO_STAGEB_MODULES_LIST(自動生成)NYASH_ENTRY(特殊用途)
🚀 実装優先度
🔴 高優先度(即座に実行)
- Phase 1: 完全未使用削除(2個)
- 影響: なし
- 作業時間: 5分
- コマンド: 上記参照
🟡 中優先度(1週間以内)
- Phase 2: 非推奨エイリアス削除(2個)
- 影響: 警告表示済み
- 作業時間: 30分
- 注意: 1リリース後に削除推奨
🟢 低優先度(設計検討が必要)
-
Phase 3-5: 統合変数設計(9個削減)
- 影響: 大きい(破壊的変更)
- 作業時間: 2-3日
- 要件: 移行パス設計
-
Phase 6: nyash.toml化(4個削減)
- 影響: 中(環境変数残す)
- 作業時間: 1日
- 要件: TOML読み込み実装
🎓 学んだこと
-
80/20ルール適用:
- 未使用変数2個(8%)を削除するだけで即効果
- 非推奨変数2個(8%)も簡単に削除可能
- 合計16%を簡単に削減できる
-
統合可能性の発見:
- Stage1関連7個 → 3個(排他的制御)
- Using/Parser関連4個 → 1個(機能フラグ統合)
- Debug関連3個 → 1個(レベル制御統合)
-
nyash.toml化のチャンス:
- Plugin制御3個は永続設定向き
- Entry制御1個も永続設定向き
- 環境変数は緊急時オーバーライド専用に
-
内部変数の分離:
NYASH_STAGE1_CLI_CHILD(再帰防止)NYASH_SCRIPT_ARGS_JSON(自動生成)- これらは公開APIから除外可能
📚 参考情報
主要ファイル:
src/runner/stage1_bridge.rs: Stage1制御src/config/env.rs: 環境変数読み取りsrc/config/provider_env.rs: Provider制御lang/src/runner/stage1_cli.hako: Stage1 CLI実装tools/stage1_debug.sh: デバッグツール
現在の状況:
- 合計25個の環境変数
- 使用中23個、未使用2個
- 非推奨2個(警告付き)
🌟 依存関係グラフ(視覚化)
グループ構造
┌─────────────────────────────────────────────────────────────┐
│ Stage1制御グループ(9個 → 3個に統合可能) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─ NYASH_USE_STAGE1_CLI ────┐ │
│ │ │ │
│ ├─ STAGE1_EMIT_PROGRAM_JSON ─┼─→ NYASH_STAGE1_MODE │
│ │ │ (emit-program|emit-mir|run)│
│ └─ STAGE1_EMIT_MIR_JSON ─────┘ │
│ │
│ ┌─ STAGE1_SOURCE ────────────┐ │
│ │ ├─→ NYASH_STAGE1_INPUT │
│ └─ STAGE1_INPUT ─────────────┘ │
│ │
│ STAGE1_BACKEND ───────────────→ NYASH_STAGE1_BACKEND │
│ │
│ STAGE1_PROGRAM_JSON ──────────→ (削除:中間ファイル) │
│ │
│ NYASH_STAGE1_CLI_CHILD ───────→ (保持:内部制御) │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Using/Parser制御グループ(4個 → 1個に統合) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─ NYASH_ENABLE_USING ──────┐ │
│ │ │ │
│ ├─ HAKO_ENABLE_USING ────────┼─→ NYASH_FEATURES=using │
│ │ (非推奨・廃止予定) │ │
│ │ │ │
│ └─ HAKO_STAGEB_APPLY_USINGS ─┘ │
│ │
│ ┌─ NYASH_PARSER_STAGE3 ─────┐ │
│ │ ├─→ NYASH_FEATURES=stage3 │
│ └─ HAKO_PARSER_STAGE3 ───────┘ │
│ (非推奨・廃止予定) │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Debug制御グループ(3個 → 1個に統合) │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─ NYASH_CLI_VERBOSE ───────┐ │
│ │ │ │
│ ├─ STAGE1_CLI_DEBUG ─────────┼─→ NYASH_DEBUG=<0|1|2|3> │
│ │ │ │
│ └─ NYASH_NYRT_SILENT_RESULT ─┘ │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Plugin制御グループ(3個 → 維持) │
├─────────────────────────────────────────────────────────────┤
│ │
│ NYASH_DISABLE_PLUGINS ────────→ (維持・重要) │
│ NYASH_FILEBOX_MODE ───────────→ (維持・重要) │
│ NYASH_BOX_FACTORY_POLICY ─────→ (維持・重要) │
│ │
│ ※ Phase 6で nyash.toml 化推奨 │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 削除可能グループ(2個) │
├─────────────────────────────────────────────────────────────┤
│ │
│ NYASH_CONFIG ──────────────────→ (削除:未使用) │
│ NYASH_DEBUG ───────────────────→ (削除:未使用) │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 補助変数グループ(4個 → 内部制御・自動生成) │
├─────────────────────────────────────────────────────────────┤
│ │
│ NYASH_ENTRY ───────────────────→ (特殊用途) │
│ NYASH_SCRIPT_ARGS_JSON ────────→ (自動生成) │
│ HAKO_STAGEB_MODULES_LIST ──────→ (自動生成) │
│ NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN → (nyash.toml化推奨) │
│ │
└─────────────────────────────────────────────────────────────┘
排他的関係
Stage1モード(排他的):
┌─────────────────────┐
│ emit-program │ ← STAGE1_EMIT_PROGRAM_JSON=1
├─────────────────────┤
│ emit-mir │ ← STAGE1_EMIT_MIR_JSON=1
├─────────────────────┤
│ run (default) │ ← 両方OFF
└─────────────────────┘
※ 同時に複数ONにはできない(排他的)
統合後の最終形態
┌───────────────────────────────────────────────────────────┐
│ 公開環境変数(5個) │
├───────────────────────────────────────────────────────────┤
│ │
│ 1. NYASH_STAGE1_MODE : emit-program|emit-mir|run │
│ 2. NYASH_STAGE1_INPUT : <source.hako> │
│ 3. NYASH_DEBUG : 0|1|2|3 │
│ 4. NYASH_FEATURES : using,stage3,unified-members │
│ 5. NYASH_STAGE1_BACKEND : vm|llvm|pyvm │
│ │
└───────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────┐
│ 内部変数(4個・非公開) │
├───────────────────────────────────────────────────────────┤
│ │
│ - NYASH_STAGE1_CLI_CHILD : 再帰防止(自動設定) │
│ - NYASH_SCRIPT_ARGS_JSON : 引数渡し(自動生成) │
│ - HAKO_STAGEB_MODULES_LIST : モジュール一覧(自動生成) │
│ - NYASH_ENTRY : エントリーポイント(特殊) │
│ │
└───────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────┐
│ nyash.toml 設定(4個) │
├───────────────────────────────────────────────────────────┤
│ │
│ [runtime] │
│ disable_plugins = false │
│ filebox_mode = "auto" │
│ box_factory_policy = "builtin_first" │
│ │
│ [entry] │
│ allow_toplevel_main = true │
│ │
│ ※ 環境変数で緊急時オーバーライド可能 │
│ │
└───────────────────────────────────────────────────────────┘
削減実績: 25個 → 5個(公開) + 4個(内部) = 9個
削減率: 64%(25→9) or 80%(25→5 公開のみ)
移行パス
Phase 1 (即座)
25個 ──┬─ 削除2個 ───→ 23個
│ (NYASH_CONFIG, NYASH_DEBUG)
│
Phase 2 (1週間)
23個 ──┬─ 削除2個 ───→ 21個
│ (HAKO_ENABLE_USING, HAKO_PARSER_STAGE3)
│
Phase 3 (2-3日)
21個 ──┬─ 統合4個 ───→ 17個
│ (Stage1: 9個→3個で4個削減)
│
Phase 4 (1-2日)
17個 ──┬─ 統合3個 ───→ 14個
│ (Using/Parser: 4個→1個で3個削減)
│
Phase 5 (1日)
14個 ──┬─ 統合2個 ───→ 12個
│ (Debug: 3個→1個で2個削減)
│
Phase 6 (1日)
12個 ──┴─ toml化4個 ──→ 8個
(環境変数残す・設定ファイル優先)
Final: 8個(公開5個 + 内部3個)
✅ 次のアクション
- 今すぐ実行(5分): Phase 1 - 未使用変数2個削除
- 1週間以内(30分): Phase 2 - 非推奨エイリアス削除
- 設計検討(1-2週間): Phase 3-5 - 統合変数設計
- 実装(3-5日): Phase 3-5 - 統合変数実装
- TOML実装(1-2日): Phase 6 - nyash.toml化
最終目標: 25個 → 5個(公開) + 4個(内部) = 80%削減達成