Files
hakorune/docs/development/roadmap/phases/phase-12.7/archive/technical-spec.md

293 lines
7.3 KiB
Markdown
Raw Normal View History

# ANCP Technical Specification v1.0
## 1. プロトコル概要
### 1.1 設計原則
- **可逆性**: 100%の双方向変換保証
- **効率性**: 50-70%のトークン削減
- **可読性**: 人間も慣れれば読み書き可能
- **拡張性**: バージョニングによる将来対応
### 1.2 プロトコルヘッダー
```
;ancp:1.0 nyash:0.5.0;
```
- `ancp:1.0`: ANCPプロトコルバージョン
- `nyash:0.5.0`: 対応Nyashバージョン
## 2. 記号マッピング仕様
### 2.1 予約語マッピング(優先度順)
#### Tier 1: 超高頻度1文字
| Nyash | ANCP | 頻度 | tiktoken削減 |
|-------|------|------|--------------|
| me | m | 極高 | 2→1 (50%) |
| new | n | 高 | 3→1 (67%) |
| return | r | 高 | 6→1 (83%) |
| local | l | 高 | 5→1 (80%) |
#### Tier 2: 高頻度1文字特殊
| Nyash | ANCP | 理由 |
|-------|------|------|
| box | $ | 金庫のメタファー |
| from | @ | 接続を表現 |
| init | # | 初期化のハッシュ |
| if | ? | 疑問・条件 |
| else | : | 条件の区切り |
#### Tier 3: 中頻度1-2文字
| Nyash | ANCP | 理由 |
|-------|------|------|
| static | S | 大文字で静的を表現 |
| loop | L | ループのL |
| birth | b | 誕生のb |
| override | O | 上書きのO |
| pack | p | パックのp |
### 2.2 演算子・記号の扱い
- 算術演算子(+, -, *, /: そのまま
- 比較演算子(==, !=, <, >: そのまま
- 論理演算子and, or, not: 検討中
- `and``&`
- `or``|`
- `not``!`
### 2.3 複合パターン
```nyash
// 元のコード
box Cat from Animal {
init { name, age }
}
// ANCP変換後
$Cat@Animal{#{name,age}}
```
## 3. パース規則
### 3.1 トークン境界
- 記号の前後に空白は不要(`$Cat`でOK
- 識別子の区切りは既存ルール継承
- 文字列・コメント内は変換しない
### 3.2 優先順位
1. 文字列リテラル内: 変換なし
2. コメント内: 変換なし
3. 識別子の一部: 変換なし(`method_name``me`は変換しない)
4. 独立トークン: 変換対象
### 3.3 コンテキスト認識
```rust
enum TokenContext {
Normal, // 通常(変換対象)
StringLiteral, // 文字列内
Comment, // コメント内
Identifier, // 識別子の一部
}
```
## 4. 実装仕様
### 4.1 Transcoder API
```rust
pub trait AncpTranscoder {
// 基本変換
fn encode(&self, nyash: &str) -> Result<String, AncpError>;
fn decode(&self, ancp: &str) -> Result<String, AncpError>;
// ストリーミング変換
fn encode_stream(&self, input: impl Read) -> impl Read;
fn decode_stream(&self, input: impl Read) -> impl Read;
// 位置情報保持
fn encode_with_map(&self, nyash: &str) -> Result<(String, SourceMap), AncpError>;
fn decode_with_map(&self, ancp: &str) -> Result<(String, SourceMap), AncpError>;
}
```
### 4.2 SourceMap仕様
```rust
pub struct SourceMap {
mappings: Vec<Mapping>,
}
pub struct Mapping {
// 元の位置
original_line: u32,
original_column: u32,
original_token: String,
// 変換後の位置
generated_line: u32,
generated_column: u32,
generated_token: String,
}
```
### 4.3 エラーハンドリング
```rust
pub enum AncpError {
// 構文エラー
InvalidSyntax { position: Position, expected: String },
// バージョン非互換
VersionMismatch { required: Version, found: Version },
// 変換不可能
UnsupportedConstruct { construct: String, reason: String },
}
```
## 5. 統合仕様
### 5.1 Lexer統合
```rust
// Lexerに追加
pub enum InputDialect {
Nyash,
Ancp(Version),
}
impl Lexer {
pub fn new_with_dialect(input: &str, dialect: InputDialect) -> Self {
// ヘッダー検出で自動判定も可能
let dialect = detect_dialect(input).unwrap_or(dialect);
// ...
}
}
```
### 5.2 CLI統合
```bash
# 変換コマンド
nyash --to-ancp input.nyash > output.ancp
nyash --from-ancp input.ancp > output.nyash
# 直接実行
nyash --dialect=ancp script.ancp
# フォーマット表示
nyash --view=ancp script.nyash # Nyashファイルをancp形式で表示
nyash --view=hybrid script.ancp # 並列表示
```
### 5.3 VSCode統合
```typescript
// 言語サーバープロトコル拡張
interface AncpHoverInfo {
original: string; // Nyash形式
compressed: string; // ANCP形式
savings: number; // 削減率
}
// リアルタイム変換
interface AncpLens {
showOriginal: boolean;
showCompressed: boolean;
showSavings: boolean;
}
```
## 6. テスト仕様
### 6.1 往復テスト
```rust
#[test]
fn roundtrip_all_constructs() {
let test_cases = vec![
// 基本構造
"box Test { }",
"box Child from Parent { }",
// メソッド定義
"birth() { me.x = 1 }",
"override method() { from Parent.method() }",
// 制御構造
"if x == 1 { } else { }",
"loop(i < 10) { i = i + 1 }",
// 複雑な例
include_str!("../examples/complex.nyash"),
];
for case in test_cases {
let encoded = transcoder.encode(case).unwrap();
let decoded = transcoder.decode(&encoded).unwrap();
assert_eq!(case, decoded);
}
}
```
### 6.2 トークン効率テスト
```rust
#[test]
fn measure_token_reduction() {
let encoder = tiktoken::get_encoding("cl100k_base");
let original = "box Cat from Animal { init { name } }";
let ancp = "$Cat@Animal{#{name}}";
let original_tokens = encoder.encode(original).len();
let ancp_tokens = encoder.encode(ancp).len();
let reduction = 1.0 - (ancp_tokens as f64 / original_tokens as f64);
assert!(reduction >= 0.5); // 50%以上の削減を保証
}
```
### 6.3 エラー位置テスト
```rust
#[test]
fn error_position_mapping() {
let ancp = "$Test{invalid syntax here}";
let result = transcoder.decode_with_map(ancp);
match result {
Err(AncpError::InvalidSyntax { position, .. }) => {
// エラー位置が正しくマッピングされているか
assert_eq!(position.line, 1);
assert_eq!(position.column, 14);
}
_ => panic!("Expected syntax error"),
}
}
```
## 7. パフォーマンス目標
### 7.1 変換性能
- エンコード: 100MB/s以上
- デコード: 150MB/s以上
- メモリ使用: 入力サイズの2倍以内
### 7.2 実行時性能
- パース時間増加: 10%以内
- 実行時オーバーヘッド: なしパース後は同一AST
## 8. セキュリティ考慮事項
### 8.1 インジェクション対策
- ANCP記号が既存コードを破壊しないよう検証
- 文字列エスケープの適切な処理
### 8.2 バージョン互換性
- 古いANCPバージョンの適切なエラー表示
- 将来の拡張に備えた設計
## 9. 将来の拡張
### 9.1 ANCP v2.0候補
- 文脈依存圧縮(頻出パターンの動的割当)
- カスタム辞書サポート
- バイナリ形式BANCTP
### 9.2 AI特化拡張
- モデル別最適化プロファイル
- トークナイザー直接統合
- 意味保持圧縮
---
この仕様書は、ANCPの技術的実装の基準となる文書です。実装時はこの仕様に従い、必要に応じて更新してください。