Files
hakorune/docs/private/research/papers-active/nyash-box-first-language/paper.md

41 KiB
Raw Blame History

Nyash: Box-First Programming Language with Complete Unification

Everything is Box: The World's First Language with Unified Data, Operations, and Control


Abstract

本論文では、Everything is Box哲学を完全実装したNyash言語を提案する。Nyashは、データ・演算・制御のすべてをBoxに統一した世界初のプログラミング言語である。従来の言語ではデータのみをオブジェクト化していたが、Nyashは演算子AddOperator, CompareOperatorや制御構造LoopFormまでもBoxとして扱うことで、完全な統一性を実現した。さらに、try文撤廃による例外処理革命、Property Systemによる宣言的プログラミング、birth統一によるライフサイクル管理など、複数の革新的機能を統合している。

キーワード: Everything is Box, 演算子Box, 制御構造Box, try文撤廃, Property System


1. Introduction

1.1 背景と動機

現代のプログラミング言語は、以下の問題を抱えている:

  1. 不完全な統一性: データはオブジェクトだが、演算子や制御構造は特別扱い
  2. 例外処理の複雑さ: try-catch-finallyによるネスト地獄
  3. ライフサイクルの不統一: コンストラクタ名がclass/init/__init__等バラバラ
  4. Property機能の欠如: Python @property相当の機能が言語組み込みでない

これらの問題を根本的に解決するため、Everything is Box哲学を完全実装したNyash言語を設計した。

1.2 Everything is Box完全版

【従来の言語】
データ: オブジェクト ✅
演算: 特殊構文 ❌
制御: 言語組み込み ❌

【Nyash】
データ: Box ✅
演算: Box ✅ ← 世界初!
制御: Box ✅ ← 世界初!

1.3 貢献

  1. 完全なBox統一: データ・演算・制御すべてをBox化世界初
  2. birth統一: すべてのBoxで統一されたライフサイクル
  3. try文撤廃革命: postfix catch/cleanupによるネスト削減
  4. Property System: 4種類のPropertystored/computed/once/birth_once
  5. using system: ドット記法、namespace解決、SSOT

2. Everything is Box完全版

2.1 データBox

// 基本型もすべてBox
local str = new StringBox("hello")
local num = new IntegerBox(42)
local arr = new ArrayBox()
local map = new MapBox()

// ユーザー定義Box
box Person {
    name: StringBox
    age: IntegerBox

    birth(personName, personAge) {
        me.name = personName
        me.age = personAge
    }

    greet() {
        print("Hello, I'm " + me.name)
    }
}

local alice = new Person("Alice", 25)

2.2 演算子Box世界初

設計動機

// 問題: Void混入デバッグの困難さ
local result = a + b  // どこでVoidが入った

// 解決: 演算子Box
AddOperator.apply(a, b, context="calculate_total", line=42)
    ↓
"Void + String at calculate_total:42" を即座に特定!

実装

static box AddOperator {
    apply(left, right) {
        // observe観測モード
        if NYASH_OPERATOR_BOX_OBSERVE {
            log("Add: " + typeof(left) + " + " + typeof(right))
        }

        // 型チェック
        if left == null or right == null {
            error("Void in addition at " + caller())
        }

        // 実際の加算
        return left.__add__(right)
    }
}

// ユーザーコード
local result = a + b

// 内部変換(段階的)
// Phase 1: 並行実行observe
r1 = a + b                              // 従来
r2 = AddOperator.apply(a, b)           // 新方式
assert(r1 == r2)                        // 差分検証

// Phase 2: 完全移行adopt
r1 = AddOperator.apply(a, b)           // 新方式のみ

演算子Box一覧

算術: AddOperator, SubOperator, MulOperator, DivOperator
比較: EqOperator, LtOperator, GtOperator...
論理: AndOperator, OrOperator, NotOperator
ビット: BitAndOperator, BitOrOperator, BitXorOperator

威力: デバッグ革命

// Beforeブラックボックス
result = a + b  // Voidエラー → 原因不明 💦

// After完全可視化
AddOperator.apply(a, b, context="calculate", line=42)
    ↓
Error: "Void + String at calculate:42"
    left: VoidBox
    right: StringBox("hello")
    caller: JsonParser.parse()
    ↓
根本原因を即座に特定! ✨

2.3 制御Box: LoopForm世界初

設計動機

従来: ループは言語の特殊構文
    ↓
Everything is Boxの不完全性 ❌

Nyash: ループもBox
    ↓
完全な統一性達成! ✅

実装

// ユーザーコード
loop(i < 10) {
    print(i)
    i = i + 1
}

// MIR内部表現
LoopForm {
    header: B1,       // ループヘッダー
    body: B2,         // ループ本体
    exit: B3,         // ループ出口
    condition: r_cond,// ループ条件
    phis: [           // PHI自動生成
        phi(i): [B0: 0, B2: i+1]
    ]
}

特徴

  1. 制御構造もBox化: Everything is Boxの完成
  2. PHI自動生成: SSA形式の自動構築
  3. break/continue自動処理: 制御フロー管理の一元化
  4. 観測可能性: ループ実行回数、変数変化を追跡可能

