## 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>
283 lines
7.7 KiB
Markdown
283 lines
7.7 KiB
Markdown
# Phase 21: 箱データベース(Box Database)- シンプルさの極致
|
||
|
||
## 📋 概要(Version 2)
|
||
|
||
「Everything is Box」の哲学を究極まで推し進めた、世界一シンプルなコード管理システム。
|
||
Nyashの箱構造をそのままデータベースに格納し、必要に応じて動的に解析・操作する。
|
||
**複雑な可逆変換?不要!箱をそのまま保存すればいいだけにゃ!**
|
||
|
||
## 🎯 核心的な発見
|
||
|
||
### Nyashの究極のシンプルさ
|
||
```nyash
|
||
// Nyashのコードはこれだけ!
|
||
box MyBox {
|
||
field: TypeBox // フィールド
|
||
method() { } // メソッド
|
||
}
|
||
// 終わり!
|
||
```
|
||
|
||
**他の言語の複雑さ:**
|
||
- Python: インデントが構文の一部
|
||
- JavaScript: セミコロン自動挿入の罠
|
||
- C++: テンプレートメタプログラミング地獄
|
||
- Java: アノテーション、ジェネリクス、内部クラス...
|
||
|
||
**Nyashの明快さ:**
|
||
- 構造は「箱」だけ
|
||
- 箱の中身は「フィールド」と「メソッド」だけ
|
||
- すべてが明示的、曖昧さゼロ
|
||
|
||
## 🏗️ 新しいアーキテクチャ:段階的アプローチ
|
||
|
||
### Level 0: 超シンプル版(まるごと保存)
|
||
```sql
|
||
-- これだけで始められる!
|
||
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: 軽量構造化(検索・分析用)
|
||
```sql
|
||
-- 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: インテリジェント版(最適化済み)
|
||
```sql
|
||
-- メタデータをキャッシュ(でも元ソースが主)
|
||
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
|
||
-- 名前変更:SQLの基本機能で十分!
|
||
UPDATE boxes
|
||
SET source = REPLACE(source, 'OldName', 'NewName'),
|
||
path = REPLACE(path, 'OldName', 'NewName')
|
||
WHERE source LIKE '%OldName%';
|
||
```
|
||
|
||
### 依存関係検索 = LIKE検索
|
||
```sql
|
||
-- MyBoxを使っているBoxを探す
|
||
SELECT path FROM boxes
|
||
WHERE source LIKE '%new MyBox%'
|
||
OR source LIKE '%: MyBox%'
|
||
OR source LIKE '%from MyBox%';
|
||
```
|
||
|
||
### コンフリクト解決 = 不要!
|
||
```nyash
|
||
// ファイルと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統合
|
||
- チーム機能
|
||
|
||
## 🎨 使用例:こんなに簡単!
|
||
|
||
### 開発者の日常
|
||
```bash
|
||
# プロジェクトをDBに取り込む
|
||
nyash db import ./src
|
||
|
||
# Boxを検索
|
||
nyash db find "Player"
|
||
|
||
# リファクタリング
|
||
nyash db rename Player Character
|
||
|
||
# 変更をファイルに反映
|
||
nyash db export ./src
|
||
```
|
||
|
||
### IDE統合
|
||
```nyash
|
||
// 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
|
||
- **言語進化対応**: 箱構造が変わらない限り永続
|
||
|
||
## 🔮 未来の展望
|
||
|
||
### インテリジェント機能
|
||
```sql
|
||
-- 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'
|
||
);
|
||
```
|
||
|
||
### リアルタイムコラボレーション
|
||
```nyash
|
||
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アプリケーション」レベルで実現可能。
|
||
|
||
複雑な変換層は不要。箱をデータベースに入れて、必要な時に取り出す。
|
||
それだけで、革命的な開発体験が実現できるにゃ!
|
||
|
||
---
|
||
|
||
> 「シンプルさは究極の洗練である」 - レオナルド・ダ・ヴィンチ
|
||
>
|
||
> 「箱は箱である」 - にゃ |