86 lines
3.3 KiB
Plaintext
86 lines
3.3 KiB
Plaintext
|
|
Nyashプログラミング言語のInstanceBoxアーキテクチャについて深い技術相談です。
|
|||
|
|
|
|||
|
|
【現在の状況】
|
|||
|
|
Phase 9.78eでinstance_v2統一実装を進めています。統一レジストリ(UnifiedBoxRegistry)によりビルトインBox、ユーザー定義Box、プラグインBoxをすべて同じインターフェースで生成する仕組みを実装しました。
|
|||
|
|
|
|||
|
|
【発生している問題】
|
|||
|
|
BuiltinBoxFactoryがStringBoxを作る際、InstanceBoxでラップして返しています:
|
|||
|
|
```rust
|
|||
|
|
// StringBox作成時
|
|||
|
|
let inner = StringBox::new(value);
|
|||
|
|
let instance = InstanceBox::from_any_box("StringBox".to_string(), Box::new(inner));
|
|||
|
|
Ok(Box::new(instance) as Box<dyn NyashBox>)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
しかし、演算子処理(try_add_operation)が直接StringBoxを期待しているため:
|
|||
|
|
```
|
|||
|
|
❌ Runtime error:
|
|||
|
|
⚠️ Invalid operation: Addition not supported between StringBox and StringBox
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
【2つの選択肢】
|
|||
|
|
|
|||
|
|
Option 1: すべてのBoxをInstanceBoxでラップする統一アーキテクチャ
|
|||
|
|
- StringBox → InstanceBox<StringBox>
|
|||
|
|
- IntegerBox → InstanceBox<IntegerBox>
|
|||
|
|
- UserBox → InstanceBox<UserBox>
|
|||
|
|
- 演算子処理をInstanceBox対応に修正
|
|||
|
|
|
|||
|
|
Option 2: ビルトインは直接返す混在アーキテクチャ
|
|||
|
|
- StringBox → StringBox(直接)
|
|||
|
|
- UserBox → InstanceBox<UserBox>
|
|||
|
|
- ビルトインと他で扱いが異なる
|
|||
|
|
|
|||
|
|
【Option 1を推奨する理由】
|
|||
|
|
|
|||
|
|
1. Everything is Box哲学の完全実現
|
|||
|
|
- すべてのBoxが同じ形で統一される美しさ
|
|||
|
|
- ビルトイン、ユーザー定義、プラグインの区別なし
|
|||
|
|
|
|||
|
|
2. 将来の拡張性
|
|||
|
|
- プラグインBoxも同じように扱える
|
|||
|
|
- 新しいBox型追加時も同じパターン
|
|||
|
|
|
|||
|
|
3. デバッグ・保守性
|
|||
|
|
- 統一構造によりデバッグツールが書きやすい
|
|||
|
|
- メモリ管理、ライフサイクル管理が統一的
|
|||
|
|
|
|||
|
|
4. ユーザー体験の一貫性
|
|||
|
|
- ユーザーから見て全Box型が同じ挙動
|
|||
|
|
- 継承・デリゲーションも統一的
|
|||
|
|
|
|||
|
|
【技術的な懸念事項】
|
|||
|
|
|
|||
|
|
1. パフォーマンス
|
|||
|
|
- 二重構造によるオーバーヘッド
|
|||
|
|
- 演算子呼び出し時の追加のダウンキャスト
|
|||
|
|
|
|||
|
|
2. 実装の複雑さ
|
|||
|
|
- すべての演算子処理を修正する必要
|
|||
|
|
- 既存コードとの互換性
|
|||
|
|
|
|||
|
|
3. 型安全性
|
|||
|
|
- inner_contentがOption<Box<dyn NyashBox>>なので、実行時チェックが必要
|
|||
|
|
|
|||
|
|
【質問】
|
|||
|
|
1. このアーキテクチャ選択についてどう思われますか?
|
|||
|
|
2. パフォーマンスへの影響は許容範囲でしょうか?(最適化は後回しで良い前提)
|
|||
|
|
3. Everything is Box哲学の観点から、統一アーキテクチャは正しい方向性でしょうか?
|
|||
|
|
4. 他の言語(Ruby、Python、JavaScript)の類似事例はありますか?
|
|||
|
|
|
|||
|
|
【実装方針案】
|
|||
|
|
```rust
|
|||
|
|
// 演算子処理の修正例
|
|||
|
|
fn try_add_operation(left: &dyn NyashBox, right: &dyn NyashBox) -> Option<Box<dyn NyashBox>> {
|
|||
|
|
// InstanceBoxの場合、内包されたBoxを取り出す
|
|||
|
|
let left_inner = if let Some(instance) = left.as_any().downcast_ref::<InstanceBox>() {
|
|||
|
|
instance.inner_content.as_ref()?.as_ref()
|
|||
|
|
} else {
|
|||
|
|
left
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 以下、従来の処理...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Nyashの設計哲学と実装の現実性のバランスについて、専門的な視点からアドバイスをお願いします。
|