Files
hakorune/CURRENT_TASK.md
Moe Charm fff9749f47 📚 Reorganize CLAUDE.md: slim down from 916 to 395 lines with proper doc links
- Keep essential information within 500 lines (now 395 lines)
- Maintain important syntax examples and development principles
- Move detailed information to appropriate docs files:
  - Development practices → docs/guides/development-practices.md
  - Testing guide → docs/guides/testing-guide.md
  - Claude issues → docs/tools/claude-issues.md
- Add proper links to all referenced documentation
- Balance between minimal entry point and practical usability
2025-08-31 06:22:48 +09:00

23 KiB
Raw Blame History

CURRENT TASK (Phase 10.8: MIR Core-15 確定 → LLVM 準備)

Update (2025-08-31 AM / Phase 11.1 quick pass)

Update (2025-08-31 PM / Phase 11.2 partial)

  • 方式ALLVM専用 NyRT 静的ライブラリで前進。by-id を本線、by-name はデバッグ用ラッパ方針。
  • Lowering 更新
    • NewBox引数あり 12個nyash.box.birth_i64(type_id, argc, a1, a2)int/handle ptr の最小対応。0引数は birth_h
    • BoxCallby-id, method_idありnyash_plugin_invoke3_i64(type_id, method_id, argc, a0, a1, a2) 接続a0=receiver handle
      • 戻り: dstが整数/真偽ならi64のまま、Box/String/Array等は i64(handle)→i8*(ptr)
      • ArrayBox.get/set は既存の nyash_array_get_h/set_h 安全パスを存続
    • 生成関数名: ny_main に変更NyRTの起動ルーチンから呼び出し
  • NyRT(libnyrt.a) 追加シンボル
    • nyash_string_new(i8*, i32)->i8*Const String用
    • nyash_array_get_h(i64,i64)->i64, nyash_array_set_h(i64,i64,i64)->i64
    • 既存の nyash.box.birth_h/i64, nyash.rt.checkpoint, nyash.gc.barrier_write などは維持
  • ツール
    • tools/build_llvm.sh 追加(.o → libnyrt.a リンク → EXE
    • tools/llvm_smoke.sh.o生成のスモーク
  • スモーク
    • examples/llvm11_core_smoke.nyash で EXE 実行し Result: 3 を確認

残作業(合意順)

  1. method_id 埋め込みと by-id 本線化
    • ロード時に 名前→id を確定・キャッシュPluginLoaderV2し、MIR へ method_id 注入(実行時は常に by-id
  2. BoxCall 汎用拡張
    • 引数3個以上/戻り型の拡張i64/handle/f64 等。Field 系getField/setFieldを BoxCall として安全パス接続
  3. by-name ラッパ(デバッグ/テスト用)
    • Lowering フォールバックとして薄く導入env/flag 下でのみ使用)、本番は by-id 固定
  4. ExternCall 網羅
    • env.console/debug/runtime/future 等を puts 暫定から RT関数に置換、署名整備
  5. スモーク/CI 拡張
    • by-id の代表例CounterBox等、console/array/field/extern を .o→EXE→起動まで
  • LLVM Lowering: Phi/Load/Store の最小実装を追加inkwell 0.5 / LLVM 18
    • Phi: 事前に各BB先頭でPhiード生成→Branch/Jump時にincomingを配線
    • Load/Store: entryでのalloca管理型は注釈/値から推定。i1/i64の簡易変換、ポインタはpointer_cast対応
    • 型なしポインタopaque対応のため、allocaの要素型を別マップで追跡
  • ビルド検証: LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --features llvm 成功
  • 既存のConst/Unary/BinOp/Compare/Branch/Jump/Return と併せ、Phase 11.1の目標範囲は到達

Handoff Snapshot (2025-08-31 / Phase 11 kick-off)

  • Core-15 凍結(第三案 / Box-SSA
    • セット: { Const, UnaryOp, BinOp, Compare, TypeOp, Load, Store, Jump, Branch, Return, Phi, Call, NewBox, BoxCall, ExternCall }
    • Optimizer: ArrayGet/ArraySet/RefGet/RefSet/PluginInvoke → BoxCall に正規化get/set/getField/setField
    • Verifier: 上記レガシー命令を UnsupportedLegacyInstruction としてエラー化(環境で一時解除可: NYASH_VERIFY_ALLOW_LEGACY=1
  • VM: BoxCall("getField"/"setField") を InstanceBox に配線fieldsへ委譲。Arrayの get/set は既存BoxCall経路で動作
  • 命令数固定テスト: Core15第三案へ切替済tests/mir_instruction_set_sync.rs
  • LLVM 導入Phase 11 開始)
    • 依存: LLVM 18 + inkwell 0.5.0features=["llvm18-0"]。feature llvm で有効化
    • ビルド要件: LLVM_SYS_180_PREFIX例: /usr/lib/llvm-18, 追加依存: polly, zstdlibzstd-dev 等)
    • 現状のLowering11.1の最小スケルトン → 11.2 反映):
      • 対応: Const(Integer/Float/Bool/String/Null), Unary(Neg/Not/BitNot), BinOp整数/浮動の主要演算), Compare, Branch/Jump, Return
      • 追加: Phi/Load/Store最小実装
      • 追加: NewBox引数なし→nyash.box.birth_hへ; nyash.tomlの[box_types]からtype_id解決
      • 追加: BoxCallArrayBox.get/set→nyash_array_get_h/set_h 経由の安全パス)
      • 追加: ExternCallenv.console.log/env.debug.trace→libc putsで暫定出力
      • 未対応(次タスク): NewBox引数あり, 一般BoxCallby-name/slot 汎用化), その他ExternCall
    • エントリ: Main.main のみ対象に .o 出力backend::llvm::compile_to_object
  • ドキュメント更新phase11
    • README.md: 進行中に更新 / 4週スプリント計画11.1→11.4
    • MIR_TO_LLVM_CONVERSION_PLAN.md: PluginInvoke→BoxCall統一、配列はBoxCallとして安全パス→型特化の二段階Lowering
    • MIR_ANNOTATION_SYSTEM.md: setField/getFieldBoxCall前提に更新
    • INSTRUCTION_SET.md: PluginInvokeはDeprecatedBoxCallに統一

