Remove legacy hardcoded 'sum' carrier validation that was blocking array_filter patterns with different accumulator names (e.g., 'out'). Before: Pattern3 required carrier named 'sum' to exist After: Pattern3 uses carrier_info generically (any carrier name works) Test results: - phase49_joinir_array_filter_smoke: PASS â - phase49_joinir_array_filter_fallback: PASS â - phase49_joinir_array_filter_ab_comparison: PASS â - Full suite: 909/909 PASS, 0 FAIL Also: Archive old roadmap documentation (67k lines moved to docs/archive/) ð€ Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
12 KiB
Geminiå çã®Nyash ABIæŠç¥åæ (2025-09-01)
質åå 容
Nyashãã©ã°ã€ã³ã·ã¹ãã ã® ABIæŠç¥ã«ã€ããŠæè¡ççžè«ã§ãã
ãèæ¯ã Phase 12ã§Nyashã¹ã¯ãªãããã©ã°ã€ã³ã·ã¹ãã ãå®è£ äžã§ããçŸåšããã©ã°ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ã®èšèšã§éèŠãªå€æãå¿ èŠã§ãã
ãçŸç¶ã
- æ¢å: C ABIïŒã·ã³ãã«ãé«éãå®çžŸããïŒ
- ææ¡: Nyash ABIïŒ3Ãu64æ§é äœãåæ å ±ä»ããæ¡åŒµæ§é«ãïŒ
ããã¬ãŒããªãã C ABI:
- å©ç¹: ãŒããªãŒããŒããããæ¢åè³ç£æŽ»çšãã·ã³ãã«
- æ¬ ç¹: åæ å ±ãªããæ¡åŒµæ§éå®ããšã©ãŒåŠçãåå§ç
Nyash ABI:
- å©ç¹: åå®å šãã¡ã¿ããŒã¿æŽ»çšãå°æ¥æ§ïŒasyncçïŒ
- æ¬ ç¹: pack/unpackã®ãªãŒããŒããããæ°èŠåŠç¿ã³ã¹ã
ãå ·äœçãªéžæè¢ã
- Nyash ABIã®ã¿ïŒçµ±äžæ§éèŠïŒ
- C ABI + Nyash ABIäž¡æ¹ïŒå®çšæ§éèŠïŒ
- ãã®ä»ã®é©æ°çã¢ãããŒãïŒ
ã質åã
- ã©ã¡ãã®æŠç¥ãé·æçã«èŠãŠè³¢æã§ããããïŒ
- äž¡æ¹ãµããŒãããå Žåã®è€éæ§ã¯ç®¡çå¯èœã§ããããïŒ
- ä»ã®èšèªã§ã®æåäŸã»å€±æäŸããåŠã¹ãããšã¯ïŒ
- VM/JITæé©åã®èгç¹ãããã©ã¡ããæå©ã§ããããïŒ
Geminiå çã®åç
Nyashãã©ã°ã€ã³ã·ã¹ãã ã«ãããABIæŠç¥ã®æè¡çèå¯
Nyashãã©ã°ã€ã³ã·ã¹ãã ã®é·æçãªãšã³ã·ã¹ãã çºå±ãèŠæ®ããABIïŒApplication Binary InterfaceïŒæŠç¥ã«ã€ããŠãæ·±ãæè¡çã«èå¯ããŸãã
1. ABIå®å®æ§ã®éèŠæ§ïŒãšã³ã·ã¹ãã æåã®ç€
ãã©ã°ã€ã³ã·ã¹ãã ã®æåã¯ãABIã®éå£ã®å®å®æ§ã«ããã£ãŠããŸãããã¹ãã¢ããªã±ãŒã·ã§ã³ïŒNyashïŒãšãã©ã°ã€ã³ã¯ãå¥ã ã«ã³ã³ãã€ã«ã»é åžããããã€ããªã§ããäž¡è ãæ£ããå調åäœã§ããã®ã¯ã颿°åŒã³åºãèŠçŽãããŒã¿å衚çŸãã¡ã¢ãªã¢ãã±ãŒã·ã§ã³ãšãã£ãäœã¬ãã«ãªèŠçŽãããªãã¡ABIãå³å¯ã«äžèŽããŠããããã§ãã
ããNyashã®ããŒãžã§ã³ã¢ããã§ABIã«ç Žå£ç倿Žãçããã°ãæ¢åã®å šãã©ã°ã€ã³ã¯åäœããªããªããåã³ã³ãã€ã«ãå¿ èŠã«ãªããŸããããã¯ãšã³ã·ã¹ãã ã«ãšã£ãŠèŽåœçã§ããéçºè ã¯è¿œåŸã諊ãããŠãŒã¶ãŒã¯ãã©ã°ã€ã³ã䜿ããªããªãããšãæããŠNyashã®ã¢ããããŒããããããã§ãããã
ãããã£ãŠãABIæŠç¥ã®æåªå ç®æšã¯**ãåæ¹äºææ§ïŒæ°ããNyashãå€ããã©ã°ã€ã³ãåãããïŒãšãå¯èœãªéãã®åŸæ¹äºææ§ïŒå€ãNyashãæ°ãããã©ã°ã€ã³ã®æ©èœãéå®çã«ã§ãå©çšã§ããïŒã**ãä¿èšŒããããšã§ãã
2. çŸç¶ã®åæãšæœåšçãªã¹ã¯
çŸåšã®Nyashã®ã³ãŒãããŒã¹ã調æ»ãããã©ã°ã€ã³é¢é£ã®å®è£
ãç¹å®ããå¿
èŠããããŸããCargo.tomlããœãŒã¹ã³ãŒããããããããRustã®ãã€ãããã¯ã©ã€ãã©ãªïŒ.so, .dll, .dylibïŒãåçã«èªã¿èŸŒã圢åŒãæ¡çšãããŠãããšæšæž¬ãããŸãã
ããã§æãèŠæãã¹ãã¯ãRuståºæã®ABIã«äŸåããããšã®ãªã¹ã¯ã§ããRustã³ã³ãã€ã©ã¯ãããã©ãŒãã³ã¹æé©åã®ããã«ãæ§é äœã®ã¡ã¢ãªã¬ã€ã¢ãŠãã颿°åŒã³åºãèŠçŽãããŒãžã§ã³éã§äºåãªã倿ŽããŸãããããã£ãŠãextern "Rust"ïŒããã©ã«ãïŒã®é¢æ°ããã©ã°ã€ã³å¢çãšããŠå
¬éããã®ã¯ããšã³ã·ã¹ãã ã®èгç¹ããã¯çµ¶å¯Ÿã«é¿ããªããã°ãªããŸããã
çŽ æŽãããïŒæ€çŽ¢çµæãããNyashã¯ãã§ã« extern "C" ãåºç¯å²ã«å©çšããŠããããšãæç¢ºã«ããããŸããããã¯éåžžã«è¯ãåºçºç¹ã§ããplugin_loader_v2.rs ã bid/plugin_api.rs ãªã©ãèŠããšããã©ã°ã€ã³ã®åæåïŒnyash_plugin_initïŒã颿°åŒã³åºãïŒinvoke_fnïŒã®ã·ã°ããã£ãC ABIã§å®çŸ©ãããŠããŸãã
ããã¯ãABIå®å®æ§ã«å¯Ÿããåºæ¬çãªçè§£ããããžã§ã¯ãã«æ¢ã«ååšããããšã瀺ããŠããŸããããããé·æçãªãšã³ã·ã¹ãã ãç¯ãã«ã¯ããããããã«æšãé²ããããæŽç·ŽãããæŠç¥ãç«ãŠãå¿ èŠããããŸãã
3. é·æçãªçºå±ã®ããã®ABIæŠç¥ææ¡
çŸåšã® extern "C" ããŒã¹ã®ã¢ãããŒããåºç€ãšãã€ã€ã以äžã®æŠç¥ã段éçã«å°å
¥ããããšãææ¡ããŸãã
æŠç¥1ïŒC ABIããå ¬åŒãªå®å®å¢çããšããŠå³æ Œã«å®çŸ©ã»ææžåãã
ããã¯æãéèŠã§ããextern "C" ã䜿ã£ãŠãããšããã ãã§ã¯äžååã§ããããå
¬åŒãªèŠçŽãšããŠç¢ºç«ããå¿
èŠããããŸãã
å ·äœçãªã¢ã¯ã·ã§ã³:
-
ABI仿§æžã®äœæ:
nyash-abi.hã®ãããªCããããŒãã¡ã€ã«åœ¢åŒã§ããã©ã°ã€ã³ãå®è£ ãã¹ã颿°ã·ã°ããã£ãšãNyashãæäŸãããã¹ã颿°ïŒã³ãŒã«ããã¯ïŒããã¹ãŠå®çŸ©ããŸããinvoke_fnã§äœ¿ãããŠãã*const u8,*mut u8ã®ãããªãã€ããã€ã³ã¿ããå ·äœçã«ã©ã®ãããªããŒã¿ãæãã®ãïŒã·ãªã¢ã©ã€ãºåœ¢åŒãã¬ã€ã¢ãŠããªã©ïŒãå³å¯ã«ææžåããŸããNyashHostVtableã®ãããªæ§é äœã¯ããã£ãŒã«ãã®é åºãšåãæªæ¥æ°žå«å€ãããªãããšãä¿èšŒããªããã°ãªããŸãããæ°ãããã¹ã颿°ã远å ããå Žåã¯ãæ«å°Ÿã«ã®ã¿è¿œå ããŸãã- ãšã©ãŒå ±åã®èŠçŽïŒæ»ãå€ã®
i32ãäœãæå³ããã®ãïŒãå®çŸ©ããŸãã
-
FFIïŒForeign Function InterfaceïŒå±€ã®æç¢ºå:
- Nyashå
éšã®Rustã³ãŒããšãC ABIå¢çãæç¢ºã«åé¢ããŸãã
plugin_loader_v2.rsã¯ãã®åœ¹å²ãæ ã£ãŠããããã§ããããã®å±€ã¯ãABI倿ãã«ã®ã¿è²¬ä»»ãæã€ã¹ãã§ããå éšçãªãªãã¡ã¯ã¿ãªã³ã°ãABIã«åœ±é¿ãäžããªãããã«ããŸãã
- Nyashå
éšã®Rustã³ãŒããšãC ABIå¢çãæç¢ºã«åé¢ããŸãã
å©ç¹:
- èšèªéäŸå: C ABIã¯ããããäž»èŠèšèªïŒC++, Zig, Go, Python, etc.ïŒããå©çšå¯èœã§ããã©ã°ã€ã³éçºè ã®è£ŸéãåºããŸãã
- 究極ã®å®å®æ§: C ABIã¯æ°å幎ã«ãããå®å®ããŠããŸãã
æ¬ ç¹:
- 衚çŸåã®äœã: Rustã®
ResultãOptionãã©ã€ãã¿ã€ã ãšãã£ãè±ããªåæ å ±ãçŽæ¥æž¡ãããi32ã®ãšã©ãŒã³ãŒãããã€ã³ã¿ã®NULLãã§ãã¯ãšãã£ãããªããã£ããªæ¹æ³ã«é ŒããããåŸãŸããã - æäœæ¥ãš
unsafe: ããŒã¿ã®ã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºããã€ã³ã¿æäœãå¿ é ãšãªããunsafeã³ãŒããå¢ãããã°ã®æž©åºã«ãªããããã§ãã
æŠç¥2ïŒé«ã¬ãã«ãªãRuståãã©ãããŒSDKããæäŸãã
C ABIã®æ¬ ç¹ãè£ãããããã©ã°ã€ã³éçºè ãçŽæ¥C ABIãè§ŠããªããŠãæžãããã«ãå ¬åŒã®Rust補SDKïŒã¯ã¬ãŒãïŒãæäŸããŸãã
å ·äœçãªã¢ã¯ã·ã§ã³:
nyash-plugin-sdkã¯ã¬ãŒãã®äœæ:- ãã®SDKã¯ãäœã¬ãã«ãªC ABIã®ããåãããã¹ãŠã«ãã»ã«åããŸãã
- ãã©ã°ã€ã³éçºè
ã¯ã
Result<MyData, MyError>ã®ãããªèªç¶ãªRustã®åãæ±ãã ãã§ãSDKãèªåçã«C ABIæºæ ã®ããŒã¿ïŒãã€ãåããšã©ãŒã³ãŒãïŒãšã®çžäºå€æãè¡ããŸãã - å®åçãªã³ãŒããèªåçæãããã¯ãïŒäŸ:
#[nyash_plugin]ïŒãæäŸããéçºäœéšãåäžãããŸãã
SDKå©çšè ã®ã³ãŒãïŒã€ã¡ãŒãžïŒ:
// ãã©ã°ã€ã³éçºè
ãæžãã³ãŒã
use nyash_plugin_sdk::{plugin, NyashResult, NyashError};
struct MyPlugin;
#[plugin]
impl Plugin for MyPlugin {
fn handle_request(&self, input: &str) -> NyashResult<String> {
if input == "hello" {
Ok("world".to_string())
} else {
Err(NyashError::new("Invalid input"))
}
}
}
SDKå éšã®å®è£ ïŒã€ã¡ãŒãžïŒ:
// #[plugin] ãã¯ããçæããã³ãŒã
#[no_mangle]
pub unsafe extern "C" fn nyash_plugin_invoke(
/* C ABIåŒæ° */
) -> i32 {
// 1. C ABIã®ãã€ãåãã &str ãžãã·ãªã¢ã©ã€ãº
// 2. MyPlugin::handle_request ãåŒã³åºã
// 3. çµæã® Result<String, NyashError> ãC ABIã®ãšã©ãŒã³ãŒããšãã€ãåã«ã·ãªã¢ã©ã€ãº
// 4. çµæãè¿ã
// ... ãã®éšåã¯SDKãé èœãã ...
}
å©ç¹:
- é«ãéçºè äœéš: Rustéçºè ã¯ãå®å šã§æ £çšçãªRustã³ãŒããæžãããšã«éäžã§ããŸãã
- å®å
šæ§ã®åäž:
unsafeã³ãŒããSDKã«éçŽãããããšã§ããã©ã°ã€ã³éçºè ãã¡ã¢ãªå®å šæ§ãç Žå£ãããªã¹ã¯ãå€§å¹ ã«äœæžã§ããŸãã
æŠç¥3ïŒããŒã¿äº€æãã©ãŒãããã®æšæºå
invoke_fn ã§ããåãããã *const u8 ã®äžèº«ãæšæºåããŸããããã«ãããå
ç¢æ§ãšåæ¹äºææ§ãåäžããŸãã
åè£:
-
Protocol Buffers / FlatBuffers:
- å©ç¹: ã¹ããŒãå®çŸ©ãæç¢ºã§ãåæ¹ã»åŸæ¹äºææ§ãèæ ®ããèšèšã容æãå€èšèªå¯Ÿå¿ã®ã³ãŒãçæããŒã«ãè±å¯ãããã©ãŒãã³ã¹ãé«ãã
- æ¬ ç¹: ãã«ãããã»ã¹ã«äžæéå ããã
-
JSON / MessagePack:
- å©ç¹: åçã§æè»ããããã°ã容æã
- æ¬ ç¹: ã¹ããŒãããªããããå®è¡æãšã©ãŒã«ãªãããããã·ãªã¢ã©ã€ãºã»ãã·ãªã¢ã©ã€ãºã®ãªãŒããŒããããæ¯èŒçå€ããã
æšå¥š: é·æçãªãšã³ã·ã¹ãã ã®å®å®æ§ãèãããšãã¹ããŒãããŒã¹ã® Protocol Buffers ãŸã㯠FlatBuffers ãæé©ã§ãã
æŠç¥4ïŒWebAssembly (Wasm) ã®æ¡çšæ€èš
究極ã®ç®æšãšããŠããã©ã°ã€ã³ãWebAssemblyã¢ãžã¥ãŒã«ãšããŠå®è¡ããæ¹åŒãæ€èšãã䟡å€ããããŸãã
å©ç¹:
- ãµã³ãããã¯ã¹å: Wasmã©ã³ã¿ã€ã ïŒWasmtimeãªã©ïŒäžã§ãã©ã°ã€ã³ãå®è¡ããããšã§ãNyashæ¬äœããå®å šã«éé¢ãããå®å šãªç°å¢ãæäŸã§ããŸããæªæã®ãããã©ã°ã€ã³ããã°ã®ãããã©ã°ã€ã³ããã¹ããã¯ã©ãã·ã¥ãããã®ãé²ããŸãã
- çã®èšèªéäŸå: C ABIãããããã«å€ãã®èšèªïŒã³ã³ãã€ã«ã¿ãŒã²ããã«WASIãæã€ãã®ïŒããã©ã°ã€ã³éçºã«å©çšå¯èœã«ãªããŸãã
- WASIãšã³ã³ããŒãã³ãã¢ãã«: WASIïŒWebAssembly System InterfaceïŒãWasm Component Modelã®æšæºåãé²ãããšã§ããã¡ã€ã«ã¢ã¯ã»ã¹ããããã¯ãŒã¯ãªã©ã®ãã¹ãæ©èœãžã®ã¢ã¯ã»ã¹ãæšæºåãããããæŽç·ŽãããABIãæ§ç¯ã§ããŸãã
æ¬ ç¹:
- ããã©ãŒãã³ã¹ãªãŒããŒããã: C ABIã®ãã€ãããã¯ã©ã€ãã©ãªåŒã³åºãã«æ¯ã¹ãWasmã©ã³ã¿ã€ã ãä»åšãããããšã«ãããªãŒããŒããããååšããŸãã
- å®è£ ã®è€éã: Wasmã©ã³ã¿ã€ã ã®çµã¿èŸŒã¿ãšããã¹ãã»ã²ã¹ãéã®ããŒã¿å ±æïŒç¹ã«è€éãªããŒã¿æ§é ïŒã®å®è£ ã¯è€éã«ãªããŸãã
ãŸãšããšæèš
Nyash㯠extern "C" ã®æ¡çšã«ãããABIå®å®åãžã®æ£ããäžæ©ãèžã¿åºããŠããŸããé·æçãªãšã³ã·ã¹ãã ã®ç¹æ ã®ããã以äžã®ããŒãããããææ¡ããŸãã
-
çæïŒããçæãã¹ãïŒ:
- C ABIã®å
ŒΌ:
nyash-abi.hçžåœã®ä»æ§ãå®çŸ©ããææžåããã - ããŒã¿ãã©ãŒãããã®éžå®:
invoke_fnã§äº€æãããããŒã¿ã®ã·ãªã¢ã©ã€ãºåœ¢åŒãšããŠProtocol Buffersçãå°å ¥ããã
- C ABIã®å
ŒΌ:
-
äžæïŒãšã³ã·ã¹ãã ã®æé·æïŒ:
- RuståãSDKã®æäŸ:
nyash-plugin-sdkã¯ã¬ãŒããéçºããRustéçºè ã®äœéšãåäžãããã - ä»èšèªåãSDKã®æäŸ: éèŠã«å¿ããŠãPythonãGoåãã®ã©ãããŒã©ã€ãã©ãªãæäŸããã
- RuståãSDKã®æäŸ:
-
é·æïŒæªæ¥ã®ããžã§ã³ïŒ:
- WebAssemblyãžã®ç§»è¡: ããã©ãŒãã³ã¹èŠä»¶ãšã»ãã¥ãªãã£èŠä»¶ã倩秀ã«ããããã©ã°ã€ã³å®è¡ç°å¢ãWasmã«ç§»è¡ããããšãæ€èšãããããã«ããã究極ã®å®å šæ§ãšç§»æ€æ§ãç²åŸã§ããã
ãã®æŠç¥ã«ãããNyashã¯å®å®æ§ãéçºè äœéšãå®å šæ§ã段éçã«åäžãããæŽ»çºã§æç¶å¯èœãªãã©ã°ã€ã³ãšã³ã·ã¹ãã ãæ§ç¯ã§ãããšç¢ºä¿¡ããŸãã