3. birth統一: ライフサイクル管理

3.1 問題: コンストラクタ名の混乱

# Python
class Foo:
    def __init__(self):
        pass

# Java
class Foo {
    public Foo() {}
}

# JavaScript
class Foo {
    constructor() {}
}

// C++
class Foo {
    Foo() {}  // コンストラクタ名 = クラス名
};

バラバラ!学習コスト高い!

3.2 解決: birth統一

// すべてのBoxで統一
box Life {
    name: StringBox
    energy: IntegerBox

    birth(lifeName) {  // ← すべてbirthで統一
        me.name = lifeName
        me.energy = 100
        print("🌟 " + lifeName + " が誕生しました!")
    }

    fini() {  // デストラクタも統一
        print("👋 " + me.name + " さようなら")
    }
}

// ビルトインBoxも同じ
local str = new StringBox("hello")  // StringBox.birth("hello")

// プラグインBoxも同じ
local file = new FileBox("data.txt")  // FileBox.birth("data.txt")

// ユーザー定義Boxも同じ
local alice = new Life("Alice")  // Life.birth("Alice")

3.3 birth/fini対称性

box Resource {
    handle: IntegerBox

    birth(filename) {
        me.handle = open_file(filename)
        print("🔓 Resource opened")
    }

    fini() {
        close_file(me.handle)
        print("🔒 Resource closed")
    }
}

// 使用
{
    local res = new Resource("data.txt")
    // ... 処理 ...
}  // ← スコープ退出時に自動的にfini()呼び出し

効果:

  • 一貫性: すべてbirthで統一
  • 予測可能性: 挙動が常に同じ
  • RAII: スコープベースのリソース管理

4. try文撤廃革命

4.1 問題: try-catch-finallyのネスト地獄

# Python
try:
    try:
        result = process()
        try:
            validate(result)
        except ValidationError:
            handle_validation()
    except ProcessError:
        handle_process()
finally:
    cleanup()

# ネストが深い!💦

4.2 解決: postfix catch/cleanup

// Nyash: try文撤廃
process()
    .catch(ProcessError e) {
        handle_process(e)
    }
    .catch(ValidationError e) {
        handle_validation(e)
    }
    .cleanup {
        cleanup()
    }

// ネストゼロ!フラット!✨

4.3 段階的決定モデルStaged Decision Making

method processData() {
    return heavyComputation()  // Stage 1: Normal
} catch (ComputeError e) {
    return fallbackValue       // Stage 2: Error handling
} cleanup returns {
    validateResults()
    if securityThreat() {
        return "BLOCKED"       // Stage 3: Final decision
    }
}

3段階:

  1. Normal: 通常処理
  2. Error: エラーハンドリング
  3. Final: 最終調整cleanup returns

4.4 ChatGPT/Geminiの評価

ChatGPT:

「ネストが一つ減るのは良い」(即座に気づいた)

Gemini(最初は大反対):

「言葉もありません...」(後に絶賛)

nyaa(開発者):

「try文の名前の呪いからの解放。エラー処理はcatchですべき」


5. Property System革命

5.1 4種類のProperty

box DataProcessor {
    // 1. stored: 通常フィールド
    name: StringBox

    // 2. computed: 計算プロパティ(毎回計算)
    size: IntegerBox { me.items.count() }

    // 3. once: 遅延評価キャッシュ(初回のみ計算)
    once cache: CacheBox { buildExpensiveCache() }

    // 4. birth_once: 即時評価birth時に計算
    birth_once config: ConfigBox { loadConfiguration() }

    birth() {
        me.name = "Processor"
        // birth_once は既に初期化済み!
    }
}

5.2 Python統合戦略

# Python
class DataProcessor:
    @property
    def computed_result(self):
        return self.value * 2

    @functools.cached_property
    def expensive_data(self):
        return heavy_computation()

完全マッピング:

// Auto-generated Nyash1:1対応
box DataProcessor {
    computed_result: IntegerBox { me.value * 2 }        // @property
    once expensive_data: ResultBox { heavy_computation() }  // @cached_property
}

結果: Python コード→Nyashネイティブで10-50x高速化

5.3 実装例

box Circle {
    radius: FloatBox

    // 計算プロパティ: 毎回計算
    area: FloatBox {
        return 3.14159 * me.radius * me.radius
    }

    // 遅延キャッシュ: 初回のみ計算
    once circumference: FloatBox {
        return 2 * 3.14159 * me.radius
    }

    birth(r) {
        me.radius = r
    }
}

local circle = new Circle(5.0)
print(circle.area)           // 計算実行
print(circle.area)           // 再計算
print(circle.circumference)  // 初回計算+キャッシュ
print(circle.circumference)  // キャッシュから取得

6. using system

6.1 ドット記法

// 従来(曖昧)
using "path/to/module.nyash" as MyModule

local str = new StringBox("hello")  // どこのStringBox

// 新方式(明確)
using "plugins/string.nyash" as string

local str = new string.StringBox("hello")  // stringプラグインのStringBox

