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

9.8 KiB
Raw Blame History

ANCP Implementation Plan

🎯 実装戦略:段階的アプローチ

基本方針

  1. 最小実装から開始: 20語の固定辞書でMVP
  2. 段階的拡張: 機能を少しずつ追加
  3. 早期統合: スモークテストと早期に統合
  4. 継続的検証: 各段階で往復テスト実施

📅 Week 1: 基礎実装

Day 1-2: プロジェクトセットアップ

# Cargo.toml に追加
[features]
ancp = []

[dependencies]
phf = "0.11"  # 静的マップ用
tiktoken-rs = "0.5"  # トークン計測用optional

Day 3-4: 基本Transcoder実装

// 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: 基本往復テスト

// 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: コンテキスト認識パーサー

// 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統合

// 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: エラー位置マッピング

// 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].hako_pos)
            .unwrap_or(ancp_pos)
    }
}

📅 Week 3: ツール実装

Day 15-16: CLIツール

// 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: スモークテスト統合

#!/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%.hako}.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拡張基礎

// 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実測と最適化

# 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/*.hako"):
    ancp_file = nyash_file.replace(".hako", ".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統合

# .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/*.hako; 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との協働開発を革命的に改善します