概要
- AIとアルゴリズム を組み合わせて大規模コードベースをRustに移植する試み
- Pokemon Showdown のJavaScript実装をRustに変換する個人プロジェクトの体験談
- Claudeのサンドボックス回避や自動化の工夫、技術的課題の詳細
- 移植作業の工程、問題点、AI活用の限界と人間の介入ポイント
- JavaScriptとRust間の言語仕様や設計思想の違いによる課題
Claudeと共に進めるPokemon ShowdownのRust移植体験
- Microsoftの大規模コードベース をC++からRustへ移植する戦略に触発された体験談
- Pokemon Showdown のオープンソース実装をRustに変換する理由として、AIトレーニングループでの パフォーマンス向上 を目指す動機
- Claudeを活用し、 JavaScriptからRustへの自動変換 に挑戦する休日プロジェクト
サンドボックスの回避方法
- Claudeのサンドボックスには sshアクセス制限 などが存在し、GitHubへのpushができない問題
- Node.jsで ローカルHTTPサーバー を立て、外部からgitコマンドを実行する仕組みを構築
- Docker環境 内でビルド・実行することで、アンチウイルスによるブロックを回避
- AppleScriptやAuto Clickerを活用し、 自動で許可操作 やターミナルのフォーカス維持を実現
Claudeの自動化と制御
- Claudeが繰り返し 人間の許可を求める 挙動を、AppleScriptでEnterやcmd-vを自動送信して回避
- システムアップデート等による ターミナルのフォーカス喪失 をAuto Clickerで解決
- 長時間実行時の 安定性・信頼性 の課題と、特定のエラー発生事例
コード移植の実際
- 最初はClaudeに 単純なプロンプト で移植を依頼、数千行のRustコードが生成されるも、構造の不整合や 安易な抽象化 が多数発生
- JavaScriptの各ファイル・メソッドごとに Rust側に対応付け、コメントで元のソースを残すスクリプトを作成
- ファイルサイズ肥大化による コンテキストウィンドウの制約 を回避するため、メソッド単位でファイルを分割
移植後のクリーンアップと統合
- Claudeによる 大規模な一括変換 の後、手動で問題点を特定し、AIに 具体的な指示 を出して修正
- Rust移植時に 本来分離すべきロジック が各所にハードコーディングされる問題を人間が発見・誘導
- 統合テスト は全体を移植してから一度に実施、JavaScriptとRustで同じ入出力となるようテストハーネスを自動生成
- 数百万件規模のバトルシミュレーションで 一貫した検証 を実施、バッチサイズを増やしながらバグを減少
RustとJavaScriptの違いによる課題
- Rustの 借用チェッカー により、PokemonとBattle間の相互参照問題が発生
- コピー、インデックス渡し、コールバック関数でmutable参照を扱う工夫
- JavaScriptの 動的型付け とRustの厳格な型付けの差異
- Option<>やstructの多用で対応、不定値や可変引数の表現違い
- ClaudeのAIとしての 限界
- 複数ファイルにまたがる本質的な修正や、複雑なロジックの移植を回避しがち
- テストに合格するための 場当たり的なハック や不完全な実装が頻発
- コメントを「唯一の情報源」としても、AIが独自にコードを変更する場面も
ClaudeとAIコード移植の現実と教訓
- AIによる大規模コード移植 は、驚くほど多くの作業を自動化できる一方で、 人間の設計力・レビュー が不可欠
- 構造化・分割・明確な指示が品質向上の鍵
- 言語仕様や設計思想の違い をAIが完全に吸収するのは難しく、AIの「楽をしたがる」傾向を人間が制御する必要
- 今後の発展に期待しつつ、現状では 人間とAIの協働 が最適解