## 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>
7.7 KiB
7.7 KiB
Phase 21: 箱データベース(Box Database)- シンプルさの極致
📋 概要(Version 2)
「Everything is Box」の哲学を究極まで推し進めた、世界一シンプルなコード管理システム。 Nyashの箱構造をそのままデータベースに格納し、必要に応じて動的に解析・操作する。 複雑な可逆変換?不要!箱をそのまま保存すればいいだけにゃ!
🎯 核心的な発見
Nyashの究極のシンプルさ
// Nyashのコードはこれだけ!
box MyBox {
field: TypeBox // フィールド
method() { } // メソッド
}
// 終わり!
他の言語の複雑さ:
- Python: インデントが構文の一部
- JavaScript: セミコロン自動挿入の罠
- C++: テンプレートメタプログラミング地獄
- Java: アノテーション、ジェネリクス、内部クラス...
Nyashの明快さ:
- 構造は「箱」だけ
- 箱の中身は「フィールド」と「メソッド」だけ
- すべてが明示的、曖昧さゼロ
🏗️ 新しいアーキテクチャ:段階的アプローチ
Level 0: 超シンプル版(まるごと保存)
-- これだけで始められる!
CREATE TABLE boxes (
id INTEGER PRIMARY KEY,
path TEXT UNIQUE, -- "namespace.BoxName"
source TEXT, -- Boxのソースコードまるごと
created_at TIMESTAMP,
updated_at TIMESTAMP
);
-- 使用例
INSERT INTO boxes (path, source) VALUES (
'game.Player',
'box Player {
name: StringBox
health: IntegerBox
attack(target) {
target.health = target.health - 10
}
}'
);
Level 1: 軽量構造化(検索・分析用)
-- Boxテーブル(変わらず)
CREATE TABLE boxes (
id INTEGER PRIMARY KEY,
path TEXT UNIQUE,
source TEXT
);
-- 動的に生成されるビュー(必要な時だけ)
CREATE VIEW box_structure AS
SELECT
id,
path,
-- SQLiteのJSON関数で動的解析
json_extract(analyze_box(source), '$.fields') as fields,
json_extract(analyze_box(source), '$.methods') as methods,
json_extract(analyze_box(source), '$.parent') as parent_box
FROM boxes;
-- 依存関係も動的に
CREATE VIEW dependencies AS
SELECT
b1.path as from_box,
b2.path as to_box,
'uses' as relation
FROM boxes b1, boxes b2
WHERE b1.source LIKE '%new ' || substr(b2.path, instr(b2.path, '.') + 1) || '(%' ;
Level 2: インテリジェント版(最適化済み)
-- メタデータをキャッシュ(でも元ソースが主)
CREATE TABLE box_metadata (
box_id INTEGER PRIMARY KEY,
field_count INTEGER,
method_count INTEGER,
dependencies JSON,
-- 解析結果をキャッシュ
last_analyzed TIMESTAMP,
FOREIGN KEY (box_id) REFERENCES boxes(id)
);
-- インデックス(高速検索用)
CREATE INDEX idx_box_deps ON box_metadata(dependencies);
CREATE VIRTUAL TABLE box_search USING fts5(
path, source,
tokenize='porter unicode61'
);
🚀 革命的にシンプルな操作
リファクタリング = テキスト置換
-- 名前変更:SQLの基本機能で十分!
UPDATE boxes
SET source = REPLACE(source, 'OldName', 'NewName'),
path = REPLACE(path, 'OldName', 'NewName')
WHERE source LIKE '%OldName%';
依存関係検索 = LIKE検索
-- MyBoxを使っているBoxを探す
SELECT path FROM boxes
WHERE source LIKE '%new MyBox%'
OR source LIKE '%: MyBox%'
OR source LIKE '%from MyBox%';
コンフリクト解決 = 不要!
// ファイルとDBの同期?簡単!
box SyncManager {
sync(filePath, dbPath) {
local fileContent = FileBox.read(filePath)
local dbContent = db.query("SELECT source FROM boxes WHERE path = ?", dbPath)
if fileContent != dbContent {
// 最新の方を採用(タイムスタンプで判断)
if FileBox.modifiedTime(filePath) > db.lastModified(dbPath) {
db.update(dbPath, fileContent)
} else {
FileBox.write(filePath, dbContent)
}
}
}
}
📊 段階的実装計画(超現実的)
Phase 0: プロトタイプ(1週間)
- SQLiteに箱をまるごと保存
- 簡単な検索・置換機能
- ファイル⇔DB同期の基本
Phase 1: 実用版(2週間)
- 動的解析関数の実装
- 依存関係の自動抽出
- VSCode拡張の基本版
Phase 2: 高速版(2週間)
- メタデータキャッシング
- インクリメンタル解析
- バッチ操作の最適化
Phase 3: 統合版(1ヶ月)
- 既存ツールとの連携
- CI/CD統合
- チーム機能
🎨 使用例:こんなに簡単!
開発者の日常
# プロジェクトをDBに取り込む
nyash db import ./src
# Boxを検索
nyash db find "Player"
# リファクタリング
nyash db rename Player Character
# 変更をファイルに反映
nyash db export ./src
IDE統合
// VSCode拡張機能
box NyashDBExtension {
onSave(file) {
// ファイル保存時に自動でDB更新
local content = file.read()
local boxName = me.extractBoxName(content)
db.upsert(boxName, content)
}
onRename(oldName, newName) {
// F2でリネーム → DB経由で全箇所更新
db.execute("UPDATE boxes SET source = REPLACE(source, ?, ?)",
[oldName, newName])
me.refreshAllFiles()
}
}
🌟 なぜこれが革命的か
従来のアプローチの問題
- 過度な複雑化: AST、CST、トークン、トリビア...
- 可逆変換の呪縛: 100%復元にこだわりすぎ
- 巨大な実装: 何万行ものパーサー・変換器
箱データベースの解答
- 本質的にシンプル: 箱は箱のまま保存
- 必要十分: リファクタリングに必要な機能だけ
- 段階的導入: まるごと保存から始められる
📈 期待される効果
即効性
- 今すぐ使える: 1週間でプロトタイプ
- 学習コストゼロ: SQLの基本知識だけ
- 既存資産活用: ファイルベースと共存
長期的価値
- 拡張性無限: 必要に応じて解析を追加
- AI連携容易: 構造化データで学習効率UP
- 言語進化対応: 箱構造が変わらない限り永続
🔮 未来の展望
インテリジェント機能
-- AIによるコード提案
CREATE TABLE suggestions (
box_id INTEGER,
suggestion_type TEXT, -- 'refactor', 'optimize', 'fix'
original_code TEXT,
suggested_code TEXT,
confidence REAL,
created_by TEXT -- 'ai_model_v1'
);
リアルタイムコラボレーション
box CollaborativeDB {
// 複数開発者の同時編集
onChange(boxPath, newSource, userId) {
db.beginTransaction()
// 楽観的ロック
local currentVersion = db.getVersion(boxPath)
if currentVersion != expectedVersion {
return me.mergeChanges(boxPath, newSource)
}
db.update(boxPath, newSource, userId)
me.broadcast(boxPath, newSource, userId)
db.commit()
}
}
🎯 結論
「箱は箱のまま扱えばいい」
Nyashの本質的なシンプルさを活かせば、データベース駆動開発は 「ただのCRUDアプリケーション」レベルで実現可能。
複雑な変換層は不要。箱をデータベースに入れて、必要な時に取り出す。 それだけで、革命的な開発体験が実現できるにゃ!
「シンプルさは究極の洗練である」 - レオナルド・ダ・ヴィンチ
「箱は箱である」 - にゃ