Files
hakorune/docs/phases/phase-12/archive/legacy-abi-docs/nyash-abi.md

202 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Nyash ABI プラグインシステム
## 📦 概要
Nyash ABIは、**C ABI + TypeBoxをベースに構築された高度なプラグインシステム**です。C ABIの限界を超えて、より豊富な機能と言語間相互運用を提供します。
## 🏗️ アーキテクチャ
```
基本層C ABIシンプル・高速・安定
拡張層TypeBoxプラグイン間連携
高度層Nyash ABI言語間相互運用・拡張性
```
Nyash ABIは、C ABIとTypeBoxの上に構築されているため、既存のC ABIプラグインとの互換性を保ちながら、より高度な機能を提供できます。
## 🎯 特徴
### C ABIからの進化点
1. **セレクターベースの高速ディスパッチ**
- 文字列比較ではなく、事前計算されたハッシュ値を使用
- メソッド呼び出しの高速化
2. **NyashValue型による統一的な値表現**
- 16バイトに最適化された値表現
- インライン値サポート小さな整数やboolは直接格納
3. **言語間相互運用**
- Python、Go、JavaScript等との連携が可能
- 共通のオブジェクトモデルを提供
4. **高度なメモリ管理**
- アトミック参照カウント
- 弱参照による循環参照回避
## 📝 実装例
### 基本的なNyash ABIプラグイン
```c
#include "nyash_abi.h"
// Nyash ABIオブジェクト構造体
typedef struct {
nyash_obj_header header; // 共通ヘッダー(参照カウント等)
int value; // カスタムデータ
} CounterBox;
// メソッドディスパッチャー(セレクターベース)
nyash_status counter_call(
nyash_ctx* ctx,
void* self,
nyash_selector selector,
nyash_value* args,
size_t arg_count,
nyash_value* result
) {
CounterBox* counter = (CounterBox*)self;
// セレクターに基づいて高速ディスパッチ
switch(selector) {
case NYASH_SEL_INCREMENT: // 事前計算されたハッシュ値
counter->value++;
*result = nyash_make_int(counter->value);
return NYASH_OK;
case NYASH_SEL_GET_VALUE:
*result = nyash_make_int(counter->value);
return NYASH_OK;
default:
return NYASH_ERROR_METHOD_NOT_FOUND;
}
}
```
### NyashValue - 統一的な値表現
```c
// 16バイトに最適化された値構造JIT/LLVM最適化を考慮
typedef struct __attribute__((aligned(16))) {
uint64_t type_id; // 型識別子
uint64_t payload; // ポインタまたはインライン値
uint64_t metadata; // フラグ・追加情報
} nyash_value;
// インライン値の例
nyash_value nyash_make_int(int64_t value) {
return (nyash_value){
.type_id = NYASH_TYPE_INTEGER,
.payload = (uint64_t)value,
.metadata = NYASH_TAG_SMALL_INT // インライン整数タグ
};
}
// Boxオブジェクトの例
nyash_value nyash_make_box(void* box_ptr) {
return (nyash_value){
.type_id = ((nyash_obj_header*)box_ptr)->type_id,
.payload = (uint64_t)box_ptr,
.metadata = NYASH_TAG_POINTER // ヒープポインタタグ
};
}
```
## 🌐 言語間相互運用
### Python連携
```python
# Python側のNyash ABIラッパー
import nyash
# Nyashプラグインをロード
counter = nyash.load_plugin("counter.so")
# セレクターベースの呼び出し
result = counter.call("increment") # 内部でセレクターに変換
print(f"Counter value: {result}")
```
### Go連携
```go
// Go側のNyash ABIバインディング
package main
import "github.com/nyash/go-bindings"
func main() {
counter := nyash.LoadPlugin("counter.so")
// 型安全な呼び出し
value, err := counter.Call("increment")
if err == nil {
fmt.Printf("Counter value: %d\n", value.(int64))
}
}
```
## 🚀 Nyash ABIがTypeBoxとして実装される仕組み
Nyash ABIの革新的な点は、**ABIそのものがTypeBoxとして実装される**ことです:
```c
// Nyash ABIプロバイダーもTypeBoxC ABIとして提供
typedef struct {
// TypeBox標準ヘッダ
uint32_t abi_tag; // 'NABI'
const char* name; // "NyashABIProvider"
void* (*create)(void); // ABIプロバイダ生成
// Nyash ABI専用操作
struct {
nyash_status (*call)(nyash_ctx*, void* obj, nyash_selector, ...);
void (*retain)(void* obj);
void (*release)(void* obj);
} nyash_ops;
} NyashABITypeBox;
```
これにより:
1. **段階的移行**: C ABIプラグインからNyash ABIへの移行が容易
2. **相互運用**: C ABIとNyash ABIプラグインが同じシステムで共存
3. **セルフホスティング**: 最終的にNyash自身でNyashを実装可能
## 💡 いつNyash ABIを使うべきか
### Nyash ABIが最適な場合
- ✅ **他言語との相互運用**が必要Python/Go/JS等
- ✅ **高度なメソッドディスパッチ**が必要(セレクター方式)
- ✅ **複雑な型システム**を扱う
- ✅ **将来の拡張性**を重視
### C ABIで十分な場合
- ✅ シンプルな機能のみ必要
- ✅ 最高速度を求める(直接関数呼び出し)
- ✅ 既存のC/C++ライブラリの単純なラップ
## 📊 3つのABIの比較
| 特徴 | C ABI | C ABI + TypeBox | Nyash ABI |
|------|-------|-----------------|-----------|
| シンプルさ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| プラグイン間連携 | ❌ | ✅ | ✅ |
| 言語間連携 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 拡張性 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
## 📚 まとめ
Nyash ABIは「**C ABI + TypeBoxの上に構築された高度なプラグインシステム**」です。
- C ABIの安定性とシンプルさを継承
- TypeBoxによるプラグイン間連携をサポート
- セレクター方式による高速メソッドディスパッチ
- 言語間相互運用による無限の可能性
**高度な機能や将来の拡張性が必要ならNyash ABI**を選びましょう!