How to Build/Run (recap)

  • 通常/JIT: cargo build --release --features cranelift-jit
  • LLVMAOTスケルトン:
    • 事前: LLVM 18 / inkwell 0.5.0, polly, zstd を導入
    • 例: LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) cargo build --release --features llvm
  • スモーク: tools/mir15_smoke.sh release

Next Steps (Phase 11)

  1. 11.1 仕上げ(本タスク)
    • Phi のLoweringBB事前作成→incoming追加
    • Load/Storealloca/ローカル表現の最小規約、整数/浮動/ポインタ)
  2. 11.2 安全パスBox/Extern
    • [実装] NewBox(引数なし)→ nyash.box.birth_h(type_id:i64)->i64 を呼び、i8*にinttoptrtype_idはnyash.tomlから解決
    • [実装] Arrayの BoxCall("get"/"set") → nyash_array_get_h/set_hハンドルi64渡し
    • [実装] ExternCall: env.console.log/env.debug.trace は暫定で puts に接続AOTデバッグ用
    • [残] BoxCall 汎用by-name/slot, Field系getField/setField, ExternCallの網羅
  3. 11.3 最適化導線
    • 注釈inline/purity/gc/alias→ LLVM属性/メタデータ
    • 型特化: Array/Field の inline GEP + write barrier
  4. 11.4 高度化
    • 脱箱化、TBAA、PGO/ThinLTO

