Files
hakorune/docs/development/roadmap/phases/phase-21
Selfhosting Dev 40d0cac0f1 feat(llvm): Complete function call system implementation by ChatGPT5
Major improvements to LLVM backend function call infrastructure:

## Key Changes

### Function Call System Complete
- All MIR functions now properly lowered to LLVM (not just entry)
- Function parameter binding to LLVM arguments implemented
- ny_main() wrapper added for proper entry point handling
- Callee resolution from ValueId to function symbols working

### Call Instruction Analysis
- MirInstruction::Call was implemented but system was incomplete
- Fixed "rhs missing" errors caused by undefined Call return values
- Function calls now properly return values through the system

### Code Modularization (Ongoing)
- BoxCall → instructions/boxcall.rs ✓
- ExternCall → instructions/externcall.rs ✓
- Call remains in mod.rs (to be refactored)

### Phase 21 Documentation
- Added comprehensive AI evaluation from Gemini and Codex
- Both AIs confirm academic paper potential for self-parsing AST DB approach
- "Code as Database" concept validated as novel contribution

Co-authored-by: ChatGPT5 <noreply@openai.com>

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-12 01:45:00 +09:00
..

Phase 21: データベース駆動開発DDD: Database-Driven Development

📋 概要

ソースコードをファイルではなくデータベースで管理する革命的開発パラダイム。 Box、メソッド、名前空間を構造化データとして扱い、リファクタリングを瞬時に完了させる。 「ファイルは1970年代の遺物。21世紀のコードは構造化データベースに住む」

🎯 背景と動機

現状の問題

  • ファイルベース:物理的な区切り(人間の都合)
  • Box/メソッド:論理的な単位(プログラムの本質)
  • 不一致の結果:リファクタリングが遅い、検索が非効率、依存関係が不透明

解決策

  • コードをSQLiteデータベースで管理
  • Box、メソッド、依存関係を正規化されたテーブルで表現
  • SQLクエリでリファクタリング・検索・分析を高速化

🏗️ データベーススキーマ

基本テーブル構造

-- Boxの定義
CREATE TABLE boxes (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    namespace TEXT,
    parent_box_id INTEGER,
    box_type TEXT CHECK(box_type IN ('normal', 'static', 'abstract')),
    source_code TEXT,
    metadata JSON,  -- 型情報、アノテーション、ドキュメント
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (parent_box_id) REFERENCES boxes(id)
);

-- メソッド定義
CREATE TABLE methods (
    id INTEGER PRIMARY KEY,
    box_id INTEGER NOT NULL,
    name TEXT NOT NULL,
    visibility TEXT CHECK(visibility IN ('public', 'private', 'protected')),
    params JSON,  -- パラメータ情報
    return_type JSON,
    body TEXT,
    mir_cache BLOB,  -- コンパイル済みMIRをキャッシュ
    optimization_hints JSON,
    FOREIGN KEY (box_id) REFERENCES boxes(id),
    UNIQUE(box_id, name)  -- 同一Box内でメソッド名は一意
);

-- フィールド定義
CREATE TABLE fields (
    id INTEGER PRIMARY KEY,
    box_id INTEGER NOT NULL,
    name TEXT NOT NULL,
    field_type JSON,
    default_value TEXT,
    metadata JSON,
    FOREIGN KEY (box_id) REFERENCES boxes(id)
);

-- 依存関係
CREATE TABLE dependencies (
    from_type TEXT CHECK(from_type IN ('box', 'method')),
    from_id INTEGER,
    to_type TEXT CHECK(to_type IN ('box', 'method')),
    to_id INTEGER,
    dep_type TEXT CHECK(dep_type IN ('uses', 'extends', 'calls', 'implements')),
    metadata JSON,  -- 呼び出し位置、使用頻度など
    PRIMARY KEY (from_type, from_id, to_type, to_id, dep_type)
);

-- 名前空間
CREATE TABLE namespaces (
    id INTEGER PRIMARY KEY,
    path TEXT UNIQUE NOT NULL,
    parent_id INTEGER,
    metadata JSON,
    FOREIGN KEY (parent_id) REFERENCES namespaces(id)
);