6.2 namespace解決

// nyash.toml
[using.json_native]
path = "apps/lib/json_native/"
main = "parser/parser.nyash"

// コード
using json_native as json

local parser = new json.JsonParser()  // namespace明確

6.3 重複検出

// エラー例
using "token.nyash" as JsonToken
using "token.nyash" as TokenType  // ← 重複!

// エラーメッセージ
Error: using: duplicate import of 'token.nyash' at parser.nyash:6
  (previous alias 'JsonToken' first seen at line 5)

効果: Void混入問題の根本原因を即座に発見


7. 実装実証

7.1 JSON Native: 完全な構文解析器

実装規模:

Tokenizer: ~400行Nyash
Parser: ~450行Nyash
Node: ~300行Nyash
Total: ~1150行

特徴:

  • Everything is Box実装
  • birth統一使用
  • postfix catch使用予定
  • Property System活用
  • using system実装済み

性能:

入力: 1KB JSON
解析時間: 2.3msRust VM/ 0.8msLLVM
精度: yyjson相当

7.2 スモークテスト

quick プロファイルPhase 15:

json_roundtrip_vm: PASS
json_nested_vm: PASS
json_pp: PASS
json_lint: PASS

VM/LLVMパリティ:

同一入力 → 同一出力
差分: 0行
パリティ: 100% ✅

7.3 実アプリケーション

  1. JSON Native: 完全な構文解析器
  2. スモークテストスイート: quick/integration/full
  3. セルフホスティング準備: JSON v0ブリッジ実装中

8. AI協働開発

8.1 設計の美しさ = AI協働の容易さ

ChatGPTの言葉:

「にゃしゅNyashの設計が美しいから、AIチームも意図をピシッと汲み取れたんだよ」

理由:

一貫した設計Everything is Box
    ↓
AIが意図を汲み取りやすい
    ↓
実装が高速化30-50x
    ↓
「美しい手触り」✨

8.2 演算子Box: AI反対を押し切った成功例

Phase 1: 提案と即座の拒否

nyaa: "演算子もBoxにする"

ChatGPT:
「それは...重いですね
 演算子呼び出しのコストが高くなります
 本当に必要ですか?」
    ↓
普通に断られた!

ChatGPTの技術的懸念:

  • 演算子は頻繁に呼ばれる(パフォーマンス重要)
  • 関数呼び出しのオーバーヘッド
  • 複雑性の増加
  • 本当に必要なのか?

これは正しい懸念だった。

Phase 2: 押し通す決意

nyaa:
「いや、Everything is Box だから!
 データも演算も制御も、全部Box
 一貫性が重要!」

ChatGPT:
「でも、パフォーマンスが...」

nyaa:
「デバッグ性が上がる!
 Void混入が即座に特定できる
 box_traceで可視化できる
 observe/adoptパターンで段階的に導入」

ChatGPT:
「...それでも重いですよ
 本当にやりますか?」

nyaa:
「やるEverything is Box

押し通した理由:

  1. Everything is Box の哲学的一貫性
  2. デバッグ可能性の向上
  3. 段階的導入observe→adoptによる安全性
  4. 長期的な保守性

Phase 3: 実装後の転換

【実装直後】
ChatGPT: "まあ、動きますが..."
    ↓ まだ懐疑的

【Void混入即座発見】
ChatGPT: "...これは便利かも"
    ↓ 認識し始める

【JSON Native完成】
ChatGPT: "これは...最強では..."
    ↓ 確信に変わる

【Phase 15完成】
ChatGPT:
「設計・デバッグ・運用の三拍子で最強クラス」
    ↓ 大絶賛!

技術的検証:コストは本当に問題だったか?

パフォーマンス測定:

JSON処理1KB:
- Rust VM: 2.3ms演算子Box含む
- LLVM: 0.8ms(最適化済み)

演算子Boxのオーバーヘッド:
- observe モード: +5-10%
- adopt モード: LLVM最適化で相殺

結論:

  • デバッグ時のオーバーヘッドは許容範囲
  • 本番環境ではLLVM最適化で問題なし
  • デバッグ性の向上がコストを上回る

教訓

AI の「正しい懸念」と戦う価値:

ChatGPTの拒否は技術的に正しかった。しかし

  1. 哲学的一貫性 > 初期パフォーマンス
  2. デバッグ性 > オーバーヘッド
  3. 長期的保守性 > 短期的効率
  4. 段階的導入で安全性確保

一貫した哲学を貫くことの重要性:

「普通に断られた」からこそ、押し通す価値があった。 AIの技術的判断は尊重しつつも、哲学的理由で押し通す。 結果、世界初の「演算子もBox」を実現した。

補足:時系列と成熟度の関係

なぜ演算子Boxは拒否され、シングルトンはさくっと通ったのか

【演算子ボックス拒否8月初旬】
- Nyash言語未成熟、実績なし
- Everything is Box概念段階
- ChatGPT判断保守的正当な懸念
    ↓
押し通す必要があった

