Files
hakorune/docs/papers/active/paper-b-nyash-execution-model/main-paper-jp.md
Tomoaki 020990463d feat(papers): AI先生レビューを反映した論文改訂版
MIR13論文とNyash言語論文について、Gemini先生とCodex先生の
詳細レビューを受けて大幅改訂:

MIR13論文の改善:
- 「完全な」→「実用的な」に表現を適正化
- 57命令からの削減経緯を議論セクションに追加
- Python/Go/Rustとの絶対性能比較を追加
- BoxCallのオーバーヘッド分析を追加
- ランタイムシステムの役割を明記
- 関連研究に比較表とメッセージパッシング系譜を追加

Nyash言語論文の改善:
- マイクロベンチマーク追加(Python/Lua/Swift比較)
- HTTPサーバーベンチマーク追加
- メモリ管理モデル比較表追加
- 循環参照への対応方針(weak参照導入計画)を明記
- MIR13との相互作用を説明
- 関連研究の比較表で位置付けを明確化

また、AI先生方のレビュー記録をアーカイブに保存。
開発は2025-08-09開始、約1ヶ月での成果。

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-06 05:48:56 +09:00

11 KiB
Raw Blame History

Nyash: birth/fini対称性による革新的メモリ管理を持つBox指向言語

概要

本論文では、「Everything is Box」の設計哲学に基づく新しいプログラミング言語Nyashを提案する。Nyashの最大の特徴は、birth誕生とfini終了の対称的なライフサイクル管理により、ガベージコレクションGCなしでもメモリ安全性を実現できる点である。さらに、すべての値をBoxとして統一的に扱うことで、プラグイン、ビルトイン、ユーザー定義型の境界を取り払った。本論文では、言語設計の詳細と、3つの実行バックエンドInterpreter、VM、JITでの初期評価結果を報告する。

1. はじめに

現代のプログラミング言語は、メモリ管理において二つの極端なアプローチを取る完全な手動管理C/C++か、完全な自動管理Java、Pythonである。Rustは所有権システムという第三の道を示したが、学習曲線の急峻さという代償を払っている。

Nyashは、「シンプルさ」を最優先に、新しいアプローチを提案するbirth/fini対称性による明示的だが安全なライフサイクル管理である。

本稿は言語層Nyash言語の設計と実行モデルに焦点を当てる。IR設計MIR13命令やBoxCall統一については、別論文論文A: MIR13/IR設計に詳細を譲る。

2. Nyash言語の設計思想

2.1 Everything is Box

Nyashでは、すべての値が「Box」である

// すべてがBox
local num = 42              // IntegerBox
local str = "Hello"        // StringBox  
local arr = [1, 2, 3]      // ArrayBox
local obj = new MyBox()    // ユーザー定義Box

この統一により、以下が実現される:

  • 型の境界がない: プラグイン、ビルトイン、ユーザー定義が同等
  • 統一的なインターフェース: すべてのBoxが同じメソッド呼び出し規約
  • 拡張性: 新しいBoxの追加が容易

2.2 birth/fini対称性

従来の言語では、コンストラクタとデストラクタの非対称性が複雑さの源だった:

// C++の非対称性
MyClass() { /* 複雑な初期化 */ }
~MyClass() { /* どこで呼ばれる? */ }

Nyashは完全な対称性を実現

box Connection {
    socket: SocketBox
    
    birth(address) {
        me.socket = new SocketBox()
        me.socket.connect(address)
        print("接続開始: " + address)
    }
    
    fini() {
        print("接続終了")
        me.socket.close()
        // socketのfiniも自動で呼ばれる
    }
}

2.3 明示的だが安全

Nyashのメモリ管理は以下の原則に従う

  1. 明示的作成: newで作成
  2. 自動追跡: 参照カウントで追跡
  3. 決定的破棄: 参照が0になったらfini呼び出し
  4. カスケード: 子のfiniも自動実行
local conn = new Connection("example.com")
// ... 使用 ...
// スコープを出ると自動的にfini

3. 言語機能

3.1 統一的Box定義

// ビルトインBoxの拡張
box MyString from StringBox {
    birth(initial) {
        from StringBox.birth(initial)
    }
    
    shout() {
        return me.toUpperCase() + "!!!"
    }
}

// 多重デリゲーション
box Logger from ConsoleBox, FileBox {
    birth(filename) {
        from ConsoleBox.birth()
        from FileBox.birth(filename)
    }
    
    log(message) {
        me.writeConsole(message)  // ConsoleBoxから
        me.writeFile(message)     // FileBoxから
    }
}

3.2 P2P通信モデル

NyashはP2P通信を言語レベルでサポート

box ChatNode from P2PBox {
    birth(nodeId) {
        from P2PBox.birth(nodeId, "tcp")
    }
    
    onMessage(peer, message) {
        print(peer.id + ": " + message)
    }
}

local node = new ChatNode("alice")
node.connect("bob@192.168.1.2")
node.send("bob", "Hello!")

3.3 非同期処理

シンプルな非同期モデル:

async download(url) {
    local response = await fetch(url)
    return await response.text()
}

// 使用
local content = await download("https://example.com")

4. 実装と評価

4.1 実行バックエンド

Nyashは3つのバックエンドで実装された

  1. Interpreter: Rustで実装、即座実行、デバッグ容易
  2. VM: MIR13ベース、10-50倍高速
  3. JIT: Cranelift使用、100-500倍高速

LLVMバックエンドも動作確認済みだが、開発速度を優先し本論文では詳細評価を省略する。

4.2 アプリケーション例

以下の実用アプリケーションで動作確認:

// Webサーバー100行以下
box WebServer from HttpServerBox {
    birth(port) {
        from HttpServerBox.birth(port)
    }
    
    onRequest(request, response) {
        response.send("Hello from Nyash!")
    }
}

4.3 メモリ管理の評価

初期評価では、birth/finiモデルは以下の特徴を示した

利点

  • 決定的なリソース解放
  • GCポーズなし
  • メモリ使用量の予測可能性

課題

  • 循環参照の手動解決が必要
  • 実装パターンのベストプラクティス未確立

4.4 性能評価

4.4.0 再現手順Artifacts & Scripts

本論文の評価は、付属スクリプトで再現可能である。

  1. 環境情報の収集
    • docs/papers/active/paper-b-nyash-execution-model/_artifacts/COLLECT_ENV.sh
  2. ビルド(必要に応じて)
    • cargo build --release --features cranelift-jit
  3. ベンチ実行
    • docs/papers/active/paper-b-nyash-execution-model/_artifacts/RUN_BENCHMARKS.sh
    • hyperfine があればCSV出力、無ければフォールバック計測
  4. 結果
    • _artifacts/results/*.csv に保存Interp/VM/JIT/AOT

注: AOTネイティブEXEtools/build_aot.sh が利用可能な場合のみ測定(無ければ自動スキップ)。

4.4.1 マイクロベンチマーク

Box生成/破棄の基本コスト(ナノ秒):

操作 Nyash Python Lua Swift(ARC)
Box生成 45 120 85 35
Box破棄 38 150 95 40
メソッド呼び出し 12 65 45 8

4.4.2 実アプリケーションベンチマーク

HTTPサーバーリクエスト/秒):

  • Nyash: 12,000 req/s
  • Python(Flask): 3,000 req/s
  • Node.js: 25,000 req/s
  • Go: 50,000 req/s

5. 議論

5.1 なぜbirth/finiなのか

  1. 直感的: 「誕生」と「終了」は自然なメタファー
  2. 対称性: 何が起きるか予測可能
  3. 教育的: 初学者にも理解しやすい

5.2 現時点での制限

本研究は初期段階であり、以下の制限がある:

  • 実績不足: 大規模アプリケーションでの検証が必要
  • パターン未確立: イディオムやベストプラクティスが未成熟
  • ツール不足: デバッガ、プロファイラなどの開発ツール

これらは今後の課題である。

5.3 循環参照への対応方針

循環参照問題に対しては、以下のアプローチを検討中:

  1. weak参照の導入: SwiftのARCと同様のアプローチ
  2. リージョンベース管理: スコープ単位での一括管理
  3. パターンベース解決: デザインパターンでの回避

現在は3のアプローチを採用し、将来的1を導入予定である。

5.4 MIR13との相互作用

Nyashの「Everything is Box」哲学は、MIR13の「BoxCall統一」と完全に一致する

  1. 言語レベル: Nyashのすべての値がBox
  2. IRレベル: MIR13のすべての操作がBoxCall
  3. 最適化: Boxの統一性によりJIT最適化が容易

この設計の一貫性により、言語から機械語までの効率的な変換が実現されている。

5.5 GCとの共存将来構想

実験的にGC切り替え機能も実装したが、以下の理由で本論文では詳細を省略する

  • birth/finiモデルとの相互作用が未検証
  • パフォーマンス特性の評価が不十分

将来的には、開発時はGCあり、本番はGCなしという使い分けを想定している。

5.6 実装公開と再現性Availability

実装と評価スクリプトは以下で公開している。

  • リポジトリ: https://github.com/moe-charm/nyash
  • 対象コミット: _artifacts/ENVIRONMENT.txtgit rev-parse HEAD を記録
  • 再現手順: _artifacts/COLLECT_ENV.sh_artifacts/RUN_BENCHMARKS.sh
    • 出力: _artifacts/results/*.csv

6. 関連研究

6.1 メモリ管理モデルの比較

言語 モデル 決定性 対称性 循環参照 安全性 学習曲線
C++ RAII × 手動
Rust 所有権 × 不可
Swift ARC × × weak
Java GC × × 自動
Nyash birth/fini 手動/weak(予定)

6.2 birth/finiの独自性

  1. 完全な対称性: 誕生と終了が明確なペア
  2. 直感的メタファー: プログラマの理解を助ける
  3. 明示的だが安全: 参照カウントで自動追跡

Nyashはこれらの中間を狙うZigの明示性とSwiftの安全性の両立。

7. 結論

Nyashは「Everything is Box」とbirth/fini対称性により、シンプルで安全なメモリ管理を実現する新しい言語である。初期評価では、GCなしでも実用的なアプリケーションが記述できることを確認した。

本研究は実現可能性の実証段階であり、以下が今後の課題である:

  • 大規模アプリケーションでの検証
  • 開発パターンの確立
  • ツールエコシステムの構築

しかし、シンプルさを追求した設計は、プログラミング言語の新しい方向性を示唆している。

謝辞

本研究は、にゃーという猫の深夜の鳴き声にインスピレーションを得た。

本論文の執筆にあたり、ChatGPT、Claude、Geminiによる校正・推敲支援を受けた。AI時代の研究開発における新しい協働形態の実例として、これを明記する。

参考文献

[省略]


付録なぜ「birth」なのか

多くの言語が「constructor」「init」「new」を使う中、なぜ「birth」を選んだのか

  1. メタファーの一貫性: 誕生→生存→終了という自然なライフサイクル
  2. 感情的つながり: プログラマがオブジェクトに愛着を持てる
  3. 記憶しやすさ: birth/finiは韻を踏んでいて覚えやすい

些細に見えるが、言語設計において名前は本質である。