-- コンパイルキャッシュ
CREATE TABLE compile_cache (
    id INTEGER PRIMARY KEY,
    entity_type TEXT,
    entity_id INTEGER,
    mir_version INTEGER,
    mir_data BLOB,
    metadata JSON,  -- 最適化レベル、ターゲットなど
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 全文検索用インデックス
CREATE VIRTUAL TABLE code_search USING fts5(
    entity_type,
    entity_id,
    name,
    content,
    tokenize = 'porter'
);

🚀 革命的な機能

1. 瞬間リファクタリング

-- 名前変更:トランザクション一発
BEGIN TRANSACTION;
UPDATE boxes SET name = 'NewBoxName' WHERE name = 'OldBoxName';
UPDATE code_search SET name = 'NewBoxName' 
    WHERE entity_type = 'box' AND name = 'OldBoxName';
-- 依存コードも自動更新(トリガーで実装)
COMMIT;

-- メソッド移動Box間でメソッドを移動
UPDATE methods SET box_id = (SELECT id FROM boxes WHERE name = 'TargetBox')
    WHERE id = ? AND box_id = ?;

2. 高度な検索・分析

-- 未使用コード検出
SELECT b.namespace || '.' || b.name AS unused_box
FROM boxes b
LEFT JOIN dependencies d ON 
    (d.to_type = 'box' AND d.to_id = b.id)
WHERE d.from_id IS NULL;

-- 循環依存検出再帰CTE
WITH RECURSIVE dep_path AS (
    SELECT from_id, to_id, 
           from_id || '->' || to_id as path
    FROM dependencies
    WHERE from_type = 'box' AND to_type = 'box'
    UNION ALL
    SELECT d.from_id, dp.to_id, 
           dp.path || '->' || d.to_id
    FROM dependencies d
    JOIN dep_path dp ON d.to_id = dp.from_id
    WHERE d.from_type = 'box' AND d.to_type = 'box'
      AND dp.path NOT LIKE '%' || d.to_id || '%'
)
SELECT path FROM dep_path WHERE from_id = to_id;

-- 類似コード検出(全文検索)
SELECT b1.name AS box1, m1.name AS method1,
       b2.name AS box2, m2.name AS method2,
       similarity_score(m1.body, m2.body) AS similarity
FROM methods m1
JOIN methods m2 ON m1.id < m2.id
JOIN boxes b1 ON m1.box_id = b1.id
JOIN boxes b2 ON m2.box_id = b2.id
WHERE similarity_score(m1.body, m2.body) > 0.8;

3. インテリジェントなキャッシング

-- 変更影響分析
CREATE TRIGGER invalidate_cache_on_method_update
AFTER UPDATE ON methods
BEGIN
    -- 直接依存するエンティティのキャッシュを無効化
    DELETE FROM compile_cache
    WHERE entity_id IN (
        SELECT from_id FROM dependencies
        WHERE to_type = 'method' AND to_id = NEW.id
    );
END;

4. バージョン管理の統合

-- 変更履歴
CREATE TABLE history (
    id INTEGER PRIMARY KEY,
    entity_type TEXT,
    entity_id INTEGER,
    version INTEGER,
    change_type TEXT,
    old_value TEXT,
    new_value TEXT,
    changed_by TEXT,
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    commit_message TEXT
);

-- Git風のブランチ管理
CREATE TABLE branches (
    id INTEGER PRIMARY KEY,
    name TEXT UNIQUE NOT NULL,
    base_version INTEGER,
    is_active BOOLEAN DEFAULT TRUE
);

🎨 実装例

box CodeDB {
    db: SQLiteBox
    cache: MapBox
    
    birth(dbPath) {
        me.db = new SQLiteBox(dbPath)
        me.cache = new MapBox()
        me.initSchema()
    }
    
    // Boxを保存
    saveBox(box) {
        local tx = me.db.beginTransaction()
        try {
            local boxId = me.db.insert("boxes", {
                name: box.name,
                namespace: box.namespace,
                source_code: box.toString(),
                metadata: box.getMetadata()
            })
            
            // メソッドも保存
            for method in box.methods {
                me.saveMethod(boxId, method)
            }
            
            tx.commit()
        } catch (e) {
            tx.rollback()
            throw e
        }
    }
    
    // リファクタリング:名前変更
    renameBox(oldName, newName) {
        me.db.execute(
            "UPDATE boxes SET name = ? WHERE name = ?",
            [newName, oldName]
        )
        
        // 全文検索インデックスも更新
        me.updateSearchIndex()
        
        // キャッシュ無効化
        me.invalidateCache(oldName)
    }
    
    // 未使用コード検出
    findUnusedCode() {
        return me.db.query("
            SELECT b.namespace || '.' || b.name AS unused
            FROM boxes b
            LEFT JOIN dependencies d ON d.to_id = b.id
            WHERE d.from_id IS NULL
        ")
    }
    
    // AI連携類似コード提案
    suggestRefactoring(methodId) {
        local similar = me.findSimilarMethods(methodId)
        if similar.length() > 3 {
            return {
                suggestion: "共通Boxに抽出",
                methods: similar
            }
        }
    }
}

🔧 開発ツール

1. CLI拡張

# DBクエリ実行
nyash db query "SELECT * FROM boxes WHERE name LIKE '%Handler'"

# リファクタリング
nyash db refactor rename-box OldName NewName

# 依存関係グラフ生成
nyash db deps --format=dot | dot -Tpng -o deps.png

# 未使用コード削除
nyash db clean --remove-unused --dry-run

2. VSCode拡張

  • DBエクスプローラーBox/メソッドをツリー表示
  • リアルタイム検索SQLクエリで即座に検索
  • 依存関係ビュー:グラフィカルに表示
  • リファクタリングパレット:右クリックで瞬間実行

3. Web UI

box CodeDBWebUI {
    server: WebServerBox
    db: CodeDB
    
    birth(dbPath, port) {
        me.db = new CodeDB(dbPath)
        me.server = new WebServerBox(port)
        me.setupRoutes()
    }
    
    setupRoutes() {
        // コードグラフ表示
        me.server.get("/graph") { req, res ->
            local deps = me.db.getAllDependencies()
            res.json(me.buildD3Graph(deps))
        }
        
        // リアルタイムSQL実行
        me.server.post("/query") { req, res ->
            local result = me.db.query(req.body.sql)
            res.json(result)
        }
    }
}

📊 移行戦略

Phase 1: ハイブリッドモード3ヶ月

  • 既存ファイル→DB同期ツール開発
  • DB→ファイルエクスポートGit互換性維持
  • 開発者が徐々に慣れる期間

Phase 2: DB優先モード3ヶ月

  • 新規開発はDB直接
  • ファイルは自動生成
  • リファクタリング効率を体感

Phase 3: 完全DB化3ヶ月

  • ファイルシステムは配布用のみ
  • 開発は100% DB駆動
  • 新しい開発パラダイムの確立

🌟 期待される効果

開発効率

  • リファクタリング: 100倍高速化秒単位→ミリ秒単位
  • 検索: SQLによる高度な検索正規表現、構造検索
  • 分析: 依存関係、複雑度、類似性を瞬時に把握

コード品質

  • 重複排除: 類似コードを自動検出
  • 整合性: DB制約で不整合を防止
  • 追跡可能性: すべての変更を記録

AI連携

  • 構造化データ: AIが理解しやすい
  • メタデータ: 型情報、使用頻度など豊富
  • 学習効率: コードパターンを効率的に学習

🚀 革新性

世界初の要素

  1. 完全DB駆動言語: ファイルシステムからの解放
  2. 構造認識エディタ: Box/メソッド単位の編集
  3. 瞬間リファクタリング: SQLトランザクションで完結
  4. 依存関係DB: コンパイル時情報も含む

技術的優位性

  • SQLite: 軽量、高速、信頼性
  • Everything is Box: DB表現と相性抜群
  • MIRキャッシュ: コンパイル高速化

📅 実施時期

  • 開始条件: Phase 15セルフホスティング完了後
  • 推定期間: 9ヶ月
  • 優先度: 高(開発効率の革命的向上)

🔗 関連フェーズ


「コードはファイルに書くもの」という固定観念を打ち破る。 21世紀の開発は、構造化データベースで行うべきだにゃ

📚 関連ドキュメント

Phase 21の進化過程

学術的評価