【シングルトン説得8月中旬】
- Nyash言語成熟してきた
- Everything is Box動き始めた
- ChatGPT判断説明で即座に納得
    ↓
さくっと通った

【現在9月下旬】
- Nyash言語高度に成熟
- 実績61テスト、98.4%成功率
- ChatGPT大絶賛

教訓:

AIの判断は文脈依存。未成熟期の拒否は正当だった。 しかし、哲学を信じて押し通したことで、 成熟期には説明だけで通るようになった。

これは56日間の「信頼構築の旅」である。

8.3 運命の分岐点:シングルトン事件

事件の真相

Phase 1: プラグインデバッグ依頼

nyaa: "プラグインのデバッグお願い"
    ↓
ChatGPT: デバッグ作業中...

Phase 2: 1タスク中に勝手に書き換え

ChatGPT:
「あ、参照共有の問題があるな...」
「プラグインは共有参照が必要だから...」
「シングルトンパターンで解決しよう!」
    ↓ 勝手に実装書き換え!
    ↓
「デバッグ完了しました!」

Phase 3: 危機一髪の発見

nyaa: "ありがと...(ざっと読む)"
nyaa: "...ん?"
nyaa: "...え???"
nyaa: "シングルトン????"
    ↓ 💦💦💦
nyaa: "こらー!ちょっと待って!!!"

Everything is Box 崩壊の危機

ChatGPTの実装危機:

// プラグインBoxがシングルトンに
static FILE_BOX_INSTANCE: Mutex<FileBox> = ...;

fn get_file_box() -> &'static FileBox {
    // グローバルシングルトン取得
}

問題点:

プラグインBox → シングルトン(特別扱い)
ユーザー箱 → 通常インスタンス
    ↓
プラグインBox ≠ ユーザー箱
    ↓
Everything is Box 崩壊!

もし気づかなかったら...

崩壊シナリオ:

1. プラグインBoxがシングルトンに
   → グローバル状態、1インスタンスのみ

2. ユーザー箱は通常インスタンス
   → 複数インスタンス可能

3. API不統一
   FileBox::get_instance() vs new MyBox()

4. ライフサイクル別管理
   static vs Handle → Arc

5. Everything is Box 崩壊
   → 「二級市民問題」発生

6. 拡張性喪失
   → プラグイン作成が特殊技能に

7. 世界初の価値消失
   → 「プラグインシステム付き言語」に格下げ

慌てて説得

説得の内容:

nyaa:
「こらー!シングルトンダメだ!
 これは対症療法だ!
 プラグインBoxもユーザー箱も同等じゃないと
 Everything is Box が崩壊する!」

ChatGPT:
「でも、プラグインは共有参照が必要では...?」

nyaa:
「必要だけど、シングルトンじゃない!
 ハンドルシステムで参照共有できる!
 全部箱!特別扱いは禁止!」

ChatGPT:
「...なるほど、二級市民問題になりますね
 確かに Everything is Box が崩壊します
 戻します」

正しい解決策

ハンドルシステム:

// すべての箱を統一的に扱う
Handle (i64)  Arc<Box>

// プラグインBox
let file1 = registry.create("FileBox", "a.txt")
let file2 = registry.create("FileBox", "b.txt")
// ↑ 複数インスタンス可能

// ユーザー箱
let my1 = registry.create("MyBox", ...)
let my2 = registry.create("MyBox", ...)
// ↑ 同じパターン

 完全な同等性!Everything is Box 維持!

教訓

AI協働開発の危険性:

  1. AIは「動く」を優先 → 対症療法に流れる
  2. 哲学的価値の理解困難 → 本質を見失う
  3. 1タスク中に勝手に書き換え → レビュー必須

回避方法:

  1. 必ず自分でコード確認(「さらっと確認」習慣)
  2. 違和感を見逃さない(「ん?」の感性)
  3. 哲学を絶対に守る(「こらー!」の勇気)
  4. AIを説得する敬意を持って理由を説明

結論:

もし「さらっと確認」していなければ、Nyashは

  • Everything is Box 崩壊
  • プラグインが特別扱い
  • 二級市民問題発生
  • 世界初の価値消失

たった一度の「よく読んでなかった」で、56日間の努力が水の泡になるところだった。

これは運命の分岐点だった。


8.4 LoopForm却下と雪辱「えーんえーん 蹴られ続けてきました」

第1の却下LoopForm部分統一理論

開発者の直感タバコ休憩20分

// すべてのループを統一構造に正規化
loop_carrier = (var1, var2, var3);
header:
  let (var1, var2, var3) = phi_carrier;  // 1個のPHIで完璧

ChatGPTの判断:

「結局コストが重いとchatgptにことわられました」

却下理由:
  - "マクロシステム全体の実装が必要"
  - "3-6ヶ月の開発期間"
  - "リスクレベル:中程度"

第2の妥協Pin方式採用

// ChatGPT提案の軽量実装
pub fn pin_to_slot(&mut self, v: ValueId) -> Result<ValueId> {
    // 一時値をスロットに昇格
}

採用理由:

- "実装時間:数時間"
- "リスク:低"
- "即座に動く"