メモ

  • Verifier の緩和スイッチ: NYASH_VERIFY_ALLOW_LEGACY=1移行用。通常はOFFで運用。
  • Optimizer のRewrite はLLVM前提のBoxCall統一規約と整合済み。

最優先: MIR命令セットをCore-15に統一し、VM/JIT/AOTを整えてからLLVM(inkwell)へ移行する。

目的: MIR→VM→JIT→AOT の汎用化・単純化を一気に進める。命令の重複・メタ・実装露出を撤去/統合し、Builderが実際に発行するコア命令を最小化する。

現状観測2025-08-31

  • 実装定義: 37命令src/mir/instruction.rs
  • Docs: Canonical 26移行注記・Core-15ターゲット追記済
  • Builder使用: 24命令自動集計
    • 上位頻度: Const(19), TypeOp(13), Jump(6), ExternCall(5), Return(3), Call(3)
    • 中頻度: NewBox(2), WeakRef(2), Barrier(2), BoxCall(1), Branch(1), Phi(1), PluginInvoke(1), Await(1)
  • JITサポート: 約20命令ホストコール分は外部委譲で簡素

統合方針Core-15

  • 重複統合
    • TypeCheck, Cast → TypeOp に完全統合Builder 既に主に TypeOp を発行)
    • WeakNew, WeakLoad → WeakRef に統合
    • BarrierRead, BarrierWrite → Barrier に統合
  • Box哲学へ移譲
    • Print → env.console.log (ExternCall)Builder更新済
    • Debug → DebugBox.trace()/env.debug.traceExternCall/BoxCall
    • Throw, Catch → ExceptionBoxthrow/catch相当のBox APIへ移譲; 移行期はRewrite
    • Safepoint → RuntimeBox.checkpointExternCall
  • 未使用/メタ
    • FutureSet → 一旦廃止Builder未使用
    • Copy, Nop → メタ命令Optim/降格専用; Coreからは除外

最終ターゲット: Core-15 命令

  • 基本演算(5): Const, UnaryOp, BinOp, Compare, TypeOp
  • メモリ(2): Load, Store
  • 制御(4): Branch, Jump, Return, Phi
  • Box(3): NewBox, BoxCall, PluginInvoke
  • 配列(2): ArrayGet, ArraySet
  • 外部(1): ExternCall暫定; 将来はBox化でも可

進め方Core-15確定 → LLVM

  1. Builder発行の一元化非破壊
    • 既に Print→ExternCall 置換済み
    • Builderが TypeCheck/Cast/WeakNew/WeakLoad/BarrierRead/BarrierWrite を発行しないよう整理(既存箇所の差し替え)
    • 既存テストbuilder/optimizerを ExternCall/TypeOp/WeakRef/Barrier に合わせて更新
  2. 互換Rewriteパスの追加MIR最適化フェーズ
    • 古いMIR手書き/スナップショット/ツール)が生成した命令をコア命令に機械的変換
      • TypeCheck/Cast → TypeOp
      • WeakNew/WeakLoad → WeakRef
      • BarrierRead/Write → Barrier
      • Print → ExternCall(env.console.log)
      • Debug → ExternCall(env.debug.trace)
      • Throw/Catch → ExternCall(env.exception.*) もしくは BoxCall(ExceptionBox)
      • Safepoint → ExternCall(env.runtime.checkpoint)
  3. VM/JITの段階撤去と整理
    • VM/JIT: コア命令に集中(ホストコール/Box経由のI/Oや例外
  4. Docs/CI
    • INSTRUCTION_SET をCore-15へ更新26→15マッピング表
    • 命令数固定テストを「15」に切替

タスク分解(本フェーズ)

  • Builderからのレガシー発行のデフォルト停止WeakNew/WeakLoad/BarrierRead/Writeを統一命令に切替、トグルで復活可
  • MIR Rewriteパス追加一部完了: Print/Type/Weak/Barrier、Debug/Safepointはトグル
  • Optimizer/Verifier/Printerの非互換の見直しVerifierでレガシー命令をエラー化
  • VM: レガシー命令のコードパスに警告ログ(将来削除フラグ)
  • JIT: コア命令に合わせたテーブル整理(未使用ホストコールの棚卸し)
  • Docs更新命令セット、移行ガイド、Box哲学との整合
  • 回帰テスト更新builder_modularizedを含む一式

追加の即応ステップ10.8a

  • Rewrite: Print → ExternCall(env.console.log)
  • Rewrite: TypeCheck/Cast → TypeOp、WeakNew/WeakLoad → WeakRef、BarrierRead/Write → Barrier
  • Rewrite(トグル): Debug → ExternCall(env.debug.trace)NYASH_REWRITE_DEBUG=1
  • Rewrite(トグル): Safepoint → ExternCall(env.runtime.checkpoint)NYASH_REWRITE_SAFEPOINT=1
  • Builder: Try/Catch/Throw/Safepoint の直接発行を抑止(トグル導入・モジュール化系にも適用)
  • Runtime: extern_call スタブ追加env.runtime.checkpoint, env.debug.trace
  • Rewrite(トグル・スキャフォールド): FutureNew/FutureSet/Await → ExternCall(env.future.*) 変換NYASH_REWRITE_FUTURE=1

引き継ぎ2025-08-31 深夜)

