Phase 25.1b: Complete SSA fix - eliminate all global ValueId usage in function contexts. Root cause: ~75 locations throughout MIR builder were using global value generator (self.value_gen.next()) instead of function-local allocator (f.next_value_id()), causing SSA verification failures and runtime "use of undefined value" errors. Solution: - Added next_value_id() helper that automatically chooses correct allocator - Fixed 19 files with ~75 occurrences of ValueId allocation - All function-context allocations now use function-local IDs Files modified: - src/mir/builder/utils.rs: Added next_value_id() helper, fixed 8 locations - src/mir/builder/builder_calls.rs: 17 fixes - src/mir/builder/ops.rs: 8 fixes - src/mir/builder/stmts.rs: 7 fixes - src/mir/builder/emission/constant.rs: 6 fixes - src/mir/builder/rewrite/*.rs: 10 fixes - + 13 other files Verification: - cargo build --release: SUCCESS - Simple tests with NYASH_VM_VERIFY_MIR=1: Zero undefined errors - Multi-parameter static methods: All working Known remaining: ValueId(22) in Stage-B (separate issue to investigate) ð€ Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
67 KiB
Phase 25.1b â Selfhost Builder Parity (Planning â Design DeepâDive)
Status: Step0ã3 å®è£ æžã¿ã»Step4ïŒMethod/ExternïŒå®è£ ãã§ãŒãº
ãŽãŒã«
- Rust åŽ ProgramâMIR (
env.mirbuilder.emit) ãš Hakorune åŽ selfhost builder (MirBuilderBox.emit_from_program_json_v0) ã®æ©èœå·®ãåããStage1 CLIïŒlauncher.hakoïŒã¬ãã«ã® Program(JSON) ã selfhost builder åç¬ã§ lowering ã§ããããã«ããã .hako â Program(JSON v0) â MIR(JSON)ã®ãã¡ããProgramâMIRãã selfhost builder ã ãã§ãæç«ãããprovider çµè·¯ã¯ãããŸã§éé¿è·¯ã«äžããŠããã- æçµçã«ã¯
HAKO_SELFHOST_BUILDER_FIRST=1ãæ¢å®ã«æ»ããStage1 CLI EXE ã® I/OïŒJSON stdout + exit codeïŒã Rust/llvmlite ãšåãå¥çŽã«æããã
çŸç¶ïŒPhase 25.1a æç¹ïŒ
StageâBïŒProgram(JSON v0) emitïŒ
compiler_stageb.hakoã¯defsãå«ã Program(JSON v0) ãåºåã§ãã:HakoCli.run/HakoCli.cmd_emit_*/HakoCli.cmd_build_*ãªã©ã®ã¡ãœãããProgram.defsé åãšããŠå«ããFuncScannerBoxïŒHAKO_STAGEB_FUNC_SCAN=1ã«ãããstatic boxã¡ãœããïŒæé»ã®meåŒæ°ä»ãïŒã defs ã«èŒãã
- using 解決:
Stage1UsingResolverBoxïŒlang/src/compiler/entry/using_resolver_box.hakoïŒïŒHAKO_STAGEB_MODULES_LISTã§nyash.tomlã®[modules]ãåç §ããusing lang.mir.builder.MirBuilderBoxçããã¡ã€ã«çµååã«è§£æ±ºã
- StageâB entry åŽã¯ string literal using ã廿¢ãã
using lang.compiler.entry.using_resolver as Stage1UsingResolverBoxã®ããã« module alias ã䜿çšããã
StageâB func_scan ãã°ã«ã®ããã©ã«ãïŒHAKO_STAGEB_FUNC_SCANïŒ
- ç®ç:
- StageâB ãçŽæ¥å©ãããšãã«
HAKO_STAGEB_FUNC_SCANãç«ãŠå¿ããŠããHakoCli.runãTestBox.fibã®ãããªã¡ãœããå®çŸ©ãProgram.defsã«ãã¡ããšå ¥ãããã«ããïŒselfhost builder / FuncLowering åŽã®åæã厩ããªãïŒã
- StageâB ãçŽæ¥å©ãããšãã«
- å®è£
ïŒcompiler_stageb.hako å
ïŒ:
- 以å:
HAKO_STAGEB_FUNC_SCAN=1ã®ãšãã ãFuncScannerBox.scan_all_boxesãåŒã³åºãããã以å€ã¯ defs ãçæããªãã£ãã - çŸåš:
HAKO_STAGEB_FUNC_SCANãæªèšå® (null) ã®ãšãã¯æ¢å®ã§ ON ãšã¿ãªããæç€ºçã«"0"ãå ¥ã£ãŠãããšãã ã OFF ãšããŠæ±ãã- ããã«ããã
tools/hakorune_emit_mir.shã v2 ã¹ã¢ãŒã¯ä»¥å€ãã StageâB ãçŽæ¥åŒã³åºããŠããdefs ãåžžã«çæãããã - æ¢åã®ãã¹ãã§ func_scan ãç¡å¹åãããã±ãŒã¹ã§ã¯ã
HAKO_STAGEB_FUNC_SCAN=0ãæç€ºããã°åŸæ¥ã©ãã defs ãã¹ãããã§ããã
- ããã«ããã
- 以å:
StageâB ã®å®å®åºŠãšäœ¿çšäžã®æ³šæ
- æ£èŠçµè·¯:
- StageâB ã¯
tools/hakorune_emit_mir.sh/tools/selfhost/selfhost_build.shçµç±ã§åŒã³åºãããšãåæãšããŠããããããã®ã©ããã Stageâ3 çš ENVïŒNYASH_PARSER_STAGE3=1/HAKO_PARSER_STAGE3=1/NYASH_PARSER_ALLOW_SEMICOLON=1ãªã©ïŒãäžæ¬ã§ã»ããããã - Phase 25.1b ã§ã¯ãmulti-carrier fib ãªã©ã® core å°ã±ãŒã¹ã«ã€ããŠã¯ããã®ã©ããçµç±ã§åŒã¶éã StageâB èªäœã¯ååã«å®å®ããšã¿ãªããäž»ãªæ¹å察象ã ProgramâMIR ã® selfhost builder åŽã«çœ®ãã
- StageâB ã¯
- æåå®è¡æã®æ³šæ:
- Stageâ3 ENV ãç«ãŠãã« StageâB / VM ãçŽæ¥å©ããšã
Undefined variable: localã®ãããªãšã©ãŒãçºçããããããã¯æ§æ/å®è£ ãã°ã§ã¯ãªããStageâ3 ããŒã¯ãŒãïŒlocal ãªã©ïŒã Stageâ1 ãšåãã«ãŒã«ã§ããŒã¹ããŠããŸã£ãŠãããããã - 詳现ãªåå ãšå¯ŸåŠã¯
docs/development/troubleshooting/stage3-local-keyword-guide.mdã«ãŸãšããŠãããselfhost éçºã§ã¯ããŸãã©ããã¹ã¯ãªããã䜿ã â å¿ èŠãªå Žåã®ã¿ ENV ãæç€ºããŠçŽå©ããããæ¹éãšããã
- Stageâ3 ENV ãç«ãŠãã« StageâB / VM ãçŽæ¥å©ããšã
StageâB ãš selfhost CLI canaryïŒHakoCli.run/2ïŒã®çŸç¶
- selfhost CLI ã®æå°ã±ãŒã¹ïŒ
tools/smokes/v2/profiles/quick/core/phase251/selfhost_cli_run_basic_vm.shãçæãã HakoCli.run ãµã³ãã«ïŒã«å¯ŸããŠã¯ãçŸç¶ StageâB å®è¡äžã« VM ãšã©ãŒ:â VM error: Invalid value: use of undefined value ValueId(N)ãçºçããProgram(JSON v0) ã 1 è¡ãšããŠã¯åºåãããªãïŒtools/hakorune_emit_mir.shã Program æœåºã«å€±æããïŒã
NYASH_VM_VERIFY_MIR=1ãç«ãŠãŠlang/src/compiler/entry/compiler_stageb.hakoãçŽæ¥å©ããšãStageâB ãçæãã MIR ã«å¯ŸããŠ:Stage1UsingResolverBox._collect_using_entries/1ParserStringUtilsBox.skip_ws/2ParserIdentScanBox.scan_ident/2ParserBox.parse_stmt2/2- ãªã©ã«
Undefined value %0 used in block ...ã倿°å ±åãããããšã確èªã§ããïŒè©³çްã¯docs/private/roadmap/phases/phase-20.33/DEBUG.mdã®ãInvalid value: use of undefined value ValueId(N)ãç¯ãåç §ïŒã
- å¯Ÿå¿æ¹éïŒPhase 25.1b æç¹ïŒ:
- BoxTypeInspector / multiâcarrier LoopForm çµè·¯ãšã¯ç¬ç«ãã StageâB/MIR åŽã®æ§é ãã° ãšããŠæ±ããselfhost CLI canaryïŒHakoCli.run/2 loweringïŒã¯ãã®åé¡ãè§£æ¶ããããŸã§ãStageâB åŽã®æ¢ç¥ã®æªä¿®æ£ãã°ããšããŠä¿çããã
tools/hakorune_emit_mir.shã«ã¯diagnose_stageb_failure()ã远å ããStageâB ã®æšæºåºåã«Invalid value: use of undefined valueãå«ãŸããŠããå Žåã«:[stageb/diagnose] VM reported 'use of undefined value' during StageâB execution.ãªã©ã®ã¿ã°ãåºãã€ã€ãNYASH_VM_VERIFY_MIR=1ïŒcompiler_stageb.hakoçŽå©ããããã³docs/private/roadmap/phases/phase-20.33/DEBUG.mdãžã®å°ç·ã衚瀺ããããã«ããã
Rust provider (env.mirbuilder.emit)
program_json_to_mir_json_with_imports:Program.bodyãšProgram.defsã®äž¡æ¹ãåçããFuncDefV0ããfunc_mapãæ§ç¯ã㊠Call ã解決ãHAKO_MIRBUILDER_IMPORTSçµç±ã§MirBuilderBox/BuildBoxãªã©ã® static box åãã€ã³ããŒãããConst(String(alias))ãšããŠæ±ãã
- JSON v0 ããªããž:
argsãæé»ãã©ã¡ãŒã¿ãšããŠæ±ãä¿®æ£æžã¿ïŒundefined variable: argsã¯è§£æ¶ïŒãhostbridge㯠wellâknown 倿°ãšããŠConst(String("hostbridge"))ãçæããhostbridge.extern_invoke(...)ãå«ã Program(JSON) ã§ã undefined ã«ãªããªãã
- çµæ:
launcher.hakoã«å¯Ÿã㊠~62KB ã® MIR(JSON) ãå®å®ããŠçæã§ããŠãããPhase 25.1a ã§ã¯ provider çµè·¯ãäºå®äžã®ã¡ã€ã³ã«ãŒãã
selfhost builder (MirBuilderBox.emit_from_program_json_v0)
- ãšã³ããª:
- å
¥å£ã§
HAKO_MIR_BUILDER_FUNCS=1ã®ãšãã«FuncLoweringBox.lower_func_defs(program_json, program_json)ãåŒã³åºããdefs å°çšã® MIR 颿°çŸ€ãæååãšããŠåãåãïŒfunc_defs_mirïŒã - ãã®åŸã
internalé äžã®å€æ°ã®Lower*Box.try_lowerãé çªã«é©çšããProgram å šäœã 1 颿°ïŒmainïŒããŒã¹ã® MIR(JSON) ã«èœãšãã
- å
¥å£ã§
FuncLoweringBoxã®çŸç¶:lower_func_defs㯠Program(JSON) ããdefsé åãããŒã¹ããå def ããšã«_lower_func_bodyãåŒã¶ã_lower_func_bodyããµããŒãããã®ã¯ åäžã® Return ãæã€æå°ãã¿ãŒã³ã®ã¿:Return(Int)Return(Binary(op, lhs, rhs))ïŒ+,-,*,/ã®ã¿ããã€Int/Varçµã¿åããéå®ïŒReturn(Call(name, args))ïŒCall åã¯func_mapãçšããŠBox.methodã«è§£æ±ºïŒ
- è€æ°ã¹ããŒãã¡ã³ãã
IfãLoopãã¡ãœãããã§ã€ã³ãªã© Stage1 CLI ã«å®éã«çŸããæ§é ã¯ãã¹ãŠnullã§ã¹ããããããã
MirBuilderBoxã®æå:- äœããã®
Lower*Boxã Program å šäœã«ãããããå Žåã¯ããã® MIR(JSON) ã«å¯ŸããŠ_norm_if_applyãéããFuncLoweringBox.inject_funcsã§ defs åã® MIR 颿°ã è¿œå æ³šå ¥ ããã - ã©ã®
Lower*Boxããããããªããfunc_defs_mirãé空ã®å Žåã¯ã"{\"functions\":[" + defs + "]}"ãšããæå°ã¢ãžã¥ãŒã«ãçµã¿ç«ãŠãŠ_norm_if_applyã«æž¡ãã- ãã®ã±ãŒã¹ã§ã¯ main 颿°ãå«ãŸãªã defs ã ãã® MIR ã¢ãžã¥ãŒã«ã«ãªããny-llvmc åŽã§ãšã³ããªãã€ã³ãäžè¶³ã空æå EXE ãçãåå ã«ãªãã
func_defs_mirã空㧠internal lowers ãäžçºã®å Žåã¯nullãè¿ããæåŸã« provider delegateïŒenv.mirbuilder.emitïŒãžãã©ãŒã«ããã¯ããã
- äœããã®
- çŸæç¹ã§ã®äžè¶³ç¹ïŒèŠçŽã»2025-11-16ïŒ:
FuncBodyBasicLowerBoxãæ¬çªã§ã«ããŒã§ããŠããã®ã¯ãLocal/If/Return ã®åºæ¬åœ¢ïŒLoopForm æ£èŠåæžã¿ LoopïŒããäžéšã® MethodCallïŒargs.size/getãšString.lengthã® Return 圢ïŒã«éããããStage1 CLI ã®ãããªè€éãªé¢æ°æ¬äœïŒè€æ° LocalïŒIf ãã¹ãïŒLoopïŒMethod/Extern æ··åšïŒã¯ãã»ãŒãã¹ãŠ Rust provider çµè·¯ã«ãã©ãŒã«ããã¯ããŠããã- ExternCall ã¯
hostbridge.extern_invoke("env.codegen","emit_object"|"link_object", arg)ãExternCallLowerBoxã§æå°ãµããŒãããŠããã ãã§ããã以å€ã® externïŒenv.mirbuilder.emitã console ç³»ãªã©ïŒã¯çŸç¶ selfhost builder ã®å¯Ÿè±¡å€ã HakoCli.runå°çš lowerïŒCliRunLowerBoxïŒã¯ MVP çšã®ã·ã³ãã«ãª run ãã¿ãŒã³ã®ã¿ãæ³å®ããŠãããå®éã®launcher.hakoã® runïŒusage/unknown ãã°ä»ãïŒã¯ shape mismatch ã§ selfhost éããã®å¯Ÿè±¡å€ãããã Stage1 å®åœ¢ã«åãããŠåºããããšã Phase 25.1b ã®äžå¿ã¿ã¹ã¯ã«ãªã£ãŠããã
Stage1 EXE / build_stage1.sh ã®çŸç¶
tools/selfhost/build_stage1.sh:- æ¢å®å€
HAKO_SELFHOST_BUILDER_FIRST=0ïŒprovider-firstïŒã§ã¯ãStage1 EXE ãã«ãã¯æåããemit program-json/emit mir-json/build exeã® I/O ã Rust/llvmlite ãšåçã® JSON+exit code å¥çŽãæºããã HAKO_SELFHOST_BUILDER_FIRST=1ïŒselfhost-firstïŒã§ã¯ãStage1 CLI ã®ãããªè€é㪠Program(JSON) ã«å¯Ÿã㊠selfhost builder ããdefs ã®ã¿ãMIR ã mini stub MIR ãè¿ããçµæãšããŠãResult: 0 ã ãåºã空 EXEãã«ãªãã
- æ¢å®å€
- ã¹ã¢ãŒã¯:
tools/smokes/v2/profiles/quick/core/phase251/stage1_launcher_program_to_mir_canary_vm.sh㯠provider-first ã«ãŒãã®ã¿ãã«ããŒããŠãããselfhost builder åç¬çµè·¯ã®ã®ã£ããã¯æ€åºã§ããŠããªãïŒä»åŸ canary ã远å ããå¿ èŠãããïŒã
25.1b ã®ã¹ã³ãŒãïŒæ¡ïŒ
- selfhost builder æ¬äœïŒHakorune åŽïŒ:
Program.defsã®åŠçãå®è£ ããbox + methodããšã« MIR 颿°ãçæããã- äŸ:
HakoCli.run/HakoCli.cmd_emit_program_json/HakoCli.cmd_emit_mir_json/HakoCli.cmd_build_exeçã
- äŸ:
call/BoxCall/ExternCallã®è§£æ±ºïŒfunc_lowering+ call resolve çžåœïŒã Hakorune åŽã«ãå®è£ ããCall("cmd_emit_mir_json")ãGlobalcallee ã«è§£æ±ºã§ããããã«ããã- Loop / branch / compare / Array/Map æäœãªã© Stage1 CLI ã§åºçŸããæ§é ãå
æ¬çã« lowering ããããã
lang/src/mir/builder/internal/*ã® helper ãæ¬çªçµè·¯ã«çµ±åããã
- JSON åºå:
- çŸç¶ã®
"{\"functions\":[...]}\"ãã¿æžããããjsonfrag çãçšããæ§é çåºåã«åãæ¿ããè€æ°é¢æ°ãåäžã¢ãžã¥ãŒã«ã«å«ããããããã«ããã - æ¢åã® mini ãã¿ãŒã³çš JSON çµã¿ç«ãŠãšã®äºææ§ãç¶æãã€ã€ãStage1 CLI ã§å¿ èŠãªé¢æ°æ°ã«èããããåœ¢ã«æ¡åŒµããã
- çŸç¶ã®
- éçšããªã·ãŒ:
- Phase 25.1b äžã¯
HAKO_SELFHOST_BUILDER_FIRST=0ã®ãŸãŸïŒprovider-firstïŒãšããselfhost builder ã Stage1 CLI ã lowering ãåããããšã確èªããæç¹ã§=1ãžã®åãæ¿ããæ€èšããã - lambda/FunctionBox (
NewClosureç) ã¯æ¬ãã§ãŒãºã§ã¯æ±ãããåŸæ¥ã©ãã builder ããã¯æé€ãããŸãŸã«ããïŒå¥ãã§ãŒãº 25.2b ã«å§ããïŒã
- Phase 25.1b äžã¯
Guardrails / ããªã·ãŒ
- Rust Freeze Policy:
- Rust åŽã® ProgramâMIR å®è£ ã«ã¯ååæãå ¥ãããselfhost builder ã¯ãRust ã®æ¢åæåã«åããããæ¹åã§å®è£ ããã
- 倿Žã¯ Hakorune åŽ (
lang/src/mir/builder/*) ãšããŒã« (tools/hakorune_emit_mir.sh) ã«éããã
- FailâFast:
- selfhost builder ã Program(JSON) ã®äžéšã«å¯Ÿå¿ããŠããªãå Žåã¯ãæç¢ºãªã¿ã°ä»ãã§å€±æãããïŒäŸ:
[builder/selfhost-first:unsupported:Match]ïŒããã«ããsilent stub ã«ã¯æ»ããªãã - provider çµè·¯ã¯éé¿è·¯ãšããŠæ®ãã€ã€ãStage1 CLI ã®ä»£è¡šã±ãŒã¹ã§ã¯ selfhost builder ãå ã«æåããããšãç®æšã«ããã
- selfhost builder ã Program(JSON) ã®äžéšã«å¯Ÿå¿ããŠããªãå Žåã¯ãæç¢ºãªã¿ã°ä»ãã§å€±æãããïŒäŸ:
LoopForm / PHI ããªã·ãŒïŒéèŠã¡ã¢ïŒ
- ã«ãŒããå«ã颿°æ¬äœã selfhost builder ã§æ±ããšãã¯ãLoopForm æ£èŠåãåæã«ãã:
- å¯èœãªéã
docs/guides/loopform.mdã§å®çŸ©ãããããã£ãªã¢ïŒ1åã® Ïãã¢ãã«ã«åŸãã - break/continue ãå«ãã«ãŒãã¯ãLoopForm ã®å¶çŽïŒæŽæ°å€æ°æå€§2åã»ã»ã°ã¡ã³ãæŽåãªã©ïŒãæºããç¯å²ã§ã®ã¿ lowering 察象ã«ããã
- å¯èœãªéã
- MirBuilder åŽã§ãçã® while/for ãçŽæ¥ MIR ã® PHI ã«èœãšãããã㪠adâhoc å®è£
ã¯è¡ããªã:
- PHI ããŒãã®çæã»é
çœ®ã¯æ¢åã® LoopForm/LowerLoop ç³» helperïŒ
loop_scan_box.hakoïŒlower_loop_*_box.hakoãªã©ïŒã«äžå åããbuilder æ¬äœã¯ãããå©çšããç«å Žã«ãšã©ããã - LLVM harness åŽã® PHI äžå€æ¡ä»¶ïŒãããã¯å é ã°ã«ãŒãã³ã°ïŒwellâtyped incomingïŒã厩ããªãã
- PHI ããŒãã®çæã»é
çœ®ã¯æ¢åã® LoopForm/LowerLoop ç³» helperïŒ
- Phase 25.1b ã§ã¯:
- ãŸã LoopForm åæã§å®å šã«æ±ããæå°ã®ã«ãŒãåœ¢ïŒæ¢å selfhost ãã¹ãã§ã«ããŒæžã¿ã® while/forïŒãã察å¿ãã
- LoopForm æªé©çšã®è€éãªã«ãŒãïŒäŸ: ãã£ãªã¢3倿°ä»¥äžã»ãã¹ããæ·±ããã®ïŒã¯
[builder/selfhost-first:unsupported:loopform]ã¿ã°ãªã©ã§ FailâFast ããã
LoopForm è€éã±ãŒã¹ãžã®æ¡åŒµæ¹éïŒRust builder ããªã©ã¯ã«ã«äœ¿ãïŒ
- ããã:
- è€é㪠LoopFormïŒãã£ãªã¢è€æ°ã»æ¡ä»¶ä»ãæŽæ°ãªã©ïŒã«ã€ããŠã¯ãRust åŽ MirBuilder/LoopForm å®è£
ããæ£è§£ïŒãªã©ã¯ã«ïŒããšããŠæ±ããHakorune åŽã®
LowerLoop*Box矀ãããã«è¿œåŸãããã - Hakorune åŽã¯ LoopForm ã®èšèšã PHI é ç·ãåå®è£ ããããå ¥å JSON ã®ãã¿ãŒã³ãããïŒæ¢å LowerLoop* ã®åŒã³åºããã«å°å¿µããã
- è€é㪠LoopFormïŒãã£ãªã¢è€æ°ã»æ¡ä»¶ä»ãæŽæ°ãªã©ïŒã«ã€ããŠã¯ãRust åŽ MirBuilder/LoopForm å®è£
ããæ£è§£ïŒãªã©ã¯ã«ïŒããšããŠæ±ããHakorune åŽã®
- æé ã€ã¡ãŒãž:
- Rust åŽ loop ã¹ã¢ãŒã¯ïŒäŸ:
docs/development/roadmap/phases/phase-17-loopform-selfhost/ãphase-21.6/21.8é¢é£ïŒã«å¯Ÿå¿ãã .hako ãç¹å®ããprovider-firstïŒHAKO_SELFHOST_BUILDER_FIRST=0ïŒã§ MIR(JSON) ãæ¡åããã - åã .hako ã selfhost-firstïŒ
HAKO_SELFHOST_BUILDER_FIRST=1 HAKO_MIR_BUILDER_FUNCS=1 HAKO_SELFHOST_TRACE=1ïŒã§éããLowerLoop*Boxãã©ããŸã§æŸããŠãããïŒã©ã®ã±ãŒã¹ã[builder/funcs:unsupported:loopform]ã«ãªã£ãŠãããã芳枬ããã - å·®åãåºãŠããã«ãŒãã ãã察象ã«ãå°ããª
LowerLoopXXXBoxïŒãŸãã¯æ¢å LowerLoop* ã®åŒ·åïŒã远å ããã - ã«ãŒãã®æå³è«å·®ç°ïŒãã£ãªã¢æŽæ°ã»éåºæ¡ä»¶ã»rcïŒãåºãŠããªããã¯ãVM/EXE canaryïŒrc ãã§ãã¯ïŒã§ç¢ºèªããã
- Rust åŽ loop ã¹ã¢ãŒã¯ïŒäŸ:
- ã¬ãŒã:
- æ°ãã LoopForm 察å¿ã¯ãã¹ãŠæ¢å
lower_loop_*_box.hako矀ã®äžã«éã蟌ããFuncLowering/MirBuilder æ¬äœã§ã¯äŸç¶ãšããŠãLoopForm çµæã_rebindã§ååä»ãããã ããã«ãšã©ããã - Rust åŽã® LoopForm/PHI å®è£ ãå€ããã« selfhost åŽã®ã«ããŒçã ããäžããã®ã Phase 25.1b ã®ç¯å²ã
- æ°ãã LoopForm 察å¿ã¯ãã¹ãŠæ¢å
25.1b ã§è¿œå ãã LoopForm çšã®æ°ç®±ïŒè¶³å ŽïŒ
lang/src/mir/builder/internal/lower_loop_multi_carrier_box.hako- ç®ç:
- Fibonacci 颚ã®ãmulti-carrierãã«ãŒãïŒ
i,a,b,tãªã©è€æ°ã®ãã£ãªã¢ãæã€ã«ãŒãïŒã selfhost builder åŽã§æ€åºã»LoopFormBox (mode="multi_count") ã«å§è²ããã
- Fibonacci 颚ã®ãmulti-carrierãã«ãŒãïŒ
- çŸæ®µéã®æåïŒ2025-11-16 æç¹ïŒ:
- Program(JSON v0) å
ã§
Loop+Compareãæ€åºãããã£ãªã¢åæå€ïŒlocal a = 0; local b = 1; ...ïŒã 2 åä»¥äžæœåºã i < Nã®Nã«ã€ããŠã¯ãIntãªãã©ã«ã ãã§ãªãnã®ãããªãã©ã¡ãŒã¿VarããµããŒãããlimit_kind=const|paramãšããŠLoopFormBox.build2ã«äŒéã- æåæã¯
[mirbuilder/internal/loop:multi_carrier:detected:limit_kind=param,value=...|param_reg=...]ã¿ã°ã確å®ã«åºåãããã®ãŸãŸ LoopForm ããè¿ã£ãŠãã MIR ã_rebindããã - ã«ãŒã limit ã
localåç §ãªã© selfhost ã§æ±ããªãå Žåã¯[mirbuilder/internal/loop:multi_carrier:limit:unsupported]ãåºããŠnullãè¿ããRust provider çµè·¯ãžéé¿ã
- Program(JSON v0) å
ã§
- ã¹ã¢ãŒã¯:
tools/smokes/v2/profiles/quick/core/phase251/selfhost_mir_loopform_multi_carrier_vm.sh- StageâB ã§
TestBox.fib(n)ã emit ããselfhost builder ã[funcs/basic:loop.multi_carrier]ãåºããããã§TestBox.fib/1ãå«ã MIR(JSON) ãçæãããããã§ãã¯ã carriersé·ãlimit_kind=paramãã°ãæ¡ä»¶ã« PASS/FAIL ãåå²ïŒprovider fallback æã¯ SKIPïŒã
- StageâB ã§
- ä»åŸã®æ¡åŒµ:
LoopFormBox.build_loop_multi_carrierã®limit_kind=paramå®è£ ãäžè¬åãïŒçŸåšã¯ param register ã³ã㌠âreg_limitåæåãŸã§å¯Ÿå¿æžã¿ïŒãbreak/continue ä»ã multi-carrier ãäžãããããã«ããã- 代衚ã±ãŒã¹ãšããŠ
tools/smokes/v2/profiles/quick/core/vm_loop_phi_multi_carriers.shãšååã® .hako ã selfhost-first ã§éã canary ã远å ããVM/EXE rc ã Rust ãªã©ã¯ã«ãšæ¯èŒããã
- ç®ç:
Next StepsïŒå®è£ ãã§ãŒãºã«å ¥ããšãã® TODOïŒ
- 調æ»:
- Rust åŽ
program_json_to_mir_json_with_importsã®æåããã¬ãŒã¹ããã©ã® AST ããŒããã©ã® MIR ã«éããŠããããæŽçïŒç¹ã« defs/call/loop/boxcallïŒã - selfhost builder ã®çŸè¡ JSON çæçµè·¯ãæŽãåºããstub ãçæããŠããç®æãç¹å®ã
- Rust åŽ
- èšèš:
Program.defsâ MIR 颿°çæã®ã€ã³ã¿ãã§ãŒã¹ïŒå¿ èŠãªãã£ãŒã«ããš lowering æé ïŒãå®çŸ©ã- call resolve çšã®è»œéãããïŒ
name -> qualifiedïŒã selfhost builder ã«å°å ¥ããã
- å®è£
:
- defs 察å¿ã»call resolveã»loop/branch lowering ãæ®µéçã«å°å ¥ãã€ã€ãåã¹ãããã§ mini ã¹ã¢ãŒã¯ã远å ã
- jsonfrag ããŒã¹ã®åºåã«åãæ¿ããªãããæ¢åã® mini ãã¹ããå šãŠéãããšã確èªã
- æ€èšŒ:
tools/hakorune_emit_mir.sh lang/src/runner/launcher.hako âŠãHAKO_SELFHOST_BUILDER_FIRST=1ã§å®è¡ãã62KB ã¯ã©ã¹ã® MIR(JSON) ã selfhost builder åç¬ã§åŸãããããšã確èªãtools/selfhost/build_stage1.shã selfhost-first ã§ãã«ãããStage1 CLI EXE ãemit/buildã³ãã³ããæ£ããå®è¡ã§ãããïŒJSON stdout + exit codeïŒãã¹ã¢ãŒã¯ã§æ€èšŒã
èšèš TODOïŒFuncLoweringBox / MirBuilderBox æ¡åŒµã®æ¹åæ§ïŒ
â» ããããå ã¯ãå ·äœçã«ã©ããã©ãåºããããã®èšèšã¡ã¢ãå®è£ ã¯ãŸã è¡ããªãã
-
FuncLowering ã®å¯Ÿå¿ç¯å²æ¡åŒµ
_lower_func_bodyã Stage1 CLI ã§å®éã«äœ¿ãããŠãããã¿ãŒã³ãŸã§åºãã:- åäž Return ã ãã§ãªããããŒã«ã«å€æ°å®çŸ©ïŒif åå²ïŒloop ãå«ããå žåç㪠CLI ãã³ãã©ãã®åœ¢ããµããŒãã
MethodCallïŒargs.size()/args.get(i)/FileBox.open/read/write/ArrayBox.pushãªã©ïŒã MIRmir_callãcallã«èœãšãåŠçã远å ã
func_map/resolve_call_targetãçšããŠãHakoCli.cmd_emit_*/cmd_build_exeãªã©ã®å éš Call ãGlobal("HakoCli.cmd_emit_*")ç³»ã«æ£èŠåã
-
MirBuilder æ¬äœã®åºåæ§é
- ãããŸã§ã®ãProgram å
šäœã 1 颿° main ã«èœãšããåæããããProgram.body + defs ã multiâfunction MIR ã¢ãžã¥ãŒã«ã«èœãšããåæãžã·ãã:
Program.bodyããã¯ãšã³ããªMain.main/1çžåœã® MIR 颿°ãçæãProgram.defsããã¯HakoCli.*ãªã©ã®è£å©é¢æ°ãçæã
_norm_if_apply/inject_funcsã®åœ¹å²ãæŽçãããmain 颿°ãå«ãŸãªã defsâonly ã¢ãžã¥ãŒã«ããè¿ããªãããã« FailâFast ããã
- ãããŸã§ã®ãProgram å
šäœã 1 颿° main ã«èœãšããåæããããProgram.body + defs ã multiâfunction MIR ã¢ãžã¥ãŒã«ã«èœãšããåæãžã·ãã:
-
FailâFast ãšãããã°
- Stage1 CLI ã®ãããªå€§ã㪠Program(JSON) ã«å¯Ÿã㊠selfhost builder ãæªå¯Ÿå¿ã®å Žåã¯:
[builder/selfhost-first:unsupported:func_body]ãªã©ã®ã¿ã°ä»ãã§æç€ºçã«å€±æã- provider çµè·¯ïŒ
env.mirbuilder.emitïŒãžã®ãã©ãŒã«ããã¯ã¯ç¶æããããã空 EXE ã«ãªã stub MIRãã¯çæããªãæ¹éã«åãæ¿ããã
HAKO_SELFHOST_TRACE=1æã«ãFuncLowering ãã©ã® def ã§ã©ããŸã§ lowering ã§ãããããã°ã«åºãã
- Stage1 CLI ã®ãããªå€§ã㪠Program(JSON) ã«å¯Ÿã㊠selfhost builder ãæªå¯Ÿå¿ã®å Žåã¯:
-
æ€èšŒèšç»
- selfhostâfirst canary:
stage1_launcher_program_to_mir_canary_vm.shã® selfhostâfirst çã远å ããHAKO_SELFHOST_BUILDER_FIRST=1ïŒMirBuilderBox.emit_from_program_json_v0ã ãã§ 60KB çŽã® MIR(JSON) ãçæã§ããããšã確èªã
- Stage1 build:
tools/selfhost/build_stage1.shã selfhost-first ã§åããçæããã Stage1 EXE ã«å¯ŸããŠemit program-json/emit mir-json/build exeã¹ã¢ãŒã¯ã远å ã
- selfhostâfirst canary:
ãã®ãã¡ã€ã«ã¯åŒãç¶ããPhase 25.1b ã®èšç»ã¡ã¢ïŒèšèšãã£ãŒããã€ãïŒããšããŠæ±ããå®è£ 㯠Phase 25.1a ã®å®å®åå®äºåŸã«ãå°ããªå·®åã«åå²ããŠé 次é²ããã***
å®è£ èšç»ïŒé çªã«ãã TODOïŒ
åè: ããã§ã¯ Phase 25.1b ããè€æ°ã®æå°ã¹ããããã«åè§£ããŠãé çª/ãŽãŒã«/ã¬ãŒããå ·äœçã«ã¡ã¢ããŠããã«ãã
Step 0 â FailâFastã»èŠ³æž¬ãæãã
- Status: implemented (2025-11-15).
MirBuilderBoxnow tagsdefs_only/no_matchfailures and aborts, andFuncLoweringBoxlogs unsupported defs whenHAKO_SELFHOST_TRACE=1. - ç®ç: æ¢åã® selfhost builder ãã©ãã§è«ŠããŠããããæ£ç¢ºã«èŠ³æž¬ããstub MIR ãè¿ããã« Fail ãããå°ç·ãæŽããã
- äœæ¥:
MirBuilderBox.emit_from_program_json_v0func_defs_mirã ããé空ã ã£ãå Žåã§ãé»ã£ãŠ{ "functions": [defs] }ãè¿ããã[builder/selfhost-first:unsupported:defs_only]ãåºãã- internal lowers ããã¹ãŠ
nullã®å Žåã[builder/selfhost-first:unsupported:<reason>]ã®ã¿ã°ãä»äžã
FuncLoweringBox.lower_func_defs- ã©ã®é¢æ°åã§
_lower_func_bodyãnullãè¿ããããHAKO_SELFHOST_TRACE=1ã§ãã°åºåã
- ã©ã®é¢æ°åã§
tools/hakorune_emit_mir.sh- æ¢åã® head/tail ãã°åºåã§
[builder/selfhost-first:*]ã¿ã°ããã®ãŸãŸè¡šç€ºãããããšãç¢ºèªæžã¿ïŒè¿œå æ¹ä¿®ãªãïŒã - Phase 25.1b 以éã
HAKO_SELFHOST_BUILDER_FIRST=1ã§åŒã³åºãããå Žåã¯ãStageâB â selfhost builderïŒïŒStage1 CLIïŒãçµè·¯ã®ã¿ã詊è¡ããselfhost builder ã倱æããå Žåã¯å³åº§ã«é0ã§çµäºãããselfhost-first ã¢ãŒãã§ã¯env.mirbuilder.emit/ provider delegate ãžã®ãã©ãŒã«ããã¯ã¯è¡ãããMirBuilder ã®æªæŽåãé ããªãæ¹éãšããïŒprovider çµè·¯ã䜿ããšãã¯HAKO_SELFHOST_BUILDER_FIRST=0ãæç€ºïŒã
- æ¢åã® head/tail ãã°åºåã§
- ææç©:
- selfhost-first ã§ Stage1 CLI ãéãããšãã«ãã©ã®é¢æ°/æ§é ããŸã æªãµããŒããªã®ãããã°ã§æšæž¬ã§ããç¶æ ã
è£è¶³: Ny selfhost ãã€ãã©ã€ã³ãšã®é¢ä¿ïŒPhase 25.1b æç¹ïŒ
.hako â Program(JSON v0) â MIR(JSON)ã®ã¡ã€ã³çµè·¯ã¯ãStageâBïŒcompiler_stageb.hakoïŒãš MirBuilder/selfhost builder ã§å®çµããããNy selfhostïŒsrc/runner/selfhost.rsïŒã¯.nyçšã®è£å©ã«ãŒããšããŠæ±ããPhase 25.1b ã®ã¹ã³ãŒãããã¯å€ããNYASH_USE_NY_COMPILER:- Phase 25.1b ã§ãæç€º opt-inãïŒæ¢å®=0ïŒã«å€æŽãRunner ã¯
NYASH_USE_NY_COMPILER=1ãç«ã£ãŠãããšãã ã selfhost ãã€ãã©ã€ã³ïŒNyâJSON v0ïŒã詊è¡ãããã以å€ã§ã¯åŸæ¥ã©ãã Rust parser/JSON v0 bridge ã䜿ãã .hakoå®è¡ãtools/hakorune_emit_mir.shçµç±ã® StageâB/MirBuilder/selfhost builder ã«ã¯åœ±é¿ããªãïŒãããã¯NYASH_USE_NY_COMPILER=0/NYASH_DISABLE_NY_COMPILER=1ã§èµ·åïŒã
- Phase 25.1b ã§ãæç€º opt-inãïŒæ¢å®=0ïŒã«å€æŽãRunner ã¯
- Python MVP:
tools/ny_parser_mvp.py㯠Phase 15 æç¹ã® NyâJSON v0 å®éšçšããŒãã¹ã§ãããPhase 25.1b ã§ã¯NYASH_NY_COMPILER_USE_PY=1ã®ãšãã ãæå¹ã«ããã- æ¢å®ã§ã¯ Ny selfhost ãã€ãã©ã€ã³ãã Python ã«ã¯èœã¡ãªãïŒè± Python æ¹éã«åãã㊠dev å°çšã®è£å©ç·ã«æ ŒäžãïŒã
- inline selfhost compilerïŒ
inline_selfhost_emit.hakoïŒ:try_run_selfhost_pipelineã®æçµææ®µãšããŠãusing lang.compiler.parser.box as ParserBox/using lang.compiler.stage1.emitter_box as EmitterBoxãå«ãå°ã㪠Hako ãçæããParserBox.parse_program2âEmitterBox.emit_programã§ JSON v0 ãåŸãçµè·¯ãæ®ã£ãŠããã- çŸç¶ããã® inline çµè·¯ã¯
.nyã®å€§ããªãœãŒã¹ã«å¯Ÿã㊠60s ã¿ã€ã ã¢ãŠãïŒUndefined variable: localã䌎ãããšããããParserBox/Stageâ3/using åšãã«ç¡éã«ãŒãçžåœã®ãã°ãæ®ã£ãŠããçããããã - Phase 25.1b ã§ã¯
.hakoselfhost builder ãã Ny selfhost çµè·¯ãåãé¢ãããšãåªå ããinline çµè·¯ã®ãã°ã¯[ny-compiler] inline timeout ...ïŒ[ny-inline:hint]ïŒstdout/stderr ã® head ãæ·»ããïŒã§å¯èŠåããããã§ãåŸç¶ãã§ãŒãºïŒ25.1c 以éïŒã®æ§é ã¿ã¹ã¯ãšããŠæ±ãã
Step 1 â defs injection ã®åèšèš
- Status: initial-implementedïŒmain å¿ é ãã§ãã¯ã¯ãã°ã«ä»ã; multi-function ãžã®å®å šç§»è¡ã¯åŸç¶ StepïŒã
- ç®ç:
FuncLoweringBox.inject_funcsã§ main 颿°ã®æç¡ãæèããmulti-function ã¢ãžã¥ãŒã«ã®åå°ãæŽããã - äœæ¥:
inject_funcså ã§HAKO_MIR_BUILDER_REQUIRE_MAIN=1ã®ãšãã«"name":"main"ãå«ãŸãªãfunctionsé åãæåŠãã[builder/funcs:fail:no-main]ããã¬ãŒã¹åºåã㊠injection ãã¹ãããããïŒæ¢å®ã§ã¯ OFF ãªã®ã§æ¢åæåã¯ç¶æïŒã- å°æ¥ãã§ãŒãºã§ã
Program.bodyããçæãã main ãš defs ãã2段æ§ããã§ããŒãžãã APIïŒmain åã®åãæž¡ããªã©ïŒã远å ããã
- ææç©ïŒçŸæ®µéïŒ:
- Env ãã°ã«ãæå¹åããç¶æ ã§ã¯ãmain ãå«ãŸãªã MIR ã« defs ã ãå·®ã蟌ããã±ãŒã¹ãæ€ç¥ã§ããããã«ãªããStage1 å®è£ æã«å®å šã« stricter ã¢ãŒããžç§»è¡ããè¶³å Žãã§ããã
Step 2 â _lower_func_body ã®æ¡åŒµïŒããŒã«ã«ïŒifïŒ
- ç®ç: Stage1 CLI ã®
HakoCli.cmd_emit_program_jsonã®ãããªãLocal / Assign / If / Return ã ãã§æ§æããã颿°ãã selfhost builder ã§ lowering ã§ããããã«ããã - äœæ¥:
- Body ã JsonFrag ã§èµ°æ»ããããŒã«ã«å°å ¥ã»ä»£å ¥ã»åå²ã MIR ãããã¯ãžå±éããæå°ããžãã¯ã FuncLoweringBox ã«è¿œå ã
- Loop ãåºãæã¯
[builder/funcs:unsupported:loop]ïŒä»®ã¿ã°ïŒãåºã㊠Fail-FastïŒStep 3 ã§ LoopForm 察å¿ãè¡ãïŒã
- ææç©:
- Loop ãå«ãŸãªã defs 㯠selfhost builder ã§ MIR 颿°ã«ã§ããããã«ãªããStage1 CLI ã® emit/build ãã³ãã©ã®ååçšåºŠã selfhost ãã¹ã§è³ããã
Step 3 â LoopïŒLoopFormïŒã®åç
- Status: initial-implemented (2025-11-15).
FuncBodyBasicLowerBoxnow callsLowerLoopSumBcBox/LowerLoopSimpleBoxfrom_try_lower_loop, tags unsupported loops with[builder/funcs:unsupported:loopform], and delegates all PHI/carrier handling to LoopForm lowers. - ç®ç: LoopForm æ£èŠåæžã¿ã® while/for ã MIR ã«èœãšããã«ãŒãã®æ£èŠåã»PHIèšèšã¯LoopForm/æ¢ålower_loopç³»Boxã«ä»»ããFuncLowering/MirBuilderåŽã¯ããã䜿ãã ãã«ããã
- äœæ¥å
容ïŒå®è£
æžã¿ïŒ:
FuncBodyBasicLowerBoxã«_try_lower_loopã¡ãœãã远å :- Loopå€å® â
LowerLoopSumBcBox.try_lowerâLowerLoopSimpleBox.try_lowerã®é ã«è©Šãã - æåæã¯
_rebindã§é¢æ°åãBox.method/arityã«ä»ãæ¿ãã - 倱ææã¯
[builder/funcs:unsupported:loopform]ã§Fail-Fastã
- Loopå€å® â
lowerã¡ãœããåé ã§Loopåªå åŠç:- Loopå«ãå Žåã¯
_try_lower_loopãåŒã³ãæå/倱æã§æç¢ºã«åå²ã - Loopãç¡ãå Žåã®ã¿æ¢åã®Local/If/ReturnåŠçã«é²ãã
- Loopå«ãå Žåã¯
- PHIå°ç鲿¢ããªã·ãŒåŸ¹åº:
- FuncBodyBasicLowerBox/FuncLoweringåŽã§PHIããã£ãªã¢ãçŽæ¥ããããªãã
- LoopFormå¶çŽå€ã¯å¿ ãã¿ã°ä»ãã§Fail-FastïŒRust providerã«éé¿å¯èœïŒã
- ææç©:
cmd_build_exeã®loop(i < argc)çãStage1 CLIã®ä»£è¡šçãªwhile/forãã¿ãŒã³ãselfhost builderã§éããåºç€ãæŽã£ãã- 远å ã¢ããããŒãïŒ2025-11-16ïŒ: multi-carrier ã«ãŒãïŒ
TestBox.fib(n)ãªã©ïŒãLowerLoopMultiCarrierBoxâLoopFormBox.build_loop_multi_carrierçµç±ã§ selfhost lowering ã§ããããã«ãªããlimit ãIntã§ãªãVar(n)ã§ã[mirbuilder/internal/loop:multi_carrier:detected:limit_kind=param,...]ãåºããŠåŠçã§ããã - 次ã®ã¹ããã: LoopForm察å¿ã®åäœç¢ºèªã¹ã¢ãŒã¯ãã¹ã远å ãStep4ïŒMethodCall/ExternCallïŒãžé²ãã
Step 3.1 â Box åæ å ± APIïŒRust ParityïŒâ New
- èæ¯:
- Stageâ3 VM ã§ã¯
"" + MapBoxã®ãããªãBox ãæååã«æé»å€æããæŒç®ããçŠæ¢ãããŠãããæ¢åã®JsonEmitBox/BoxHelpersïŒLoopOptsBox.build2ããåŒã³åºãããïŒãreprå€å®ã«äŸåããŠãããã multi-carrier ã® JSON çæãType errorã§åæ¢ããã - Rust åŽã® MirBuilder 㯠enum ã§åãæ±ºãŸã£ãŠãã
matchã§åå²ã§ãããHakorune åŽã§ãåçã®ãBox ã®çš®å¥ãåãåããã APIããçšæããŠæååããã¯ãæ€å»ããå¿ èŠãããã
- Stageâ3 VM ã§ã¯
- èšèšæ¹é:
lang/src/shared/common/box_type_inspector_box.hakoã远å ããBoxTypeInspectorBox.kind(value)/is_map(value)/is_array(value)çã® API ãæäŸããã- å®è£
㯠Stage0 Rust åŽã«
env.box_introspect(kind, value)ç㪠extern ã远å ããhostbridge.extern_invoke("env.box_introspect","kind",[value])ã§çš®å¥åïŒäŸ:"MapBox","ArrayBox","Int"ïŒãè¿ãã BoxHelpers/JsonEmitBox/LoopOptsBoxãªã©ãBox çš®å¥ãã§ãã¯ãå¿ èŠãªç®æã¯ãã¹ãŠãã® API ã«çœ®ãæãã"" + valueãäžå䜿ããªãã- è¿ãå€ã¯æå°ã§
Null/Bool/Int/StringãšMapBox/ArrayBox/HostHandleBoxïŒStage1 ã§äœ¿çšããåïŒãã«ããŒããå°æ¥çã«type_idãªã©ãæ¡åŒµããã
- 远å ã§è¡ãããš:
CURRENT_TASK.mdã« Box å API å®è£ ã¿ã¹ã¯ã远å ããLoopForm multi-carrier ã® JSON åºåããã® API äŸåã§ããããšãæç€ºã- Stage0 åŽã§ã®å¯Ÿå¿ïŒ
env.box_introspectæ°èŠ externïŒã®èšèšãåãããŠphase-25.1b/README.mdã«èšè¿°ããŠããïŒSelfhost åŽã§ API 远å âRust åŽ stubâVM åæ ã®é ïŒã - çŸç¶ïŒ2025-11-16 æç¹ïŒ: Stageâ3 VM çµè·¯ã§
BoxTypeInspectorBox.kind/is_map/is_arrayã MapBox / ArrayBox ãæ£ããèªèããå°ã㪠Hako ãã¹ãã§hostbridge.extern_invoke("env.box_introspect","kind",[value])âenv.box_introspect.kindprovider â plugin loader v2 ã® BoxIntrospect å®è£ ãŸã§ã endâtoâend ã§åäœããããšãç¢ºèªæžã¿ã - fib multiâcarrier çµè·¯ãš selfhost multiâcarrier smoke çšã® canary ã±ãŒã¹ïŒ
tools/smokes/v2/profiles/quick/core/phase251/selfhost_mir_loopform_multi_carrier_vm.shïŒã¯ã2025â11â16 æç¹ã§env.box_introspect.kindprovider çµè·¯ïŒBoxTypeInspector çµç±ã® multi-carrier LoopForm ã§ PASS æžã¿ããã°ã«[mirbuilder/internal/loop:multi_carrier:detected:limit_kind=param,...]ãš[funcs/basic:loop.multi_carrier] -> TestBox.fib/1ãçŸããåºå MIR(JSON) ã«"name":"TestBox.fib/1"ãå«ãŸããããšã確èªããããããenv.box_introspect.kind provider çµè·¯å®äº / multiâcarrier selfhost-first canary PASSããšã¿ãªãã
Step 4 â MethodCall / ExternCall ããªãã£ïŒèšèšã¡ã¢ã»Rustå±€èªè§£èŸŒã¿ïŒ
-
Status: design-onlyïŒRust å±€ã®æåãèžãŸããèšèšãŸã§ïŒ
-
ç®ç:
hostbridge.extern_invoke/FileBox/ArrayBoxãªã© Stage1 CLI ã§å€çšãããåŒã³åºãã selfhost builder ã§ãåçŸããRust åŽã®build_method_call/ extern handler ãšæå³è«ãæããïŒãã ãã¹ã³ãŒã㯠Stage1 å¿ èŠæå°éã«éå®ïŒã -
察象ïŒPhase 25.1b ã§æ±ãç¯å²ã«éå®ïŒ:
- Stage1 CLI (
lang/src/runner/launcher.hako) å ã§åºçŸãã代衚ãã¿ãŒã³:FileBoxç³»:fb.open(path,"r")/fb.read()/fb.write(content)/fb.close()ArrayBoxç³»:args.size()/args.get(i)/args.push(v)MapBoxç³»ïŒå¿ èŠã«ãªãã°ïŒ:m.get(k)/m.set(k,v)/m.size()Stringç³»:s.length()ïŒçŸç¶ Step2 ã§ã䜿ãããŠããïŒ- self-call:
me.cmd_emit_program_json(args)/me.cmd_emit_mir_json(args)/me.cmd_build_exe(args)ãªã© - ExternCall çãªãã®:
hostbridge.extern_invoke("env.codegen","emit_object",args)/hostbridge.extern_invoke("env.codegen","link_object",args)
- Stage1 CLI (
-
èšèšæ¹é:
-
MethodCall â mir_call(Method)ïŒbox ã¡ãœããåŒã³åºãïŒ
- StageâB Program(JSON v0) ã§ã®åœ¢ïŒå®æž¬ïŒ:
return arr.size()㯠defs å ã§æ¬¡ã®ããã«çŸãã:{"type":"Local","name":"arr","expr":{"type":"New","class":"ArrayBox","args":[]}} {"type":"Return","expr":{ "type":"Method", "recv":{"type":"Var","name":"arr"}, "method":"size", "args":[] }}hostbridge.extern_invoke("env.codegen","emit_object", a)ã¯:{"type":"Expr","expr":{ "type":"Method", "recv":{"type":"Var","name":"hostbridge"}, "method":"extern_invoke", "args":[ {"type":"Str","value":"env.codegen"}, {"type":"Str","value":"emit_object"}, {"type":"Var","name":"a"} ] }}
- FuncLoweringBox / FuncBodyBasicLowerBox åŽã§æ±ãåºæ¬ãã¿ãŒã³:
Return(Method recv.method(args))ãæ€åºããrecvã ãã©ã¡ãŒã¿ç±æ¥ã® VarïŒäŸ:args.size()ïŒã®ãšãã ã selfhost lowering 察象ã«ããã- ããŒã«ã«ç±æ¥ïŒ
local fb = new FileBox(); return fb.read()ïŒã¯ Phase 25.1b ã§ã¯å¯Ÿè±¡å€ãšããä»åŸã®ãã§ãŒãºã§ããŒã«ã«ããŒãã«å°å ¥åŸã«æ±ãã
- åŒæ°ã¯ Int/Var/String ã®ã¿å¯Ÿè±¡ïŒlambda ãè€ååŒã¯æªå¯Ÿå¿ïŒã
- MIR åŽã§ã¯
mir_callã® Method 圢ã䜿ã:{"op":"mir_call","dst":R, "mir_call":{ "callee":{"type":"Method","box_name":"ArrayBox","method":"size","receiver":recv_reg}, "args":[ /* å¿ èŠã«å¿ããŠè¿œå */ ], "effects":[] }}box_name/method㯠whitelisted 㪠Box ã®ã¿ïŒåœé¢ã¯ArrayBoxãšStringçšåºŠïŒãããŒãã³ãŒãã§å¯Ÿå¿ã- receiver ã¯
receiverãã£ãŒã«ãïŒãŸã㯠args ã®å é ïŒã§ã¬ãžã¹ã¿çªå·ãæž¡ããRust åŽã®mir_call仿§ãšæããã
- StageâB Program(JSON v0) ã§ã®åœ¢ïŒå®æž¬ïŒ:
-
self-callïŒme.cmd_*ïŒã®è§£æ±º
- Stage1 CLI ã®
me.cmd_*ã¯ãStageâB ã® FuncScanner ããProgram.defsã«box:"HakoCli", name:"cmd_*"ãšããŠèŒãã - ããã FuncLoweringBox ã®
func_mapã«ç»é²æžã¿ãªã®ã§ãCall("cmd_emit_mir_json", args)âfunc_map("cmd_emit_mir_json") = "HakoCli.cmd_emit_mir_json"- ãšãã圢㧠Global 颿°åã解決ã§ããã
- Step4 ã§ã¯
Return(Call("cmd_*", ...))ã ãã§ãªãããåç¬ã® Call æãããMethodCall å ããã® self-callãã察å¿ãããäœå°ããããã- Phase 25.1b ã§ã¯ãŸã
Return(Call(...))ãã¿ãŒã³ã®ç¯å²å ã§ self-call ãBox.method/Nã«æãããšãããŸã§ã«çããïŒåºããã®ã¯åŸç¶ãã§ãŒãºïŒã
- Phase 25.1b ã§ã¯ãŸã
- Stage1 CLI ã®
-
ExternCallïŒhostbridge.extern_invokeïŒã®æ±ã
- Rust åŽã§ã¯
hostbridge.extern_invoke("env.codegen","emit_object",args)çãç¹å¥æ±ãããC-ABI çµç±ã§env.codegenprovider ã«ã«ãŒãã£ã³ã°ããŠããã - selfhost builder åŽã§ã¯ãStage1 CLI ã®ä»¥äžã®ãã¿ãŒã³ã®ã¿ããµããŒã察象ãšãã:
"env.codegen","emit_object",[mir_json]"env.codegen","link_object",[obj_path,(out_path)]"env.mirbuilder","emit",[program_json]ïŒå¿ èŠãªãïŒ
- JSON äžã§ã¯
expr.type:"Method"ïŒrecv:Var("hostbridge")ïŒmethod:"extern_invoke"ã§è¡šçŸãããŠããã®ã§ãargs[0]/args[1]ã"env.codegen","emit_object"or"link_object"ã§ããããšã確èªãã- static ãªãã¿ãŒã³ãããã§ MIR ã®
extern_callã«èœãšã:{"op":"externcall","func":"env.codegen.emit_object","args":[ /* regs */ ]}
- ããã§ã¯ããã¹ãŠã® extern ãäžè¬åãããã®ã§ã¯ãªããStage1 CLI ãå®éã«äœ¿ã£ãŠãã env åãšã¡ãœããåã ãã point fix ããïŒRust Freeze Policy ã«åŸããæå³è«ã¯ Rust çãç䌌ããç¯å²ã¯çãä¿ã€ïŒã
- Rust åŽã§ã¯
-
æªå¯Ÿå¿ãã¿ãŒã³ã® Fail-Fast
- MethodCall/ExternCall ã® lowering äžã«ã
- è€éãªãªããžã§ã¯ãåŒïŒãã¹ããã MethodCall/Array/Map ãªãã©ã«ãªã©ïŒã
- åŒæ°ã«å¯Ÿå¿ããŠããªãåïŒlambda ãªã©ïŒã
- æªãµããŒãã® env å / ã¡ãœããåïŒ
env.codegen以å€ïŒã ãèŠã€ãã£ãå Žåã¯ã[builder/funcs:unsupported:call]ã¿ã°ãåºããŠnullã§æ»ãã
- ããã«ããããç¥ããªã圢ããªããšãªã MIR ã«ãããããšãé¿ããRust provider ã legacy CLI delegate ã«éé¿ã§ããããã«ããã
- MethodCall/ExternCall ã® lowering äžã«ã
-
Step 4.1 â Rust å±€ Call/ExternCall å¥çŽã®æŽçïŒç§»æ€å SSOTïŒ
-
ç®ç:
- Stage1 åŽã® MethodCall/ExternCall lowering ããRust å®è£ ã®æ¯ãèããã«æ£ç¢ºã«æãããããRust 局㮠Call/ExternCall/hostbridge çµè·¯ã SSOT ãšããŠæŽçããŠããã
- ããã§ã®æŽçã¯æ§é ã¬ãã«ã«çããæå³è«ã®âæ¡åŒµâã¯è¡ããªãïŒHako åŽã¯ãã®å¥çŽã«åŸãã ãïŒã
-
Rust åŽã®ã³ã¢æé¢ïŒãã£ããæ§é ïŒ:
- MIR ãã«ãïŒåŒã³åºãçæïŒ:
src/mir/builder/builder_calls.rsemit_unified_call(dst, CallTarget, args):CallTarget::Method { box_type, method, receiver }âCallee::MethodãäœããMirInstruction::Call { callee: Some(Callee::Method{..}), ... }ã emitãCallTarget::Extern(name)â æåå"env.codegen.emit_object"ãªã©ãExternCallã«å€æïŒiface_name="env.codegen",method_name="emit_object"ïŒãCallTarget::Global(name)âCallee::Global(name)ä»ãCallã emitïŒexecute_global_functionãžïŒã
- VM åŽ Call ãã³ãã©:
src/backend/mir_interpreter/handlers/calls/global.rs:execute_global_function(func_name, args):- ãŸã
functionsããŒãã«ã«ããã° module å 颿°ãšããŠå®è¡ã - ããã§ãªãå Žåã
normalize_arity_suffix("name/1")ãã base åã«å¯ŸããŠ:"print"âexecute_extern_function("print", args)ã"hostbridge.extern_invoke"âexecute_extern_function("hostbridge.extern_invoke", args)ïŒSSOT: hostbridge çµç±ã® extern ã¯å¿ ããããéãïŒã"env.mirbuilder.emit"/"env.codegen.emit_object"/"env.codegen.link_object":- ãããã
crate::host_providers::{mir_builder,llvm_codegen}ãçŽæ¥åŒã¶ãã°ããŒãã«é¢æ°çãã«ãŒãã
- ãããã
- ãŸã
src/backend/mir_interpreter/handlers/calls/externs.rs:execute_extern_function(iface, method, args):("env.mirbuilder","emit")/("env.codegen","emit_object")/("env.codegen","link_object")ãªã©ãextern_provider_dispatchã«å§è²ã"hostbridge.extern_invoke"base åãããããextern_provider_dispatch("hostbridge.extern_invoke", args)ã«æµãã
- ExternCall / hostbridge.extern_invoke ã® provider:
src/backend/mir_interpreter/handlers/externals.rs:- ExternCall 圢ïŒ
MirInstruction::ExternCall) ãiface_name,method_nameããšã«æ¯ãåã:("env.mirbuilder","emit")âextern_provider_dispatch("env.mirbuilder.emit", args)ã("env.codegen","emit_object")âextern_provider_dispatch("env.codegen.emit_object", args)ã("env.codegen","link_object")â 第3åŒæ° ArrayBox[obj_path, exe_out?]ãåãåºã㊠C-API ã«ãŒããžã("hostbridge","extern_invoke")âextern_provider_dispatch("hostbridge.extern_invoke", args)ïŒãªããã° InvalidïŒã
- ExternCall 圢ïŒ
src/backend/mir_interpreter/handlers/extern_provider.rs:extern_provider_dispatch(key, args):"env.mirbuilder.emit":args[0]ãprogram_jsonã«ããHAKO_MIRBUILDER_IMPORTSãã imports ããããèªããhost_providers::mir_builder::program_json_to_mir_json_with_importsãåŒãã§ MIR(JSON) æååãè¿ãã
"env.codegen.emit_object":args[0]ã MIR(JSON) æååã«ã㊠v1 ãž normalize âllvm_codegen::mir_json_to_objectã
"env.codegen.link_object":args[0]=obj_path,args[1]=exe_out ãæåååããC-API ã«ãŒãïŒNYASH_LLVM_USE_CAPI=1+HAKO_V1_EXTERN_PROVIDER_C_ABI=1ïŒã§link_object_capiã
"env.get"/"env.box_introspect.kind"/"hostbridge.extern_invoke"ãããã§æ±ãïŒBoxIntrospect 㯠plugin_loader_v2 ã«å§è²ïŒã
- MIR ãã«ãïŒåŒã³åºãçæïŒ:
-
plugin_loader v2 åŽã® env.*:
src/runtime/plugin_loader_v2/enabled/extern_functions.rs:extern_call(iface_name, method_name, args)ã§env.*ãäžæ¬åŠçãhandle_mirbuilder("emit", args):args[0]ã® Program(JSON v0) æååãåãåããhost_providers::mir_builder::program_json_to_mir_jsonã§ MIR(JSON v0) ãè¿ãã
handle_codegen("emit_object", args):args[0]ã® MIR(JSON v0) æååãåãåããny-llvmc ã©ãã (llvm_codegen::mir_json_to_object) ã§ object (.o) ã®ãã¹ãè¿ãã
-
BridgeïŒJSON v0 â MIRïŒã®ç¹å¥æ±ã:
src/runner/json_v0_bridge/lowering/expr.rs:MapVars::resolve:hostbridge/envãç¹æ®å€æ°ãšããŠæ±ãããããã Const(String)"hostbridge"/"env"ãçæããïŒMethod ãã§ãŒã³ãéããããã®ãã¬ãŒã¹ãã«ãïŒã
lower_expr_with_scope:ExprV0::Extern { iface, method, args }âMirInstruction::ExternCall { iface_name, method_name, ... }ãExprV0::Methodã®ç¹å¥ã±ãŒã¹:ConsoleBoxã®print/println/logâExternCall env.console.logãenv.box_introspect.kind(value)ãã¿ãŒã³ âExternCall env.box_introspect.kindã«æ£èŠåã
-
Selfhost ãžã®ç§»æ€æéïŒRust SSOT ã«æ²¿ã£ãç®±èšèšïŒ:
MethodCall:- Hako åŽã§ã¯ãã©ã® Box ã®ã©ã®ã¡ãœããã MIR ã®
mir_call(Method)ã«èœãšãããã Box åäœã® helper ã§ç®¡çããïŒLoopOptsBoxãCli*Boxãšåæ§ã«ïŒã - Rust åŽã®
CallTarget::MethodâCallee::Methodã®å€æã«ãŒã«ïŒreceiver ã¬ãžã¹ã¿ã®æ±ããbox_name/method åïŒã Step 4 ã®èšèšã¡ã¢ãšæããã
- Hako åŽã§ã¯ãã©ã® Box ã®ã©ã®ã¡ãœããã MIR ã®
ExternCall:hostbridge.extern_invoke("env.codegen","emit_object"/"link_object", args)ãenv.mirbuilder.emitãªã©ã¯ã- Rust ã§ã¯æçµçã«
ExternCallâextern_provider_dispatch("env.*", args)âplugin_loader_v2::extern_call("env.*", method, args)/host_providers::*ãšããæ§é ã«ãªã£ãŠããã
- Rust ã§ã¯æçµçã«
- Hako åŽã§ã¯ãenv åïŒã¡ãœããåã®çµïŒ= keyïŒããåæããèã
*BridgeBoxã§ã©ãããããã®ããã§ExternCallLowerBoxãexterncall func="env.codegen.emit_object"ã emit ããã - æªå¯Ÿå¿ã® name/method çµã¯å¿ ã Fail-FastïŒã¿ã°ä»ãïŒã§ provider ã«åãã
ãã® Step 4.1 ããRust åŽã® SSOTããšããŠåºå®ããŠãããPhase 25.1c 以éã§ã¯ãã®å¥çŽã«æ²¿ã£ãŠ Hako åŽã® MethodCall/ExternCall lowering ç®±ãå®è£ ã»æŽçããŠããïŒRust åŽã«æ°ã«ãŒã«ã¯è¿œå ããªãïŒæ¹éãšããã
- å®è£
ã€ã¡ãŒãžïŒPhase 25.1b äžã«ãããšãã® TODOïŒ:
FuncLoweringBoxã«å°ã㪠helper ã远å :_lower_method_call(body_json, func_name, box_name, params_arr)â MethodCall ãã¿ãŒã³æ€åºïŒmir_call Methodçæã_lower_hostbridge_extern(body_json, ...)â env.codegen/env.mirbuilder çšã®æå° ExternCall çæã
_lower_func_bodyã®åé ããæ¢åReturn(Call)ã®ååŸã§ããã helper ãåŒã³åºãããããããå Žåã®ã¿ MIR ãè¿ãã- Tag/ãã°:
HAKO_SELFHOST_TRACE=1æã«[funcs/basic:method.*]/[funcs/basic:extern.*]trace ãåºããã©ã® defs ã Method/Extern çµç±ã§ lowering ãããã芳枬ã§ããããã«ããã
- ã¹ã¢ãŒã¯:
tools/smokes/v2/profiles/quick/core/phase251ã«selfhost_mir_methodcall_basic_vm.shã®ãã㪠canary ã远å ãã- ArrayBox.push / FileBox.open/read/write / env.codegen.emit_object/link_object ã®ä»£è¡šã±ãŒã¹ã selfhost builder-first ã§éãã
mir_call/ extern call ãåºå MIR ã«å«ãŸããŠããããšã確èªããã
Step 1 â CLI entry detection (CliEntryLowerBox)
- ç®ç: Stage1 CLI ã®å
¥å£æ§é ïŒ
Main.mainâHakoCli.runïŒã Program(JSON v0) äžã§æ€åºããselfhost builder ããã©ã® Program ã CLI ãšã³ããªãå«ããããææ¡ã§ããããã«ããïŒèŠ³æž¬å°çšïŒã - äœæ¥:
lang/src/mir/builder/func_body/cli_entry_box.hakoã«CliEntryLowerBoxã远å ãscan(program_json)ã§ä»¥äžã確èªãããã¹ãŠæºãããšãã ãã¿ã°ãåºã:Program.bodyå ã«New(HakoCli)çžåœã® JSONïŒ"class":"HakoCli"ïŒãååšãããdefsé åã«{"box":"HakoCli","name":"run", ...}ãååšããã- å
¥å£ä»è¿ã«
method":"run"ãå«ã Method åŒã³åºããããïŒè»œããã¥ãŒãªã¹ãã£ãã¯ïŒã
- æ¡ä»¶ãæºãããå Žåã
HAKO_SELFHOST_TRACE=1ã®ãšãã«
[builder/cli:entry_detected] main=Main.main run=HakoCli.run/2
ãåºåããæ»ãå€ã¯åžžã«nullïŒMIR ã¯çæããªãïŒã
FuncLoweringBox.lower_func_defsã®å é ã§CliEntryLowerBox.scan(program_json)ãåŒã³åºããdefs éããåŠçãšã¯ç¬ç«ã«ãå ¥å£æ§é ã ãã芳枬ãã§ããããã«ããã
- ã¬ã€ã€ãªã³ã°:
- ãã® Step1 ã¯ãããŸã§ ring1ïŒStage1 CLI ãœãŒã¹ïŒã® Program(JSON v0) ã芳枬ããã ãã§ãring0ïŒRust env.mirbuilder/env.codegenïŒã«ã¯äžå圱é¿ãäžããªãã
- ä»åŸã® Step2/3 ã§
HakoCli.run/Main.mainã®æ¬äœã MIR ã«éãããšãã®ãå ¥ãå£ã€ã³ããã¯ã¹ããšããŠäœ¿ãæ³å®ã
Step 2 â HakoCli.run 圢ç¶ã¹ãã£ã³ïŒCliRunShapeScannerBoxïŒïŒ lower stub
- ç®ç: Stage1 CLI ã®
HakoCli.runãã©ã®ãããªåå²ïŒrun/build/emit/check çïŒãæã£ãŠãããã Program(JSON v0) ããææ¡ããå°æ¥ã®å°çš lowerïŒCliRunLowerBoxïŒãå®å šã«äœ¿ããããäºåã«èŠ³æž¬ããã - äœæ¥:
lang/src/mir/builder/func_body/cli_run_shape_box.hakoã远å ïŒCliRunShapeScannerBoxïŒãscan(program_json)ã§:{"box":"HakoCli","name":"run", ...}ã defs å ããæ€åºãã- Program å
šäœã®æååãã
"run","build","emit","check"ãªã©ã®ãªãã©ã«ãç°¡æã«æŸã£ãŠãbranchesé åãšããŠèšé²ã
HAKO_SELFHOST_TRACE=1ã®ãšãã«
[builder/cli:run_shape] has_run=1 branches=<count>
ãåºåããæ»ãå€ãšããŠ{"has_run":1,"branches":[...]} (MapBox)ãè¿ãïŒçŸç¶ã¯ã¿ã°äž»äœã§å©çšïŒã
lang/src/mir/builder/func_body/cli_run_lower_box.hakoã远å ïŒCliRunLowerBoxïŒã- çŸæ®µéã§ã¯ stub å®è£
:
lower_run(func_name, box_name, params_arr, body_json, func_map)ã¯HakoCli.runã ããã¿ãŒã²ããã«ããHAKO_SELFHOST_TRACE=1æã«
[builder/cli:run_lower:stub] box=HakoCli func=run
ãåºããŠåžžã«nullãè¿ãã- å®éã® MIR éããïŒrun/build/emit/check åå²ãæã€ run æ¬äœã® loweringïŒã¯ãStep2 åŸåãStep3 以éã§å®è£ ããåæã
- çŸæ®µéã§ã¯ stub å®è£
:
FuncLoweringBoxãžã®çµ±å:lower_func_defsã®å é ã§CliRunShapeScannerBox.scan(program_json)ãåŒã³ãStage1 CLI run ã®åœ¢ç¶ãã¿ã°ä»ãã§èŠ³æž¬ã_lower_func_bodyã®åé ã§box_name=="HakoCli" && func_name=="run"ã®ãšãã ãCliRunLowerBox.lower_run(...)ãåŒã³åºããçŸç¶ã¯åžžã«nullãªã®ã§ãåŸæ¥ã® BasicLowerBox / provider çµè·¯ãšæåã¯å€ãããªãã
- ã¬ã€ã€ãªã³ã°:
- Step2 ã Step1 ãšåæ§ãring1ïŒStage1 Hako CLIïŒã®æ§é ã芳枬ããç®±ã®ã¿ã远å ããã
- MIR çæã¯ãŸã Rust provider /æ¢å lower ã«ä»»ããŠãããring0 ã®è²¬åïŒenv.* extern ãå®è¡ãšã³ãžã³ïŒã«ã圱é¿ãäžããªãã
- å°çš lowerïŒ
CliRunLowerBoxãå®éã« MIR ãè¿ã圢ïŒã¯ãStageâB Program(JSON v0) ã®åœ¢ç¶ãåå芳å¯ããŠãããå°ããªãã¿ãŒã³ïŒã·ã³ãã«ãª run/build/emit/check åå²ïŒããšã«æ®µéçã«å®è£ ããã
Step 2.x â HakoCli.run loweringïŒèšèšã¡ã¢ïŒMVP å®è£ ç¶æ³ïŒ
- ãŽãŒã«:
HakoCli.run(me,args)ã®ãã¡ãåçŽãª run/build/emit/check åå²ãã ãã selfhost builder ã§ MIR 颿°ã«éããã- 圢ãå°ãã§ã厩ããŠãããå¿
ã
nullãè¿ããRust provider ã«ãã©ãŒã«ããã¯ããïŒFailâFastïŒã
- 察象ãšãã JSON v0 ã®åœ¢ïŒMVP æ³å®ïŒ:
Local argc = Int(0)If cond Var("args") then { Local argc = Method Var("args").size() }If cond Compare(Var("argc") == Int(0)) then { Return Int(1) }Local cmd_raw = Method Var("args").get(Int(0))Local cmd = Binary("+", Str(""), Var("cmd_raw"))- é£ç¶ãã
Ifã§cmd == "run"|"build"|"emit"|"check"ãå€å®ããããããReturn Call("cmd_*", [me,args])ãæã€ã - æåŸã«
Return Int(2)ïŒunknown commandïŒãæã€ã
- å®è£
ç¶æ³ïŒCliRunLowerBox å
ïŒ:
- ã¿ãŒã²ããå€å®ïŒå®è£
æžã¿ïŒ
box_name=="HakoCli" && func_name=="run"以å€ã¯å³nullã
- æ§é ãã¿ãŒã³ã®æ€èšŒ
_check_shapeïŒå®è£ æžã¿ïŒbody_jsonãæååãšããŠèµ°æ»ããäžèš 1ã7 ã®ã¹ããŒãã¡ã³ããé çªã©ããã«çŸããŠããããJsonFragBoxã§ç¢ºèªïŒããŒã«ã«åãã¡ãœããåãäžèŽãããïŒã- OK ã®ãšã
1ãäžäžèŽã®ãšã0ãè¿ããHAKO_SELFHOST_TRACE=1ã§[builder/cli:run_lower:shape-ok]/[builder/cli:run_lower:unsupported]ãåºãã
- MIR çæïŒMVPïŒ
_emit_mirïŒå®è£ æžã¿ã»æ¢å® OFFïŒ- params_arr=["me","args"] ã r1,r2 ãšã¿ãªããåºå®ã¬ã€ã¢ãŠãã®ã¬ãžã¹ã¿é 眮ã§ç°¡ç¥ MIR(JSON) ãæ§ç¯ã
- ãããã¯æ§é ïŒèŠçŽïŒ:
- argc ã
boxcall size(box=2)ã§èšç®ããargc==0ã®ãšãã¯ret 1ã args.get(0)ã§ cmd_raw ãååŸãã"run"|"build"|"emit"|"check"ãšã®æ¯èŒã§cmd_run/cmd_build/cmd_emit/cmd_checkãboxcallã§åŒã³åºããŠãã®ãŸãŸ retã- ã©ãã«ããããããªãå Žåã¯
ret 2ïŒunknown commandïŒã
- argc ã
- ç°å¢å€æ°
HAKO_MIR_BUILDER_CLI_RUN=1ã®ãšãã«ã ã_emit_mirãåŒã³ããã以å€ã¯ shape OK ã§ãnullãè¿ã㊠provider/æ¢å lower ã«ãã©ãŒã«ããã¯ããïŒæ¢å®æåã¯äžå€ïŒã
- ã¿ã°ãš FailâFastïŒå®è£
æžã¿ïŒ
- 圢ãå®å
šã«äžèŽãã
HAKO_MIR_BUILDER_CLI_RUN=1ã®ãšãã«ã ã MIR ãè¿ããHAKO_SELFHOST_TRACE=1ã§[builder/cli:run_lower:ok] HakoCli.run/2ãåºãã - éäžã§ãã¿ãŒã³ã厩ããŠããå Žåã¯
[builder/cli:run_lower:unsupported] reason=...ãåºããŠnullãè¿ãïŒprovider ãåŒãç¶ãïŒã
- 圢ãå®å
šã«äžèŽãã
- çŸåšã®ã«ãã¬ããž:
.hakoã« HakoCli.run + cmd_* ãçŽæ¥æžããæå°ã±ãŒã¹ã§ã¯ãselfhost builder ã ãã§HakoCli.run/2ã® MIR(JSON) ãçæã§ããããšã
tools/smokes/v2/profiles/quick/core/phase251/selfhost_cli_run_basic_vm.shã§ç¢ºèªæžã¿ã- å®éã® Stage1 launcher.hako ã®
run㯠usage ã¡ãã»ãŒãžåºåãªã©ãå«ãããããã® MVP ã¯ãŸã Stage1 æ¬äœã«ã¯é©çšããŠããªãïŒä»åŸ StageâB Program(JSON v0) ãè©³çŽ°ã«æ¯èŒããªãã察å¿ç¯å²ãåºããïŒã
- ã¿ãŒã²ããå€å®ïŒå®è£
æžã¿ïŒ
Stage1 HakoCli.runïŒæ¬çªïŒãšã®ã®ã£ããæŽçïŒprovider MIR ããŒã¹ïŒ
çŸç¶ããã®ãã¹ãç°å¢ã§ã¯ StageâB å®è¡äžã« Undefined variable: localïŒStageâ3 ããŒã¯ãŒãïŒã§ Program(JSON v0) æœåºã倱æããŠãããããå® launcher.hako ã® HakoCli.run 圢ç¶ã¯ Rust provider ã® MIR(JSON) ããæšå®ããŠããïŒ/tmp/launcher_provider_mir.json ã§ç¢ºèªïŒã
MVP run ãã¿ãŒã³ãš Stage1 å®è£ ã®äž»ãªå·®å:
- argc==0 ã®å Žå:
- MVP:
if argc == 0 { return 1 }ïŒå¯äœçšãªãïŒã - å®è£
: usage ã¡ãã»ãŒãž
[hakorune] usage: hakorune <command> [options]ãprintããŠããret 1ã
- MVP:
- ãµãã³ãã³ã unknown ã®å Žå:
- MVP: åçŽã«
return 2ã - å®è£
:
[hakorune] unknown command: <cmd>ãprintããŠããret 2ã
- MVP: åçŽã«
- æ¯èŒãŸãã:
- äž¡è
ãšã
"run"|"build"|"emit"|"check"æååãšäžèŽå€å®ããŠããããå®è£ åŽã¯ usage/unknown ã¡ãã»ãŒãžçšã®è¿œåbinop/callãè€æ°ãããã¯ã«åå²ããŠããïŒMIR äžã§ãããã¯æ°ãå€ãïŒã
- äž¡è
ãšã
- åŒã³åºãã¿ãŒã²ãã:
- äž¡è
ãšã
cmd_run/cmd_build/cmd_emit/cmd_checkãåŒã³åºãç¹ã¯äžèŽïŒMIR äžã§ã¯boxcallãå°æ¥FuncLoweringã® call_resolve ã§ Global/Method ã«å¯ããäºå®ïŒã
- äž¡è
ãšã
ä»åŸ StageâB Program(JSON v0) ãå®å®ããŠåããããã«ãªã£ãããäžèšã®å·®åã JSON ã¬ãã«ã§å確èªãã
- usage/unknown ã®
printãããã¯ããå眮/åŸçœ®ã®ãµã€ããšãã§ã¯ãããšããŠ_check_shapeã®èš±å®¹ãã¿ãŒã³ã«è¿œå ãããã - ããã㯠run æ¬äœããMVP ãµãã»ããïŒåŒæ°åå²ïŒïŒå°åå°çšãããã¯ãã«åããŠæ±ããã
ãæ±ºããäºå®ã
Stage1 çš run ãã¿ãŒã³æ¡åŒµæ¹éïŒèšèšïŒ
Stage1 launcher.hako ã®æ¬çª HakoCli.run ã selfhost lowering ã®å¯Ÿè±¡ã«å«ããããã®æ¹éã¯æ¬¡ã®ãšãã:
-
ç®ç:
- Rust CLIïŒStage0ïŒãšåãæå³è«ïŒexit code ãšã¡ãã»ãŒãžïŒãç¶æãããŸãŸãStage1 åŽã® run ã selfhost builder ãããæ±ããããã«ããã
- logging/usage éšåïŒprintïŒã¯ããµã€ããšãã§ã¯ãã®ããå眮/åŸçœ®ãããã¯ããšããŠæç€ºçã«æ±ããåå²ããžãã¯æ¬äœãšã¯åé¢ããŠèããã
-
æ¡åŒµã®æ¹åæ§ïŒæ¡ïŒ:
- å眮 usage ãããã¯ã®èš±å®¹
_check_shapeã§ãargc==0 â usage print â ret 1ããšãã圢ãã
ãargc == 0ã® then åŽã«StringBoxconst /binop/call(print)ãå«ãŸããŠãããã
ãšããã«ãŒã«ã«ç·©åããã- lowering æã«ã¯:
- ãŸã usage çšã®æååæ§ç¯ïŒ
printããã®ãŸãŸ MIR ã«åæ ïŒboxcall/externcall env.console.logãªã©ïŒã - ãã®ããšã§
ret 1ã emit ããïŒMVP ã§ã¯ usage æèšã¯ provider MIR ã«æããïŒã
- ãŸã usage çšã®æååæ§ç¯ïŒ
- unknown ãããã¯ã®åŸçœ®èš±å®¹
- MVP ã§ã¯ãunknown ãªã
ret 2ãã®ã¿ãæ±ã£ãŠããããæ¬çªã§ã¯
[hakorune] unknown command: <cmd>ãåºåããŠããret 2ããŠããã _check_shapeããæ«å°Ÿã® Return Int(2) ã®åã« StringBox/binop/printãã¿ãŒã³ãæãŸã£ãŠããŠãããããšè§£éã§ããããã«ãã
lowering åŽã§ãããããã®ãŸãŸ MIR ã«éããïŒprint ããã㯠+ret 2ïŒã
- MVP ã§ã¯ãunknown ãªã
- run æ¬äœïŒåå²ããžãã¯ïŒãšã®åé¢
_check_shapeãäºå±€ã«åãã:check_core_shape⊠argc/args/cmd/ãµãã³ãã³ãåå²ã®ãå¯äœçšãªããéšåã®åœ¢ç¶ãã§ãã¯ãcheck_logging_shape⊠usage/unknown ã®å°åãã¿ãŒã³ã®ã¿ã蚱容ããç·©ããã§ãã¯ã
CliRunLowerBoxã¯ãŸã core ã_emit_mir_coreã§çæããlogging éšåã¯å¿ èŠã«å¿ããŠååŸã«ãããã¯ãè¶³ã圢ã§çµ±åããã
- å眮 usage ãããã¯ã®èš±å®¹
-
ãã°ã«ãšé©çšç¯å²:
- Stage1 æ¬çªãžã®é©çšã¯åžžã«
HAKO_MIR_BUILDER_CLI_RUN=1ïŒæ¢å® OFFïŒã§ã¬ãŒããã
ã〠StageâB Program(JSON v0) ã§check_core_shape/check_logging_shapeã®äž¡æ¹ãæºãããŠããå Žåã ãæå¹ã«ããã - ãã以å€ã®ã±ãŒã¹ïŒprint ã®åœ¢ããããŠãã / 远å ã® case ãå¢ãããªã©ïŒã¯ãä»ãŸã§éã provider çµè·¯ã«éé¿ããã
- Stage1 æ¬çªãžã®é©çšã¯åžžã«
Step 5 â call resolve / methodize åŸåŠç
- ç®ç: çææžã¿ MIR ã«å¯Ÿã㊠call resolver / methodize pass ããããRust provider ãšåãåœåã»åŒã³åºã圢åŒãå®çŸã
- äœæ¥:
HAKO_MIR_BUILDER_CALL_RESOLVE=1ãæ¬æ Œå©çšããcall ã®Const("Box.method/N")ãmir_callã«å€æãStage1 CLI ã§mir_call Methodã䜿ãã±ãŒã¹ããã¹ãããMethodize ãšã®çµã¿åããã§ã厩ããªãããšã確èªã
Step 6 â selfhost-first canary / build_stage1.sh
- ç®ç: selfhost builder ãæ¢å® ON ã«æ»ãæºåã
- äœæ¥:
stage1_launcher_program_to_mir_canary_vm.shã® selfhost-first çã远å ã㊠selfhost builder åç¬ã§ 60KB çŽ MIR ãçæã§ããããšãæ€èšŒãtools/selfhost/build_stage1.shã selfhost-first ã§åããselfhost builder ç±æ¥ã® MIR ã§emit program-json/emit mir-json/build exeãéãããšã確èªã- åé¡ãç¡ããã°
HAKO_SELFHOST_BUILDER_FIRST=1ãæ¢å®ã«æ»ãïŒå¥PRã§ãå¯ïŒã
äœæ¥é 㯠Step 0 â 1 â 2 â 3 â 4 â 5 â 6 ãæ³å®ãåã¹ãããã§å¿ ã docsïŒãã®ãã¡ã€ã«ïŒCURRENT_TASKïŒãšã¹ã¢ãŒã¯/ãã¹ããæŽæ°ããã
çŸç¶ïŒ2025-11-16 æç¹ïŒã®é²æ:
- Step0ã3: å®è£ æžã¿ïŒFail-Fast å°ç·ã»Local/If/Return åºæ¬åœ¢ã»LoopForm æ£èŠåæžã¿ Loop ã®åã蟌ã¿ïŒã
- Step4:
- MethodCall:
FuncBodyBasicLowerBox._try_lower_return_methodã§Return(Method recv.method(args))圢ã®ãã¡ãArrayBox.size/getïŒparams ããŒã¹ receiverïŒãš StringBox.lengthïŒåŒæ°ãªãïŒãæå°ã«ããŒæžã¿ãçæããã MIR ã¯mir_call { callee: { type: "Method", box_name: "<ArrayBox|StringBox>", method, receiver }, args: [...] }圢åŒã - ExternCall:
lang/src/mir/builder/func_body/extern_call_box.hakoã«ExternCallLowerBox.lower_hostbridgeã远å ããReturn(hostbridge.extern_invoke("env.codegen","emit_object"|"link_object", Var(arg)))ãexterncall env.codegen.emit_object|link_objectïŒretã« lowering ããæå°ãã¿ãŒã³ãå®è£ ãFuncLoweringBox._lower_func_bodyãã BasicLowerBox ã®æ¬¡ã«åŒã³åºãããé ç·ã - Canary:
tools/smokes/v2/profiles/quick/core/phase251/selfhost_mir_methodcall_basic_vm.sh/selfhost_mir_extern_codegen_basic_vm.shã远å ïŒçŸç¶ã¯ã察象ãã¿ãŒã³ã«ãŸã å°éããŠããªããå Žåã« SKIP ãã canary ãšããŠåäœïŒã
- MethodCall:
- Step5ã6: æªçæïŒMethod/Extern ã®ã«ããŒç¯å²ãå®éã® Stage1 CLI ãã¿ãŒã³ãŸã§åºãã£ã段éã§ selfhost-first canary / build_stage1.sh ãžé²ããïŒã
Stage1 CLI defs vs selfhost builder 察å¿ç¶æ³ïŒã¹ãããã·ã§ããïŒ
Stage1 CLI ã©ã³ãã£ïŒlang/src/runner/launcher.hakoïŒã«ã€ããŠãtools/hakorune_emit_mir.sh ã provider-firstïŒHAKO_SELFHOST_BUILDER_FIRST=0ïŒã§å®è¡ããRust provider ãåºåãã MIR(JSON) ããå颿°ã® Method/Extern 颚ãã¿ãŒã³ãéèšããçµæ:
- éèšã³ãã³ãïŒäŸïŒ:
HAKO_SELFHOST_BUILDER_FIRST=0 NYASH_JSON_ONLY=1 bash tools/hakorune_emit_mir.sh lang/src/runner/launcher.hako /tmp/launcher_provider_mir.json- Python ã§
functions[].blocks[].instructions[].op in {"boxcall","mir_call","externcall"}ãèµ°æ»ããMethod/Extern ãããç®æãæœåºã
- 泚æ:
- çŸè¡ã® provider MIR ã§ã¯ãStage1 CLI ã®ã¡ãœããåŒã³åºãã¯ãã¹ãŠ
boxcallã§è¡šçŸãããŠãããmir_call(Method)ã«ã¯ãŸã æ£èŠåãããŠããªãã - selfhost builder 㯠StageâB ã® Program(JSON v0) äžã§
MethodããŒããèŠãŠ lowering ããèšèšã§ãããããäžè¡šã®ãMethod åã㯠Program åŽã®ã¡ãœããã»ãããæšå®ããããã®åèæ å ±ãšããŠæ±ãã
- çŸè¡ã® provider MIR ã§ã¯ãStage1 CLI ã®ã¡ãœããåŒã³åºãã¯ãã¹ãŠ
| MIR function | Method ãã¿ãŒã³ïŒprovider MIR äžã® boxcall/mir_callïŒ | Extern 颚ãã¿ãŒã³ | selfhost builder åŽã®çŸç¶ |
|---|---|---|---|
HakoCli._read_file/3 |
open, read, closeïŒFileBox ç±æ¥ãšæšå®ïŒ |
ãªã | FileBox ç³»ã¡ãœããã¯æªå¯Ÿå¿ |
HakoCli._write_file/5 |
open, write, closeïŒFileBoxïŒ |
ãªã | åäžïŒæªå¯Ÿå¿ïŒ |
HakoCli.cmd_build/2 |
cmd_build_exe, get, sizeïŒargs.get/size ãªã©ïŒ |
ãªã | args.size/get 圢㯠Step4 helper ããïŒãã ã颿°æ¬äœå
šäœã¯æªå¯Ÿå¿ïŒ |
HakoCli.cmd_build_exe/2 |
_read_file, emit_from_program_json_v0, emit_program_json_v0, extern_invoke, get, indexOf, push, size |
extern_invoke ã hostbridge çµç±ã® Extern çžåœ |
extern_invoke("env.codegen",âŠ) çš ExternCallLowerBox è¿œå æžã¿ïŒä»ã¡ãœããã¯æªå¯Ÿå¿ |
HakoCli.cmd_emit/2 |
cmd_emit_mir_json, cmd_emit_program_json, get, size |
ãªã | args.size/get ã®ã¿ helper 察象åè£ |
HakoCli.cmd_emit_mir_json/2 |
_read_file, _write_file, emit_from_program_json_v0, emit_program_json_v0, get, indexOf, set, size |
ãªã | FileBox ç³»ïŒindexOfïŒset ã¯æªå¯Ÿå¿ |
HakoCli.cmd_emit_program_json/2 |
_read_file, _write_file, emit_program_json_v0, get, indexOf, size |
ãªã | åäž |
HakoCli.run/2 |
cmd_build, cmd_check, cmd_emit, cmd_run, get, size |
ãªã | args.size/get helper 察象ïŒme.cmd_* self-call ã¯æªå¯Ÿå¿ |
main |
runïŒMain.main â HakoCli.run åŒã³åºãïŒ |
ãªã | main çžåœã¯ provider/main éããã«äŸå |
ãã®ã¹ãããã·ã§ããããåããäžè¶³ç¹ïŒ2025-11-16 çŸåšïŒ:
- MethodCall åŽ:
- Stage1 CLI ã§å®éã«äœ¿ãããŠããã¡ãœããã¯ãFileBoxïŒopen/read/write/closeïŒãArray/Map ç³»ïŒsize/get/set/pushïŒãString ç³»ïŒindexOfïŒãªã©å€å²ã«ãããããselfhost builder ã defs åŽã§å°çšã«æ±ããŠããã®ã¯
args.size/getãšString.lengthã®åçŽãª Return 圢ã®ã¿ã me.cmd_*ç³» self-callïŒcmd_build_exeãªã©ïŒã¯ãçŸç¶_lower_return_callããŒã¹ã®ç°¡æ Call éããã«é Œã£ãŠãããStage1 CLI ã®è€éãªæ¬äœã«ã¯ãŸã 察å¿ã§ããŠããªãã- ExternCall åŽ:
- Stage1 CLI ã® AOT çµè·¯ã§éèŠãª
hostbridge.extern_invoke("env.codegen","emit_object|link_object", args)ã¯ãExternCallLowerBox ã§æå°å¯Ÿå¿æžã¿ã ããå®éã® Stage1 CLI defs ãããã® helper ã«å°éããŠãããã©ããã¯ãä»åŸ Program(JSON v0) åŽã®ãã¿ãŒã³ã粟æ»ããå¿ èŠãããã - ãã以å€ã® ExternïŒ
env.mirbuilder.emit,env.console.*ãªã©ïŒã¯ãselfhost builder ã§ã¯çŸæç¹ã§æ±ã£ãŠããããRust provider / ããŒãã¹åŽã«äŸåããŠããã
- Stage1 CLI ã§å®éã«äœ¿ãããŠããã¡ãœããã¯ãFileBoxïŒopen/read/write/closeïŒãArray/Map ç³»ïŒsize/get/set/pushïŒãString ç³»ïŒindexOfïŒãªã©å€å²ã«ãããããselfhost builder ã defs åŽã§å°çšã«æ±ããŠããã®ã¯
ãã®è¡šãããŒã¹ã«ãä»åŸã®å°ã㪠helper æ¡åŒµïŒäŸ: FileBox çšã¡ãœããéããç®±ãArray/Map ã® push/set/indexOf éããç®±ãme.cmd_* self-call çšã®å°çš CallLowerBox ãªã©ïŒã段éçã«è¿œå ããŠããäºå®ã
Phase 25.1b ã®æ®ã¿ã¹ã¯ãšããŠã¯ããStage1 CLI ã§æ¬åœã«å¿
èŠãªã¡ãœããïŒExtern ãã¿ãŒã³ãã ããåªå
ãããã以å€ã¯åŒãç¶ã Rust provider ãéé¿è·¯ãšããŠäœ¿ãæ¹éãç¶æããã
ã¹ã¢ãŒã¯æ§ææ¹éïŒRust builder ãš selfhost builder ã®ãã¢ãªã³ã°ïŒ
- ç®ç:
- Rust åŽã® loop/method/extern ã¹ã¢ãŒã¯ã ãã®ãŸãŸãæ£è§£ããšããŠäœ¿ãåãã€ã€ãåã .hako ã selfhost builder ã§éã canary ãæšªã«äžŠã¹ããã©ã®çµè·¯ãå£ããŠããããããã©ã«ãåã ãã§å€å¥ã§ããããã«ããã
- åºæ¬ã«ãŒã«:
- æ¢åã® v2 ã¹ã¢ãŒã¯æ§é ïŒ
tools/smokes/v2/profiles/quick/core/phaseXXXX/ïŒã¯ç¶æãããã®çŽäžã«ãprovider-firstããšãselfhost-firstãã® ãã¢ã¹ã¯ãªãã ã眮ãã - åœåäŸ:
*_provider_vm.sh⊠æ¢åã©ãã Rust builderïŒprovider-firstïŒçµè·¯ã確èªããã¹ã¢ãŒã¯ã*_selfhost_vm.sh⊠åã .hako / æåŸ rc ã selfhost-firstïŒHAKO_SELFHOST_BUILDER_FIRST=1ïŒã§ç¢ºèªããã¹ã¢ãŒã¯ã
- ã«ãŒãç³»:
- äŸãšããŠ
phase2100ã® LoopForm/PHI canaryïŒRust ããŒã¹ïŒã«å¯Ÿå¿ããŠãtools/smokes/v2/profiles/quick/core/phase2100/loop_jsonfrag_provider_vm.shtools/smokes/v2/profiles/quick/core/phase251/loop_jsonfrag_selfhost_vm.shã®ãããªçµã¿åãããæ³å®ïŒå®éã®ãã¡ã€ã«åã¯ä»åŸã®å®è£ ã§ç¢ºå®ïŒã
- äŸãšããŠ
- Stage1 CLI ç³»:
- æ¢åã®
stage1_launcher_program_to_mir_canary_vm.shïŒprovider-firstïŒã«å¯ŸããŠãstage1_launcher_program_to_mir_selfhost_vm.shïŒselfhost-first; builder MIR ã§ 60KB çŽåºåãæåŸ ïŒ ãphase251åŽã«è¿œå ããã
- æ¢åã®
- æ¢åã® v2 ã¹ã¢ãŒã¯æ§é ïŒ
- éçš:
- quick ãããã¡ã€ã«ã§ã¯ provider-first ã¹ã¢ãŒã¯ãæ¢å® ON ãšããselfhost-first ã¹ã¢ãŒã¯ã¯ Phase 25.1b äžã¯ä»»æïŒéçºçšïŒãšããã
- selfhost-first ã¹ã¢ãŒã¯ãååã«å®å®ããStage1 build ã selfhost-first ã§éãããã«ãªã£ãæç¹ã§ãå¿ èŠã«å¿ã㊠CI quick ãããã¡ã€ã«ãžã®ææ Œãæ€èšããã