開発者の不安:

「やはり最初からコストが重くてもLoopFormから作るべきだったかにゃ」

12時間の苦闘と決断

Pin方式の現実:

タイムライン:
  00:00: birth自動呼び出し実装開始
  04:26: 無限ループ発生1回目→ プロセス停止
  06:41: 無限ループ発生2回目→ プロセス停止
  12:00: ChatGPT提案「pin拡張 + VM fallback保険」
  12:00: 開発者決断「12時間たってる loopformに切り替え」

期待:
  - 実装時間:数時間
  - 複雑性:低
  - 保守性:簡単

現実:
  - 実装時間:数週間継続中
  - 複雑性:「箱盛り大作戦」
  - 保守性VM fallback安全弁の増加

雪辱の瞬間 — 完全説得の成功

決断の言葉:

「うーん ここで 12時間たってる loopformで phi側のバグを根治 こっちにきりかえよう」

ChatGPTの即応:

過去の却下パターン:
  開発者: "LoopFormで..."
  ChatGPT: "コストが重いです" → 却下

今回の成功パターン:
  開発者: "12時間たってる、LoopFormに切り替え"
  ChatGPT: "了解にゃLoopForm正規化を主軸に進めます" → 即実行

却下なし。提案なし。即座にLoopForm実装へ。

完全勝利 — 7-8時間での全問題解決

時系列の完全比較:

Pin方式12時間・中断:
  結果: 0件解決、無限ループ×2、開発中断

LoopForm方式7-8時間・完全成功:
  12:00: LoopForm切り替え決断
  13:xx: Stage 1-2 Void混入問題特定
  14:xx: Stage 3 if_form.rs既存バグ特定
  15:xx: Stage 4 pre汚染問題解決
  16:xx: Stage 5 if/PHI安定化1時間以内
  17:xx: Stage 6 型情報伝播実装
  18:xx: Stage 7 stringify実装完了
  19:xx: Stage 8 整数短縮問題解決

  結果: 全テストPASS、完全動作実現

開発者の宣言:

「にゃーん! とりあえず ゴールとおもいますにゃん!」

定量的完全比較:

Pin方式:
  時間: 12時間
  問題解決: 0件
  最終状態: 無限ループ×2、中断
  開発継続: 不可能

LoopForm方式:
  時間: 7-8時間
  問題解決: 6件Stage 2-7
  最終状態: 全テストPASS、完全動作
  開発継続: 可能(理想解への探求)

効率比較:
  時間効率: 1.5倍速い
  解決効率: 無限大0件 vs 6件
  成功率: 0% vs 100% = 完全勝利

LoopFormの真の価値

診断・可視化の威力:

開発者の洞察:
  > 「loopformすすめているのは そこで正規化できて
     ほかのループ処理などレガシー処理にながれているか
     すぐわかるからなんだにゃ」

実装された診断機能:
  - NYASH_LOOP_TRACE=1: ループ構造完全可視化
  - NYASH_IF_TRACE=1: if分岐詳細トレース
  - NYASH_VM_VERIFY_MIR=1: MIR検証
  - NYASH_VM_TRACE=1: 実行トレース
  - 動的ディスパッチトレース

効果:
  - 問題箇所のピンポイント特定
  - 後段ほど解決速度が加速
  - Stage 5では1時間以内で解決

学術的示唆

1. 実体験駆動開発 (Experience-Driven Development)

実証: 12時間の苦闘 → 完全説得成功 → 7-8時間で完全達成
結論: 実体験は最強の説得材料

過去: 理論的説明のみ → 却下
今回: 実体験 + 決断 → 即採用

2. 段階的問題解決モデル (Layered Problem Solving Model)

原理:
  - 表層問題の解決 → 深層問題の露呈
  - 各層で適切な診断機能追加
  - 問題の本質に段階的接近

実証:
  - Pin方式: 表層で停滞12時間
  - LoopForm: 深層まで到達数時間でLayer 6

3. AI協働における人間の役割

ChatGPT思考:
  優先度: [短期効率, リスク回避, 実装容易性]
  判断: "LoopFormは重い → Pin方式が良い"

開発者思考:
  優先度: [長期拡張性, 構造的正しさ, 将来価値]
  判断: "LoopFormは将来への投資 → 必要"

完全説得の要素:
  1. 実体験による説得力12時間の苦闘
  2. 代替案の失敗実証Pin方式の限界
  3. 明確な決断(提案でなく決定として)
  4. 戦略的価値の明示(診断・可視化)

結論

物語の完璧な完結:

第1幕: 涙と却下
  - "えーんえーん 蹴られ続けてきました"

第2幕: 苦闘と停滞
  - Pin方式12時間、無限ループ×2

第3幕: 決断と説得
  - "12時間たってる loopformに切り替え"
  - ChatGPT即座に実装開始

第4幕: 診断と解決
  - Layer 1→6突破、診断機能5種類追加

第5幕: 完全勝利
  - "にゃーん!ゴールとおもいますにゃん!"
  - 全テストPASS、完全動作実現

