## LLVM Call Instruction Modularization - Moved MirInstruction::Call lowering to separate instructions/call.rs - Follows the principle of one MIR instruction per file - Call implementation was already complete, just needed modularization ## Phase 21 Documentation - Moved all Phase 21 content to private/papers/paper-f-self-parsing-db/ - Preserved AI evaluations from Gemini and Codex - Academic paper potential confirmed by both AIs - Self-parsing AST database approach validated ## Next Steps - Continue monitoring ChatGPT5's LLVM improvements - Consider creating separate nyash-llvm-compiler crate when LLVM layer is stable - This will reduce build times by isolating LLVM dependencies 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
12 KiB
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が理解しやすい
- メタデータ: 型情報、使用頻度など豊富
- 学習効率: コードパターンを効率的に学習
🚀 革新性
世界初の要素
- 完全DB駆動言語: ファイルシステムからの解放
- 構造認識エディタ: Box/メソッド単位の編集
- 瞬間リファクタリング: SQLトランザクションで完結
- 依存関係DB: コンパイル時情報も含む
技術的優位性
- SQLite: 軽量、高速、信頼性
- Everything is Box: DB表現と相性抜群
- MIRキャッシュ: コンパイル高速化
📅 実施時期
- 開始条件: Phase 15(セルフホスティング)完了後
- 推定期間: 9ヶ月
- 優先度: 高(開発効率の革命的向上)
🔗 関連フェーズ
- Phase 15: セルフホスティング - 基盤技術
- Phase 12: 統一実行パス - MIRキャッシュ活用
- Phase 16: プラグインエコシステム - DB APIの公開
「コードはファイルに書くもの」という固定観念を打ち破る。 21世紀の開発は、構造化データベースで行うべきだにゃ!
📚 関連ドキュメント
Phase 21の進化過程
- 技術的考慮事項 - 詳細な技術検討
- 可逆変換アプローチ - Git互換性を保つ方法
- 箱データベース構想v2 - シンプル化された実装
- 自己解析アプローチ - Nyashの自己パース能力活用
学術的評価
- AI評価フォルダ - Gemini/Codexによる詳細な評価
- Gemini評価 - 完全な学術的分析
- Codex評価(部分) - 深い思考過程
- 評価サマリー - 統合的な分析