229 lines
8.3 KiB
Markdown
229 lines
8.3 KiB
Markdown
|
|
# Nyash ABIをC実装TypeBoxで提供する設計仕様書
|
|||
|
|
|
|||
|
|
## 🎯 概要
|
|||
|
|
|
|||
|
|
「Everything is Box」哲学の究極形:**ABIすらBoxとして扱う**
|
|||
|
|
|
|||
|
|
本設計は、Nyash ABIをTypeBox(C ABI)として実装することで、Rust依存を排除し、完全なセルフホスティングを実現する革新的アプローチです。
|
|||
|
|
|
|||
|
|
**3大AI専門家の評価:**
|
|||
|
|
- **Gemini**: 「技術的妥当性が高く、言語哲学とも合致した、極めて優れた設計」
|
|||
|
|
- **Codex**: 「Feasible and attractive: ABI-as-Box completes the idea」
|
|||
|
|
- **ChatGPT5**: 「実装に耐える設計。10の改善点で完璧」(統合ABI設計に反映済み)
|
|||
|
|
|
|||
|
|
## 📐 技術設計
|
|||
|
|
|
|||
|
|
### 基本アーキテクチャ
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// nyash_abi_provider.h - Codex推奨の16バイトアライメント版
|
|||
|
|
typedef struct __attribute__((aligned(16))) {
|
|||
|
|
// TypeBox標準ヘッダ(バージョニング対応)
|
|||
|
|
uint32_t abi_tag; // 'NABI' (0x4942414E)
|
|||
|
|
uint16_t api_version; // APIバージョン
|
|||
|
|
uint16_t struct_size; // 構造体サイズ(互換性チェック用)
|
|||
|
|
const char* name; // "NyashABIProvider"
|
|||
|
|
void* (*create)(void); // プロバイダインスタンス生成
|
|||
|
|
|
|||
|
|
// Nyash ABI専用拡張(コンテキストベース)
|
|||
|
|
struct {
|
|||
|
|
// セレクターキャッシング対応
|
|||
|
|
nyash_status (*lookup_selector)(nyash_ctx*, uint64_t type_id, const char* name, nyash_selector* out);
|
|||
|
|
nyash_status (*call)(nyash_ctx*, void* obj, nyash_selector sel, nyash_value* argv, int argc, nyash_value* out);
|
|||
|
|
|
|||
|
|
// 基本操作
|
|||
|
|
nyash_status (*create_value)(nyash_ctx*, uint64_t type_id, void* data, uint64_t flags, nyash_value* out);
|
|||
|
|
void (*retain)(void* obj);
|
|||
|
|
void (*release)(void* obj);
|
|||
|
|
|
|||
|
|
// 型情報
|
|||
|
|
uint64_t (*type_of)(nyash_value value);
|
|||
|
|
bool (*is_null)(nyash_value value);
|
|||
|
|
bool (*eq)(nyash_value a, nyash_value b);
|
|||
|
|
uint64_t (*hash)(nyash_value value);
|
|||
|
|
} nyash_ops;
|
|||
|
|
|
|||
|
|
// 機能ビット(将来拡張用)
|
|||
|
|
uint64_t capabilities; // NYASH_CAP_ASYNC | NYASH_CAP_WEAKREF等
|
|||
|
|
void* reserved[4]; // 将来拡張用
|
|||
|
|
} NyashABITypeBox;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### NyashValue - 16バイト最適化構造(Codex提案)
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// JIT/LLVM最適化を考慮した16バイトアライメント
|
|||
|
|
typedef struct __attribute__((aligned(16))) {
|
|||
|
|
uint64_t type_id; // 型識別子(上位16bit: vendor, 8bit: kind)
|
|||
|
|
uint64_t payload; // ポインタまたはインライン値
|
|||
|
|
uint64_t metadata; // フラグ・追加情報(下位3bit: タグ)
|
|||
|
|
} nyash_value;
|
|||
|
|
|
|||
|
|
// メタデータタグ(Gemini提案のTagged Pointers)
|
|||
|
|
#define NYASH_TAG_POINTER 0x0 // ヒープオブジェクトへのポインタ
|
|||
|
|
#define NYASH_TAG_SMALL_INT 0x1 // 61ビット整数(符号付き)
|
|||
|
|
#define NYASH_TAG_BOOL 0x2 // 真偽値
|
|||
|
|
#define NYASH_TAG_NULL 0x3 // null
|
|||
|
|
#define NYASH_TAG_SMALL_ENUM 0x4 // 小さな列挙型
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### メモリ管理 - Intrusive参照カウント(Gemini詳細提案)
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// すべてのヒープBoxの共通ヘッダ
|
|||
|
|
typedef struct {
|
|||
|
|
atomic_size_t ref_count; // アトミック参照カウント
|
|||
|
|
const nyash_obj_vtable* vtable; // メソッドテーブル
|
|||
|
|
uint64_t type_id; // 型識別子
|
|||
|
|
uint64_t flags; // THREAD_AFFINE等のフラグ
|
|||
|
|
|
|||
|
|
// 弱参照サポート(循環参照対策)
|
|||
|
|
struct weak_ref_list* weak_refs; // 弱参照リスト(オプション)
|
|||
|
|
} nyash_obj_header;
|
|||
|
|
|
|||
|
|
// Gemini推奨:弱参照による循環参照回避
|
|||
|
|
typedef struct {
|
|||
|
|
nyash_obj_header* target; // 対象オブジェクト(NULL可能)
|
|||
|
|
atomic_bool is_valid; // 有効性フラグ
|
|||
|
|
} nyash_weak_ref;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### コンテキストベースAPI(Codex推奨)
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// グローバル状態を避けるコンテキスト構造
|
|||
|
|
typedef struct {
|
|||
|
|
nyash_allocator* allocator; // カスタムアロケータ
|
|||
|
|
nyash_scheduler* scheduler; // スケジューラ(async用)
|
|||
|
|
void* tls; // スレッドローカルストレージ
|
|||
|
|
uint64_t feature_flags; // 機能フラグ
|
|||
|
|
nyash_error* last_error; // 最後のエラー
|
|||
|
|
} nyash_ctx;
|
|||
|
|
|
|||
|
|
// ステータスコード(例外を使わない)
|
|||
|
|
typedef enum {
|
|||
|
|
NYASH_OK = 0,
|
|||
|
|
NYASH_E_TYPE, // 型エラー
|
|||
|
|
NYASH_E_NULL, // NULL参照
|
|||
|
|
NYASH_E_BOUNDS, // 境界外アクセス
|
|||
|
|
NYASH_E_MEMORY, // メモリ不足
|
|||
|
|
NYASH_E_NOT_FOUND, // メソッド/プロパティ未定義
|
|||
|
|
} nyash_status;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚀 実装戦略(3段階)
|
|||
|
|
|
|||
|
|
### Phase 1: C Shim実装(1-2週間)
|
|||
|
|
既存Rust実装へのCラッパーとして開始:
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// plugins/nyash_abi_c/src/shim.c
|
|||
|
|
nyash_status nyash_call_shim(nyash_ctx* ctx, void* obj,
|
|||
|
|
nyash_selector sel, nyash_value* argv,
|
|||
|
|
int argc, nyash_value* out) {
|
|||
|
|
// Rust FFI経由で既存実装を呼び出し
|
|||
|
|
extern nyash_status rust_nyash_call(/* ... */);
|
|||
|
|
return rust_nyash_call(ctx, obj, sel, argv, argc, out);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Phase 2: フルC実装(1ヶ月)
|
|||
|
|
- 基本型(Integer/String/Bool/Array/Map)の完全実装
|
|||
|
|
- セレクターキャッシング機構
|
|||
|
|
- アトミック参照カウント + 弱参照
|
|||
|
|
- 型情報レジストリ
|
|||
|
|
|
|||
|
|
### Phase 3: Nyash再実装(2ヶ月)
|
|||
|
|
- C実装をNyashで書き直し
|
|||
|
|
- AOTコンパイルで同じC ABIを公開
|
|||
|
|
- セルフホスティング達成!
|
|||
|
|
|
|||
|
|
## 🔧 パフォーマンス最適化
|
|||
|
|
|
|||
|
|
### セレクターキャッシング(Codex提案)
|
|||
|
|
```c
|
|||
|
|
// 文字列ルックアップは初回のみ
|
|||
|
|
typedef struct {
|
|||
|
|
uint32_t vtable_slot; // 解決済みvtableスロット
|
|||
|
|
uint64_t cache_cookie; // インラインキャッシュ用
|
|||
|
|
} nyash_selector;
|
|||
|
|
|
|||
|
|
// JITは直接vtable_slotを使用可能
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Tagged Pointers(Gemini提案)
|
|||
|
|
- 64bitポインタの下位3bitをタグとして活用
|
|||
|
|
- 小さな整数(61bit)、真偽値、nullをヒープ確保なしで表現
|
|||
|
|
- `metadata & 0x7`でタグ判定、分岐なしアンボックス可能
|
|||
|
|
|
|||
|
|
## 📊 テスト戦略
|
|||
|
|
|
|||
|
|
### 適合性テストスイート
|
|||
|
|
```bash
|
|||
|
|
tests/abi/
|
|||
|
|
├── conformance/ # ABI適合性テスト
|
|||
|
|
├── memory/ # 参照カウント・弱参照テスト
|
|||
|
|
├── threading/ # マルチスレッド安全性
|
|||
|
|
├── performance/ # ベンチマーク(1.5x以内目標)
|
|||
|
|
└── compatibility/ # Rust/C実装の差分テスト
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### ファジング(Codex提案)
|
|||
|
|
- `nyash_value`エンコード/デコード
|
|||
|
|
- `type_id`正規化
|
|||
|
|
- 循環参照パターン
|
|||
|
|
|
|||
|
|
## 🌟 技術的革新性
|
|||
|
|
|
|||
|
|
### 1. ABI as a Box
|
|||
|
|
「Everything is Box」哲学の完成形。ABIそのものがBoxとして扱われることで:
|
|||
|
|
- 実行時のABI切り替えが可能
|
|||
|
|
- デバッグ用ABI、プロファイリング用ABIの動的ロード
|
|||
|
|
- 異なるメモリ管理モデル(GC等)の実験が容易
|
|||
|
|
|
|||
|
|
### 2. セルフホスティングへの明確な道筋
|
|||
|
|
1. **Rust製コンパイラ** → **C ABI上のNyashコンパイラ**をビルド
|
|||
|
|
2. **Nyashコンパイラ** → **自分自身を再コンパイル**
|
|||
|
|
3. Rust依存完全排除!
|
|||
|
|
|
|||
|
|
### 3. 長期的保守性
|
|||
|
|
- C ABIは最も安定した普遍的インターフェース
|
|||
|
|
- プラットフォーム非依存
|
|||
|
|
- 30年後も動作する設計
|
|||
|
|
|
|||
|
|
## 📝 配布と使用
|
|||
|
|
|
|||
|
|
### nyash.toml設定
|
|||
|
|
```toml
|
|||
|
|
[plugins.nyash_abi_provider]
|
|||
|
|
path = "plugins/nyash_abi_provider.so"
|
|||
|
|
abi = "c"
|
|||
|
|
types = ["NyashABIProvider"]
|
|||
|
|
capabilities = ["async", "weakref", "selector_cache"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Nyashコードでの使用
|
|||
|
|
```nyash
|
|||
|
|
// ABIプロバイダーの取得
|
|||
|
|
local abiType = getTypeBox("NyashABIProvider")
|
|||
|
|
local abi = abiType.create()
|
|||
|
|
|
|||
|
|
// セレクターキャッシングを活用した高速呼び出し
|
|||
|
|
local strType = abi.lookupType("StringBox")
|
|||
|
|
local lengthSel = abi.lookupSelector(strType, "length")
|
|||
|
|
|
|||
|
|
local str = abi.createValue(strType, "Hello World")
|
|||
|
|
local len = abi.call(str, lengthSel, [])
|
|||
|
|
print(len) // 11
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 まとめ
|
|||
|
|
|
|||
|
|
本設計により、Nyashは:
|
|||
|
|
- **Rust非依存**でセルフホスティング可能に
|
|||
|
|
- **「Everything is Box」哲学**を完全実現
|
|||
|
|
- **高性能**(Tagged Pointers、セレクターキャッシング)
|
|||
|
|
- **安全**(アトミック参照カウント、弱参照)
|
|||
|
|
- **拡張可能**(バージョニング、機能ビット)
|
|||
|
|
|
|||
|
|
これは単なる実装の変更ではなく、言語の哲学を技術で体現する、美しいアーキテクチャの完成です。
|