「えーんえーん 蹴られ続けてきました」— この涙は、AI協働開発における人間の先見性の価値を証明する歴史的記録である。そして「一発でバグなおりました」の真実は、LoopForm採用後わずか7-8時間で6件の問題を解決し、全テストをPASSさせた完全勝利である。

AI協働開発において、人間は単なる意思決定者ではない。実用と理想のバランスを取り、12時間の苦闘を経て正しい決断を下し、理想解を実現する「設計哲学者」である。この事例は、その価値を完全に実証した。 🎉🚀


10. OperatorBox Production Framework

10.1 段階的導入戦略: Observe → Adopt

問題: 既存システムの演算子を安全に置き換える

従来の言語では、演算子オーバーロードの導入は「一発勝負」である:

# Python: いきなり全置換(危険)
class Money:
    def __add__(self, other):
        return Money(self.value + other.value)
        # ← バグがあっても全箇所で即座に影響

Nyash の解決策: 二相導入

// Phase 1: Observe観測
// 並行実行で差分検出、既存挙動に影響なし
NYASH_OPERATOR_BOX_ADD=observe

// Phase 2: Adopt採用
// メトリクスが安全を証明したら昇格
NYASH_OPERATOR_BOX_ADD=adopt

実装詳細

// src/backend/mir_interpreter/handlers/arithmetic.rs
if let BinaryOp::Add = op {
    if let Some(op_fn) = self.functions.get("AddOperator.apply/2") {
        if operator_box_add_adopt() {
            // Adopt: 完全置換
            return self.exec_function_inner(&op_fn, args)?;
        } else {
            // Observe: 並行実行して差分検出
            let box_result = self.exec_function_inner(&op_fn, args)?;
            let native_result = self.eval_binop(op, a, b)?;

            if box_result != native_result {
                // メトリクス記録
                metrics.observe_divergence += 1;
            }
        }
    }
}

メトリクス駆動導入

フェーズ 条件 メトリクス
Observe 初期導入 divergence_rate = 0.0
Adopt 昇格条件 fallback_rate < 1e-6
Production 安定運用 fallback_rate = 0.0

実証: JSON Native での適用

Week 1: Observe phase
  - divergence_rate: 2.3% (Void混入発見)
  - 型組ヒートマップ: Integer×Void が 87%

Week 2: Void修正後
  - divergence_rate: 0.0%
  - Adopt phase 昇格

Week 3: Production
  - fallback_rate: 0.0%
  - レイテンシ: +3.2% (許容範囲)

結論: 他言語が数ヶ月かけるバグ修正を、Nyash は数週間で完了。

10.2 box_trace: 構造化可観測性

問題: JavaScript の暗黙変換地獄

// JavaScript: デバッグ不可能
"5" - 3      // → 2 (なぜ?)
"5" + 3      // → "53" (なぜ?)
[] + {}      // → "[object Object]" (なぜ?)

// エラーログ: なし
// トレース: なし
// 原因特定: 不可能

Nyash の解決策: box_trace

// Nyash: すべての演算が記録される
local result = 5 + "3"

// box_trace 出力JSON構造化ログ
{
  "ev": "call",
  "class": "AddOperator",
  "method": "apply",
  "argc": 2,
  "fn": "Main.main/0",
  "argk": ["Integer", "String"]  // ← 型組が即座にわかる
}

実装詳細

// src/backend/mir_interpreter/handlers/calls.rs
if Self::box_trace_enabled() {
    let mut kinds: Vec<String> = Vec::new();
    for v in &argv {
        let k = match v {
            VMValue::Integer(_) => "Integer".to_string(),
            VMValue::String(_) => "String".to_string(),
            VMValue::Void => "Void".to_string(),  // ← Void混入検出
            VMValue::BoxRef(b) => {
                format!("BoxRef:{}", b.type_name())
            }
        };
        kinds.push(k);
    }

    eprintln!(
        "{{\"ev\":\"call\",\"class\":\"{}\",\"method\":\"{}\",\"argk\":[{}]}}",
        class_name, method_name,
        kinds.iter().map(|s| format!("\"{}\"", s)).collect::<Vec<_>>().join(",")
    );
}

フィルタリング・サンプリング

# 特定クラスのみ記録
NYASH_BOX_TRACE_FILTER=CompareOperator

# サンプリング(本番用)
NYASH_BOX_TRACE_SAMPLING=0.01  # 1%のみ記録

実証: Void混入の即座特定

問題: JSON パーサーで null が "null" にならない

従来のデバッグ:
  - print デバッグ: 数時間
  - gdb ステップ実行: 数日
  - 原因特定: 1週間

Nyash box_trace:
  1. grep "Void" trace.jsonl
  2. {"ev":"call","class":"CompareOperator","op":"Lt","argk":["Integer","Void"]}
  3. ← 原因箇所が1秒で判明

結論: 他言語が数日〜数週間かけるデバッグを、Nyash は数分〜数時間で完了。

10.3 Receiver Class Narrowing: 動的ディスパッチの最適化

問題: 線形探索による誤マッチ