サマリ

  • JIT予約シンボル: nyash.rt.checkpoint, nyash.gc.barrier_write を確保AOT/JITの双方で登録

  • Future/Await Rewrite: NYASH_REWRITE_FUTURE=1 で ExternCall(env.future.*) に段階導入runtime最小実装あり

  • Builderレガシー停止: Weak/Barrier 系の直接発行を既定で無効化(統一命令に集約、必要時トグル)

  • JIT-direct安定化: entry seal/戻り値制御/シム登録/コード寿命を調整し落ち着かせ済み

  • 次の着手順: MIR15のVM/JITカバレッジ拡張 → LLVM(inkwell) 移行

  • 完了/修正

    • JIT/AOT 予約シンボルの登録完了(nyash.rt.checkpoint, nyash.gc.barrier_write
    • JITスタブ実装no-opトレースとAOT(nyrt)エクスポートを追加
    • Future/Await RewriteのスキャフォールドNYASH_REWRITE_FUTURE=1 runtime側env.future.*最小実装
    • Builderレガシー停止を既定化WeakNew/WeakLoad/BarrierRead/Write→統一命令。必要時はトグルで復活
      • NYASH_BUILDER_LEGACY_WEAK=1, NYASH_BUILDER_LEGACY_BARRIER=1
    • JIT directの安定化segfault修正
      • エントリblockのseal遅延PHI/引数受け用)
      • MIRシグネチャに基づく戻り値有無Void関数はret無し/void呼び出し
      • nyash.console.birth_h のJIT内シム追加JITBuilder登録
      • finalize済みコードの寿命延長JITModuleをリークして新モジュールに差し替え
  • カバレッジ確認MIR15→VM/JIT

    • 追加ドキュメント: docs/reference/mir/MIR15_COVERAGE_CHECKLIST.md
    • スモークスクリプト: tools/mir15_smoke.sh実行例: cargo build --release --features cranelift-jittools/mir15_smoke.sh release
    • 現状OKJIT-direct: BinOp, Compare(真偽戻り), Load/Store(ローカル), Branch/Jump/PHI最小, ExternCall(console.log)
    • まだoptionalフォールバックで許容: 配列/Mapのhostcall系len/isEmpty/get/push 等)

実行メモ

  • ビルド: cargo build --release --features cranelift-jit
  • スモーク: tools/mir15_smoke.sh release
  • AOT(.o)簡易出力: NYASH_AOT_OBJECT_OUT=target/aot_objects ./target/release/nyash --jit-direct examples/aot_min_return_42.nyash
    • 生成: target/aot_objects/main.o
    • 備考: tools/build_aot.sh は jit-direct で .o を生成するよう更新済(要検証)

