Files
hakorune/docs/development/roadmap/phases/phase-12.7/implementation-plan.md

402 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ANCP Implementation Plan
## 🎯 実装戦略:段階的アプローチ
### 基本方針
1. **最小実装から開始**: 20語の固定辞書でMVP
2. **段階的拡張**: 機能を少しずつ追加
3. **早期統合**: スモークテストと早期に統合
4. **継続的検証**: 各段階で往復テスト実施
## 📅 Week 1: 基礎実装
### Day 1-2: プロジェクトセットアップ
```toml
# Cargo.toml に追加
[features]
ancp = []
[dependencies]
phf = "0.11" # 静的マップ用
tiktoken-rs = "0.5" # トークン計測用optional
```
### Day 3-4: 基本Transcoder実装
```rust
// src/ancp/mod.rs
pub mod transcoder;
pub mod mappings;
pub mod error;
// src/ancp/transcoder.rs
use phf::phf_map;
static NYASH_TO_ANCP: phf::Map<&'static str, &'static str> = phf_map! {
"box" => "$",
"new" => "n",
"me" => "m",
"local" => "l",
"return" => "r",
// ... 初期20語
};
pub struct BasicTranscoder;
impl BasicTranscoder {
pub fn encode(&self, input: &str) -> String {
let mut result = String::with_capacity(input.len());
let tokens = tokenize_simple(input);
for token in tokens {
match NYASH_TO_ANCP.get(token.text) {
Some(ancp) => result.push_str(ancp),
None => result.push_str(token.text),
}
result.push_str(&token.trailing_space);
}
result
}
}
```
### Day 5-7: 基本往復テスト
```rust
// tests/ancp_roundtrip.rs
#[test]
fn test_basic_roundtrip() {
let cases = vec![
"box Test { }",
"new StringBox()",
"me.field = 42",
"local x = 10",
"return result",
];
let transcoder = BasicTranscoder::new();
for case in cases {
let encoded = transcoder.encode(case);
let decoded = transcoder.decode(&encoded);
assert_eq!(case, decoded, "Failed for: {}", case);
}
}
```
## 📅 Week 2: スマート変換
### Day 8-9: コンテキスト認識パーサー
```rust
// src/ancp/context_parser.rs
pub struct ContextAwareTranscoder {
basic: BasicTranscoder,
}
impl ContextAwareTranscoder {
pub fn encode(&self, input: &str) -> String {
let mut result = String::new();
let mut in_string = false;
let mut in_comment = false;
// 文字列・コメント内は変換しない
for (i, ch) in input.chars().enumerate() {
match ch {
'"' if !in_comment => in_string = !in_string,
'/' if !in_string && peek_next(input, i) == Some('/') => {
in_comment = true;
},
'\n' => in_comment = false,
_ => {}
}
// コンテキストに応じて処理
if !in_string && !in_comment {
// トークン変換
} else {
// そのまま出力
}
}
result
}
}
```
### Day 10-11: Lexer統合
```rust
// src/parser/lexer.rs に追加
impl Lexer {
pub fn with_ancp_support(input: &str) -> Self {
if input.starts_with(";ancp:") {
// ANCPモードで初期化
Self::new_ancp_mode(input)
} else {
Self::new(input)
}
}
fn new_ancp_mode(input: &str) -> Self {
// ANCP → Nyash変換してからレキシング
let transcoder = get_transcoder();
let nyash_code = transcoder.decode(input).unwrap();
Self::new(&nyash_code)
}
}
```
### Day 12-14: エラー位置マッピング
```rust
// src/ancp/source_map.rs
pub struct SourceMap {
mappings: Vec<Mapping>,
}
impl SourceMap {
pub fn translate_position(&self, ancp_pos: Position) -> Position {
// ANCP位置 → Nyash位置への変換
self.mappings
.binary_search_by_key(&ancp_pos, |m| m.ancp_pos)
.map(|i| self.mappings[i].nyash_pos)
.unwrap_or(ancp_pos)
}
}
```
## 📅 Week 3: ツール実装
### Day 15-16: CLIツール
```rust
// src/bin/nyash2ancp.rs
use clap::Parser;
#[derive(Parser)]
struct Args {
#[clap(short, long)]
input: PathBuf,
#[clap(short, long)]
output: Option<PathBuf>,
#[clap(long)]
measure_tokens: bool,
}
fn main() -> Result<()> {
let args = Args::parse();
let content = fs::read_to_string(&args.input)?;
let transcoder = AncpTranscoder::new();
let encoded = transcoder.encode(&content)?;
if args.measure_tokens {
let reduction = measure_token_reduction(&content, &encoded);
eprintln!("Token reduction: {:.1}%", reduction * 100.0);
}
match args.output {
Some(path) => fs::write(path, encoded)?,
None => print!("{}", encoded),
}
Ok(())
}
```
### Day 17-18: スモークテスト統合
```bash
#!/bin/bash
# tools/test_ancp_roundtrip.sh
test_file=$1
expected_pattern=$2
# 1. 通常実行
normal_output=$(./target/release/nyash "$test_file" 2>&1)
# 2. ANCP変換
ancp_file="${test_file%.nyash}.ancp"
./target/release/nyash2ancp -i "$test_file" -o "$ancp_file"
# 3. ANCP実行
ancp_output=$(./target/release/nyash "$ancp_file" 2>&1)
# 4. 出力比較
if [ "$normal_output" != "$ancp_output" ]; then
echo "ERROR: Output mismatch for $test_file"
exit 1
fi
# 5. パターン検証(既存のスモークテスト方式)
echo "$ancp_output" | grep -q "$expected_pattern"
```
### Day 19-21: VSCode拡張基礎
```typescript
// vscode-extension/src/extension.ts
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
// ホバープロバイダー
const hoverProvider = vscode.languages.registerHoverProvider(
'ancp',
{
provideHover(document, position) {
const word = document.getText(
document.getWordRangeAtPosition(position)
);
const original = ancpToNyash(word);
if (original !== word) {
return new vscode.Hover(
`ANCP: \`${word}\` → Nyash: \`${original}\``
);
}
}
}
);
context.subscriptions.push(hoverProvider);
}
```
## 📅 Week 4: 最適化と統合
### Day 22-23: tiktoken実測と最適化
```python
# tools/measure_ancp_efficiency.py
import tiktoken
import json
enc = tiktoken.get_encoding("cl100k_base")
def measure_file(nyash_path, ancp_path):
with open(nyash_path) as f:
nyash_code = f.read()
with open(ancp_path) as f:
ancp_code = f.read()
nyash_tokens = len(enc.encode(nyash_code))
ancp_tokens = len(enc.encode(ancp_code))
return {
"file": nyash_path,
"nyash_tokens": nyash_tokens,
"ancp_tokens": ancp_tokens,
"reduction": 1 - (ancp_tokens / nyash_tokens),
"nyash_chars": len(nyash_code),
"ancp_chars": len(ancp_code),
}
# 全サンプルファイルで測定
results = []
for nyash_file in glob.glob("examples/*.nyash"):
ancp_file = nyash_file.replace(".nyash", ".ancp")
results.append(measure_file(nyash_file, ancp_file))
# 統計出力
avg_reduction = sum(r["reduction"] for r in results) / len(results)
print(f"Average token reduction: {avg_reduction:.1%}")
```
### Day 24-25: CI/CD統合
```yaml
# .github/workflows/ancp.yml
name: ANCP Tests
on: [push, pull_request]
jobs:
ancp-roundtrip:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build with ANCP
run: cargo build --release --features ancp
- name: Run roundtrip tests
run: |
for f in examples/*.nyash; do
echo "Testing: $f"
./tools/test_ancp_roundtrip.sh "$f"
done
- name: Measure efficiency
run: |
python3 tools/measure_ancp_efficiency.py > ancp_report.json
- name: Upload report
uses: actions/upload-artifact@v3
with:
name: ancp-efficiency-report
path: ancp_report.json
```
### Day 26-28: ドキュメント・最終調整
- ユーザーガイド作成
- API ドキュメント生成
- パフォーマンスチューニング
- 最終テスト
## 🎯 成功指標
### Week 1終了時
- [ ] 基本20語で往復変換成功
- [ ] 単純なNyashプログラムが動作
### Week 2終了時
- [ ] コンテキスト認識変換
- [ ] Lexer統合完了
- [ ] エラー位置の正確なマッピング
### Week 3終了時
- [ ] CLI ツール完成
- [ ] スモークテスト統合
- [ ] VSCode基本機能
### Week 4終了時
- [ ] トークン削減率50%以上達成
- [ ] 全サンプルで往復テスト成功
- [ ] CI/CD完全統合
- [ ] ドキュメント完成
## 🚧 リスクと対策
### 技術的リスク
1. **パフォーマンス劣化**
- 対策: 段階的実装で早期発見
- 対策: プロファイリング継続実施
2. **互換性問題**
- 対策: 既存テストスイートで検証
- 対策: feature flagで段階的有効化
### 運用リスク
1. **採用障壁**
- 対策: 分かりやすいドキュメント
- 対策: 移行ツール提供
2. **メンテナンス負荷**
- 対策: 自動テスト充実
- 対策: CI/CDで品質保証
## 📝 チェックリスト
### 実装前
- [ ] tiktoken実測による記号選定完了
- [ ] 関係者への影響確認
- [ ] feature flag設計確認
### 実装中
- [ ] 日次で往復テスト実施
- [ ] パフォーマンス計測継続
- [ ] ドキュメント同時更新
### 実装後
- [ ] 全スモークテスト合格
- [ ] トークン削減率目標達成
- [ ] ユーザーガイド完成
---
この計画に従って実装を進めることで、4週間でANCPを完成させ、AIとの協働開発を革命的に改善します