7.2 KiB
7.2 KiB
Phase 10: Classic C Applications Migration to Nyash
🎯 概要
3つの著名なCアプリケーションをNyashに移植し、新実装された高度なメモリ管理機能を実戦テストする。
📦 移植対象アプリケーション(優先順位順)
1. 🌐 Tinyproxy - ゼロコピー判定機能の実証
元実装: https://github.com/tinyproxy/tinyproxy
サイズ: ~5000行C、軽量HTTPプロキシサーバー
Nyash移植目標: apps/tinyproxy_nyash/
🔍 ゼロコピー判定テストケース
// HTTPリクエスト転送でのメモリ効率検証
static box ProxyServer {
init { upstream_buffer, downstream_buffer }
relay_data(client_data) {
// ⭐ ゼロコピー判定:バッファーが共有されているかチェック
if (me.upstream_buffer.is_shared_with(client_data)) {
console.log("✅ Zero-copy achieved!")
} else {
console.log("❌ Unnecessary copy detected")
}
// 大量データ転送での最適化確認
return me.upstream_buffer.share_reference(client_data)
}
}
📋 実装要件
- HTTPプロキシの基本機能(GET/POST転送)
SocketBoxでのクライアント・サーバー接続BufferBoxでの効率的なデータ転送- ゼロコピー判定APIの実装・テスト
2. 🎮 Chip-8エミュレーター - fini伝播とweak生存チェック
元実装: https://github.com/mattmikolay/chip-8 (参考)
サイズ: ~1000行C、8ビットゲーム機エミュレーター
Nyash移植目標: apps/chip8_nyash/
🔍 メモリ管理テストケース
// CPU・メモリ・グラフィックスの相互参照関係でのfini伝播テスト
static box Chip8CPU {
init { memory, graphics, sound }
fini() {
// ⭐ fini伝播:依存オブジェクトの自動クリーンアップ
console.log("🔄 CPU cleanup triggered")
me.memory.cleanup() // メモリバンクの解放
me.graphics.cleanup() // VRAM解放
}
}
static box Chip8Memory {
init { ram, weak_cpu_ref } // CPUへの弱参照
read_byte(address) {
// ⭐ weak生存チェック:CPUがまだ生きているか確認
if (me.weak_cpu_ref.is_alive()) {
return me.ram.get(address)
} else {
console.log("⚠️ CPU destroyed, memory access blocked")
return null
}
}
}
📋 実装要件
- Chip-8命令セット実装(35命令)
- 64x32ピクセルグラフィックス(
WebCanvasBox使用) - サウンド出力(
SoundBox使用) - fini伝播システムとweak参照の実戦テスト
3. ✏️ kilo テキストエディター - 「うっかり全体コピー」検出
元実装: https://github.com/antirez/kilo
サイズ: ~1000行C、軽量ターミナルエディター
Nyash移植目標: apps/kilo_nyash/
🔍 メモリ効率テストケース
// 大きなテキストファイル編集での不必要なコピー検出
static box TextBuffer {
init { lines, undo_stack }
insert_char(row, col, char) {
local old_lines_size = me.lines.memory_footprint()
// 文字挿入操作
me.lines.get(row).insert_at(col, char)
local new_lines_size = me.lines.memory_footprint()
local size_diff = new_lines_size - old_lines_size
// ⭐ 「うっかり全体コピー」検出
if (size_diff > 1000) { // 1文字挿入で1KB以上増加
console.log("🚨 INEFFICIENT COPY DETECTED!")
console.log("Expected: 1 byte, Actual: " + size_diff + " bytes")
me.log_memory_leak_warning()
}
}
// 大規模な検索・置換での効率性チェック
search_and_replace(pattern, replacement) {
local initial_memory = me.lines.memory_footprint()
// 検索・置換実行
me.lines.replace_all(pattern, replacement)
local final_memory = me.lines.memory_footprint()
// メモリ使用量が2倍を超えた場合は問題
if (final_memory > initial_memory * 2) {
console.log("⚠️ Memory usage doubled during replace operation")
}
}
}
📋 実装要件
- ターミナル操作(
ConsoleBoxでの入出力) - ファイル読み書き(
FileBox使用) - 基本的な編集機能(カーソル移動、挿入、削除)
- メモリ効率監視とコピー検出システム
🛠️ 技術的実装指針
共通アーキテクチャ
// 各アプリケーション共通の構造
static box AppName {
init { core_components }
main() {
me.initialize_components()
me.run_main_loop()
me.cleanup_resources()
}
// メモリ効率レポート(全アプリ共通)
memory_report() {
return new MapBox()
.set("zero_copy_count", me.zero_copy_operations)
.set("unnecessary_copies", me.detected_copies)
.set("memory_leaks", me.fini_failures)
.set("weak_ref_cleanups", me.weak_cleanup_count)
}
}
新API要件
-
ゼロコピー判定API
BufferBox.is_shared_with(other)→ BoolBoxBufferBox.share_reference(data)→ 参照共有
-
fini伝播システム
- 自動的な依存オブジェクトクリーンアップ
- クリーンアップチェーンの可視化
-
weak参照システム
WeakBox.is_alive()→ BoolBox- 循環参照の自動検出・回避
-
メモリ効率監視
Box.memory_footprint()→ IntegerBox- コピー発生の検出・警告
🎯 期待される成果
パフォーマンス目標
- Tinyproxy: HTTP転送でのゼロコピー率 90%以上
- Chip-8: 60FPSエミュレーション + fini伝播の完全動作
- kilo: 1MB+ファイル編集でのメモリ効率 95%以上
学習効果
- Copilot: 大規模Nyashアプリケーション開発経験
- 開発者: 新メモリ管理機能の実用性確認
- コミュニティ: Nyashでの実用アプリケーション事例
📅 実装計画
Phase 10.1: Tinyproxy実装 (1週間)
- HTTPプロキシ基本機能
- ゼロコピー判定API実装・テスト
Phase 10.2: Chip-8実装 (1週間)
- エミュレーター基本機能
- fini伝播・weak参照の実戦テスト
Phase 10.3: kilo実装 (1週間)
- テキストエディター基本機能
- メモリ効率監視システム
Phase 10.4: 統合テスト・最適化 (1週間)
- 3アプリケーション同時実行テスト
- パフォーマンス分析・改善
🚀 この移植プロジェクトの意義
- 実用性の実証: Nyashで実際のアプリケーションが作れることを証明
- 新機能の検証: ゼロコピー・fini・weakの実戦テスト
- 開発体験の向上: Copilotとの協調開発での生産性検証
- エコシステム拡充: Nyashアプリケーションの具体例提供
この移植が成功すれば、Nyashは「実用的なプログラミング言語」として確立されます! 🎉