LLVM足場VM側 先行)

  • Escape AnalysisVMのみ: NYASH_VM_ESCAPE_ANALYSIS=1

    • 非エスケープなBoxの Barrier(Read/Write) を保守的に Nop
    • 実装: src/mir/passes/escape.rsNewBox起点のローカル追跡Return/Call/Store使用でescape検出
    • 適用: VM実行前にMIRへ適用src/runner/modes/vm.rs
    • 目的: LLVM(inkwell)への最適化ヒント連携を見据えた足固めまずVMで効果検証
  • 次の着手(この順で)

    1. MIR15のVM/JITカバレッジをもう一段拡張配列/Map hostcallのJIT対応 or optionalのまま明確化
    2. スモークに代表サンプルを追加し、CI/ローカルでワンコマンド確認
    3. LLVMフェーズinkwellへ移行Const/Return→BinOp/Compare→CF/PHIの順

次フェーズ提案

  • まずMIR15のVM/JITを固めるhostcallはoptional許容 or 段階実装)
  • その後、LLVMinkwellへ移行開始

MIRセット移行メモ

  • 現行の参照ドキュメントは「26命令Canonical」を維持docs/reference/mir/INSTRUCTION_SET.md)。

  • 実装はCore-15へ段階移行中TypeOp/WeakRef/Barrier 統合、Print Deprecatedで、MIR15のカバレッジは MIR15_COVERAGE_CHECKLIST.md で運用。

  • Core-15が安定した時点で参照ドキュメント側を「15命令」に更新し、命令数固定テストも切替える。

  • JIT/AOT: 将来のGCバリア/セーフポイント用のシンボル予約nyash.gc.barrier_write, nyash.rt.checkpoint

環境変数(段階移行トグル)

  • NYASH_BUILDER_SAFEPOINT_ENTRY=1: 関数エントリにSafepointを発行
  • NYASH_BUILDER_SAFEPOINT_LOOP=1: ループ各回でSafepointを発行
  • NYASH_BUILDER_LEGACY_WEAK=1: 旧WeakNew/WeakLoad発行を有効化既定: 無効、WeakRefに統一
  • NYASH_BUILDER_LEGACY_BARRIER=1: 旧BarrierRead/Write発行を有効化既定: 無効、Barrierに統一
  • NYASH_BUILDER_DISABLE_TRYCATCH=1: try/catch/finallyを無効化try本体のみ
  • NYASH_BUILDER_DISABLE_THROW=1: throwをenv.debug.traceへフォールバック
  • NYASH_REWRITE_DEBUG=1: Debug命令をExternCall(env.debug.trace)に書き換え
  • NYASH_REWRITE_SAFEPOINT=1: Safepoint命令をExternCall(env.runtime.checkpoint)に書き換え
  • NYASH_REWRITE_FUTURE=1: FutureNew/Set/Await を ExternCall(env.future.*) に書き換え(スキャフォールド)
  • NYASH_DEBUG_TRACE=1: env.debug.traceのログをstderrに出力
  • NYASH_RUNTIME_CHECKPOINT_TRACE=1: env.runtime.checkpointのログをstderrに出力

直近実装(完了)

  • AOT/JIT: string-like hostcalls 実装concat_hh/eq_hh/lt_hhとLowerer経路、シンボル登録
  • Print命令の非推奨化: BuilderでExternCall(console.log)へ統一、Rewriteでも変換
  • Builderlegacy抑止のトグル: Safepoint/Try-Catch/Throwをトグル化、loop safepointも任意化
  • Runtime extern_call: env.debug.trace / env.runtime.checkpoint を追加