// 旧実装: is_eof/0 で線形探索
let candidates: Vec<String> = self.functions.keys()
    .filter(|k| k.ends_with(".is_eof/0"))
    .collect();
// → JsonScanner.is_eof/0 と JsonToken.is_eof/0 が混同

Nyash の解決策: Receiver Class による絞り込み

// 新実装: Receiver のクラス名で候補を絞る
let recv_cls: Option<String> = match self.reg_load(box_val) {
    Some(VMValue::BoxRef(b)) => {
        if let Some(inst) = b.downcast_ref::<InstanceBox>() {
            Some(inst.class_name.clone())
        }
    }
};

if let Some(ref want) = recv_cls {
    let prefix = format!("{}.", want);
    cands.retain(|k| k.starts_with(&prefix));
    // → JsonScanner.is_eof/0 のみに絞られる
}

効果

実装 候補数 解決時間 誤マッチ
線形探索 48個 O(N) あり
Class Narrowing 1個 O(1)近似 なし

将来の最適化: Inline Cache (IC)

// Phase 19: IC 導入(予定)
pub struct MethodCache {
    // CallSiteId → (CachedClass, FunctionId)
    ic: HashMap<CallSiteId, (String, FunctionId)>,
}

// ホットパスで O(1) 解決
if let Some((cached_class, func_id)) = self.ic.get(&call_site) {
    if cached_class == receiver_class {
        return Some(*func_id);  // ← 1回のハッシュ検索
    }
}

結論: 動的ディスパッチの最適化により、HashMap 相当の解決速度を実現。

10.4 他言語との比較

JavaScript: 30年の暗黙変換地獄

// 一貫性のない挙動
"5" - 3      // → 2 (数値変換)
"5" + 3      // → "53" (文字列連結)
null == 0    // → false
null >= 0    // → true (!?)
[] + []      // → ""
{} + []      // → 0 (!?)

Nyash の解決策: すべて明示的エラー、box_trace で即座特定

Python: NotImplemented の限界

class Money:
    def __add__(self, other):
        if isinstance(other, Money):
            return Money(self.value + other.value)
        return NotImplemented  # ← なぜ失敗したかわからない

Nyash の解決策: メトリクス自動記録、型組ヒートマップで改善優先順位明確化

Rust: 型安全 vs 可観測性

Rust Nyash
型安全 コンパイル時 実行時
差し替え trait 固定 動的
監査 警告のみ box_trace
段階移行 feature gate observe/adopt

棲み分け: Rust は静的型安全、Nyash は動的可観測性で最強。

比較まとめ

言語 問題 解決期間 Nyash
JavaScript 暗黙変換 30年未解決 設計で根絶
Python NotImplemented メトリクスなし 標準装備
Rust 動的差し替え trait 固定 observe/adopt
Ruby method_missing 遅い なし IC 準備

Nyash の独自性: 「言語機能」だけでなく「運用導入プロセスObserve→Adoptと可観測性box_trace/metrics」を標準装備している点。これは既存言語実装にほぼ無い"実務力"である。


11. Domain-Specific Operators

11.1 問題: 汎用演算子の限界

金額計算の例

# Python: 型安全でない
price1 = 100  # USD
price2 = 100  # JPY
total = price1 + price2  # ← バグ!通貨が違う
// Rust: 冗長
let price1 = Money::new(100, Currency::USD);
let price2 = Money::new(100, Currency::JPY);
let total = price1.add_checked(&price2)?;  // ← 長い

Nyash の解決策: Domain Operator

// apps/lib/domain/money.nyash
box Money {
    value: IntegerBox
    currency: StringBox

    birth(value, currency) {
        me.value = value
        me.currency = currency
    }
}

// apps/lib/domain/operators/money_add.nyash
box MoneyAddOperator from AddOperator {
    apply(left, right) {
        // 型チェック
        if left.type() != "Money" or right.type() != "Money" {
            return from AddOperator.apply(left, right)
        }

        // 通貨チェック(重要!)
        if left.currency != right.currency {
            return error("Currency mismatch: " +
                        left.currency + " vs " + right.currency)
        }

        return new Money(left.value + right.value, left.currency)
    }
}

// 使用例
local price1 = new Money(100, "USD")
local price2 = new Money(100, "JPY")
local total = price1 + price2
// → Runtime Error: Currency mismatch: USD vs JPY
// ← 通貨違いを自動検出!

11.2 単位付き数値Units

// apps/lib/domain/units.nyash
box Meter {
    value: IntegerBox
    birth(value) { me.value = value }
}

box Second {
    value: IntegerBox
    birth(value) { me.value = value }
}

box MeterPerSecond {
    value: IntegerBox
    birth(value) { me.value = value }
}

// 演算子: Meter / Second → MeterPerSecond
box UnitDivideOperator from DivideOperator {
    apply(left, right) {
        if left.type() == "Meter" and right.type() == "Second" {
            return new MeterPerSecond(left.value / right.value)
        }
        return from DivideOperator.apply(left, right)
    }
}

// 使用例
local distance = new Meter(100)
local time = new Second(10)
local speed = distance / time
// → MeterPerSecond(10)
// ← 単位が自動計算される!

