gui: add EguiBox TypeBox plugin (Windows egui stub)\n\n- plugins: add nyash-egui-plugin with TypeBox (resolve/invoke_id), Windows path for real window via eframe; stub on other OS\n- apps: add apps/egui-hello sample (open→uiLabel→run→close)\n- loader: improve Windows DLL resolution (target triples: x86_64/aarch64 msvc) and lib→dll mapping\n- tests: expand TypeBox vs TLV diff tests up to FileBox; all green\n- docs: update CURRENT_TASK checklist (diff tests completed)\n- config: nyash.toml add EguiBox (type_id=70), plugin registry and methods
This commit is contained in:
@ -0,0 +1,402 @@
|
||||
# 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との協働開発を革命的に改善します!
|
||||
Reference in New Issue
Block a user