次の着手(順序)

  1. JIT/AOT: GCバリア/セーフポイントのシンボル予約と下準備nyash.gc.barrier_write, nyash.rt.checkpoint
  2. Docs: 上記トグル/Extern API/命令マッピングの追記INSTRUCTION_SET, runtime extern, migration
  3. Future/AwaitのRewriteスキャフォールドNYASH_REWRITE_FUTURE=1と最小実装方針の明文化完了
  4. Builderのlegacy APIemit_weak_new/load, barrier_read/writeの非推奨化と使用箇所の削減
  5. JIT directのBlock-Sealパニック修正block seal順序・entry sealの見直し

期待効果

  • 命令 37→15目安で読みやすさ/実装コスト/検証コストを大幅削減
  • JIT/AOT の対応面積が小さくなり、今回の string-like hostcall のような追加の導入が容易に
  • 「Everything is Box」に合致I/O, 例外, ランタイム機能をBox/Externに集約

優先度/スケジュール

  • 優先度: 最優先10.5c/10.7に割り込み)
  • 目安: 1〜2日でBuilder/Rewrite/Docs、続いてVM/JITの掃除を段階投入

直近スナップショット2025-08-30 更新)

Current State

  • Plugin-First/Handle-First/TLVはAOT/VMで安定10.5e完了状態を継続)
  • 10.6計画Thread-Safety/Schedulerと10.7計画トランスパイルAll-or-Nothingを確定
  • Nyash-onlyパイプラインtools/pycを開始Parser/CompilerはNyashで実装方針
  • include式の最小実装を追加式でBoxを返す1ファイル=1static box
    • インタプリタ: include式は実行時評価
    • VM/AOT: MIRビルダーが取り込み先を同一MIRに連結MIR命令は増やさない
    • nyash.tomlの[include.roots]でルート解決拡張子省略、index.nyash対応
  • tools/pycをモジュール分割
    • tools/pyc/pyc.nyashエントリ: includeでPyIR/PythonParserNy/PyCompilerを取り込み
    • tools/pyc/PyIR.nyash, PythonParserNy.nyash, PyCompiler.nyashNyash-only実装

How To RunNyash-only

  • VM: NYASH_PY_CODE=$'def main():\n return 42' ./target/release/nyash --backend vm tools/pyc/pyc.nyash
    • 出力: Parser JSON → IRreturn 42→ 生成Nyashソース現状は骨組み
  • include動作サンプル: ./target/release/nyash --backend vm examples/include_main.nyashMath.add(1,2)=3