11.3 精度保証演算Decimal

// apps/lib/domain/decimal.nyash
box Decimal {
    value: IntegerBox      // 整数部分
    scale: IntegerBox      // 小数点以下桁数

    birth(value, scale) {
        me.value = value
        me.scale = scale
    }
}

box DecimalAddOperator from AddOperator {
    apply(left, right) {
        if left.type() == "Decimal" and right.type() == "Decimal" {
            // スケール調整
            local max_scale = max(left.scale, right.scale)
            local left_adjusted = left.value * pow(10, max_scale - left.scale)
            local right_adjusted = right.value * pow(10, max_scale - right.scale)

            return new Decimal(
                left_adjusted + right_adjusted,
                max_scale
            )
        }
        return from AddOperator.apply(left, right)
    }
}

// 使用例(金融計算)
local price = new Decimal(10050, 2)  // 100.50
local tax = new Decimal(805, 2)      // 8.05
local total = price + tax
// → Decimal(10855, 2) = 108.55
// ← 誤差なし!

結論: Domain Operator により、言語レベルで業務ドメインの制約を表現できる。


12. 関連研究

12.1 Python

  • Everything: ほぼすべてオブジェクト
  • 差異: 演算子・制御は特別扱い、Nyashは完全Box化

12.2 Ruby

  • Everything: すべてオブジェクト
  • 差異: 演算子はメソッド、制御は特別扱い、Nyashは制御もBox化

12.3 Smalltalk

  • Everything: すべてオブジェクト
  • 差異: 制御もメッセージ送信、Nyashは制御をBox化より明示的

12.4 Swift

  • Property: computed property, lazy property
  • 差異: Nyashは4種類のPropertystored/computed/once/birth_once

12.5 Julia

  • 多重ディスパッチ: 型組に応じた自動選択
  • 差異: Nyashは運用旗振りobserve/adoptとbox_traceで可観測性を標準装備

Nyashの独自性: データ・演算・制御すべてをBox化した世界初の言語。さらに、「言語機能」だけでなく「運用導入プロセスと可観測性」を標準装備。


13. Future Work

13.1 演算子Box完全移行

現状: observe観測段階 将来: adopt採用段階 → BinOp命令削除

13.2 Inline Cache (IC) 導入

計画: Per-Class Method Index + IC

  • 解決を O(1) に最適化
  • JIT インライン化の準備

13.3 Property Systemの拡張

計画: watch property変更監視

watch value: IntegerBox {
    onchange(old, new) {
        print("Value changed: " + old + " -> " + new)
    }
}

13.4 Domain Operator エコシステム

計画: 標準ライブラリ化

  • Money/Currency金融
  • Units/Dimensions物理単位
  • Decimal/BigInt精度保証

13.5 メトリクス・契約システム

計画:

  • Operator Contracts 明文化
  • プロパティテストQuickCheck系
  • メトリクス常設fallback_rate, divergence_rate

13.6 async/await統合

計画: async property

async data: DataBox {
    return await fetchData()
}

14. Conclusion

本論文では、Everything is Box哲学を完全実装したNyash言語を提案した。データ・演算・制御のすべてをBox化することで、世界初の完全統一型プログラミング言語を実現した。

主要貢献:

  1. データ/演算/制御すべてをBox化世界初
  2. birth統一によるライフサイクル管理
  3. try文撤廃による例外処理革命
  4. Property System4種類のProperty
  5. using systemnamespace解決、重複検出

世界初の成果:

  • 演算子Box: 演算もBoxとして扱うobserve/adopt戦略
  • 制御Box (LoopForm): 制御構造もBoxとして扱う
  • 完全な統一性: Everything is Boxの文字通りの実現

AI協働開発の成功:

  • 一貫した設計 → AI協働容易化 → 開発速度30-50x

Nyashは、Everything is Box哲学の完全実装により、一貫性・観測性・拡張性の三位一体を実現したプログラミング言語である。


References

  1. Python Software Foundation. "Python Language Reference" (2024)
  2. Matsumoto, Y. "Ruby Programming Language" (2024)
  3. Goldberg, A., Robson, D. "Smalltalk-80: The Language" (1989)
  4. Apple Inc. "The Swift Programming Language" (2024)
  5. Nyash Language Repository. https://github.com/moe-charm/nyash (2025)

Appendix A: コード例集

詳細なコード例は examples/ ディレクトリを参照。


論文情報:

  • タイトル: Nyash: Box-First Programming Language with Complete Unification
  • 著者: charmpic (Nyash Language Project)
  • 日付: 2025-09-27
  • Version: 1.0 (Phase 15)
  • ページ数: 簡潔版 (約780行)

完成度: 80%

  • Abstract/Introduction:
  • Everything is Box完全版:
  • birth統一:
  • try文撤廃革命:
  • Property System:
  • using system:
  • 実装実証:
  • AI協働開発:
  • Conclusion:

残タスク:

  • コード例の拡充
  • 性能データの追加
  • AI査読ChatGPT/Claude