進捗2025-08-30 夜)

  • include: 循環検出を追加(インタプリタ/VM収集器ともにロード中スタックで経路出力。examples/cycle_a/b で検証
  • tools/pyc: 最小IRreturn定数→Nyash生成を通し、出力をprintまで接続
  • 文字列基盤: VMにString統一ブリッジを着手内部StringBoxとプラグインStringBoxの比較互換、内部Stringメソッドのフォールバック
  • 追加プラグイン(小粒・基底)
    • RegexBoxcompile/isMatch/find/replaceAll/split: examples/regex_min.nyash
    • EncodingBoxutf8/base64/hex: examples/encoding_min.nyash
    • TOMLBoxparse/get/toJson: examples/toml_min.nyash
    • PathBoxjoin/dirname/basename/extname/isAbs/normalize: examples/path_min.nyash

Next Steps優先順・更新

  1. String統一ブリッジ実装済・一次完了
    • VM: 比較/加算/代表メソッドのフォールバックlength/isEmpty/charCodeAt/concat/+をstring-like正規化で実装
    • Interpreter: 比較/加算はstring-like正規化を適用メソッドは後続で最小追補があれば対応
    • 例: encoding_min/regex_min/toml_min/path_min で回帰確認
  2. AOT/JITへのブリッジ降ろしMIR→VM→JIT→exeの汎用性維持・ハードコーディング禁止
    • 文字列演算のhostcall化read-only: nyash.string.concat_hh / eq_hh / lt_hh
    • Lowerer: BinOp(Add) / Compare(Eq/Lt) を「string-like」判定時にhostcallへフォールバック
    • 代表メソッド: length/isEmpty/charCodeAtは既存hostcall経由で維持、concat(メソッド)も追加検討
    • Registry: 署名/権限ReadOnly登録、シンボル解決とJITビルダー登録
    • 目標: examples/string_bridge_min.nyash をAOTでも成功
  3. tools/pyc: IR→Nyashの反映強化return/If/Assignを安定化、Strictスイッチ連動
  4. Strictスイッチ: tools/pycunsupported_nodes非空でErr、envでON/OFF
  5. CLI隠しフラグ --pyc/--pyc-nativeParser→Compiler→AOTの一本化導線
  6. 最小回帰VM/AOTの差分記録とdocs追補include/exportとpyc、Regex/Encoding/TOML/PathのAPI概要

Env Keyspyc

  • NYASH_PY_CODE: Pythonソース文字列Nyash-onlyパイプライン/Parser用
  • NYASH_PY_IR: IR(JSON)直接注入Rust雛形Compilerの確認用・オプション

目的: Handle-First + by-name を軸に、Python統合PyRuntimeBox/PyObjectBoxを汎用・安全に実装する。最適化は後段。さらに10.7のNyash-onlyトランスパイルC2pycを最小構成で立ち上げる。

ステータス2025-08-30 更新)

  • フェーズ: 10.5c 汎用Handle/TLV実装の拡張Python統合開始
  • 方針: 「綺麗に作って動かす」= ハードコーディング排除・Handle/TLV統一・最適化は後回し

10.5b 完了項目(橋渡し済み)

  • by-name シムgetattr/callを実装JIT/AOTし、Lowerer から a0 を nyash.handle.of で確実にハンドル化して呼び出し
  • 引数 a1/a2 はハンドル優先/なければレガシー参照から TLV 構築String/Integer はプリミティブ化)
  • 汎用 birth シムを追加
    • nyash.box.birth_h(type_id:i64)->i64JIT/AOT
    • nyash.box.birth_i64(type_id:i64, argc:i64, a1:i64, a2:i64)->i64JIT/AOT
    • Lowerer: NewBox引数無しは birth_h に統一。引数ありは安全なケースInteger const引数が既にハンドルだけ birth_i64 に段階導入
  • AOT: examples/aot_py_math_sqrt_min.nyash で Strict でも .o 生成を確認target/aot_objects/main.o
  • ログ
    • AOT: NYASH_CLI_VERBOSE=1 で birth_h の可視化
    • JIT: events で by-name/birth の観測(必要十分の最小限)

10.5c 着手項目(進行中)

  • Lowerer: PluginInvoketype_id/method_id & by-nameの Handle-First 配線を統一a0を常にnyash.handle.of
  • JIT/AOT: birth_h/_i64と by-name シムでTLV生成を汎用化String/Integerはプリミティブ化、他はHandle
  • Strict時のJIT実行停止コンパイル専用でVM=仕様の原則を徹底

非対応(後回し・最適化)

  • StringBox 専用の known_string/再利用最適化
  • 汎用的な定数プールbirth の可変長 TLV 一括最適化

次の作業10.5c 続き)

  1. FFI仕様の短文化a0/a1/a2=Handle優先→TLV、レガシー抑止フラグ、戻りTLVのdecodeポリシー
  2. birth引数の一般化メモ可変長TLV、例外時ハンドリング
  3. Python統合の最小チェーンimport→getattr→callのAOT/VM双方での実装確認サンプル追加
  4. ドキュメント更新10.5c README/INDEX、FFIガイド

合意済みルール

  • まず汎用・安全に動かす(最適化は内部に隠し、後段)
  • StringBox 等の個別特化は入れない。Handle/TLV で統一し、Box 追加を阻害しない
  • Strict/FailFast を維持fallback で隠さない)