何年も前から「そろそろ書き直したい」と思っている社内システムが、動いてはいるが古い言語のままだ、という職場は多いはずだ。全部を新しい言語に置き換える作業は、規模が大きいほど何年もかかる大工事だと相場が決まっていた。
ところがAnthropicは、自社のソフトウェアの心臓部を2週間足らずで別の言語に移し替えた。しかもその手順一式を、実際に使った指示文やひな形ごと無料で公開している。何がどう変わって、これほど早く終えられるようになったのか。まずAnthropic自身の実績から見ていく。
2週間足らずで100万行を移行
Anthropicの共同創業メンバーでもあるJarred Sumnerは、自社が開発したJavaScript実行環境Bunを移行した。言語はZigからRustへ変わった。公式ブログによると、「100万行のコードが2週間足らずで生成され、既存のBunのテストスイートの100%がマージ前のCIを通過した」という。
100万行。2週間足らず。人手のエンジニアリングチームなら、何年もかけて計画を立てる規模の書き換えだ。自分はこの数字を見て、「言語を丸ごと移すのは何年がかりの大工事」という自分の感覚のほうが、もう古くなっていると気づかされた。
マージ後に19件の不具合が見つかったが、いずれも修正済みだと同じブログは説明する。かかったコストは、キャッシュなしの入力トークン59億・出力トークン6.9億で、API料金にして約16万5000ドル。Rust版は6月にClaude Code自身に組み込まれて出荷された。
Anthropicは同じ考え方で、直近1か月に10個のコードパッケージ(数万行から数十万行規模)も移行したという。規模がもっと小さい例もある。Anthropic Labs共同リードのMike Kriegerは、週末の間にPythonのコードベースを16万5000行のTypeScriptへ移した。数百のエージェントを動かし、8つの区切り(フェーズゲート)ごとに検証を挟み、3回の相互レビューを経て、最後に新旧の出力を1コマンドずつ突き合わせている。使ったトークン数は2700万だった。
| 項目 | Bun(Zig→Rust) | Kriegerの移行(Python→TypeScript) |
|---|---|---|
| 規模 | 100万行 | 16万5000行 |
| 期間 | 2週間足らず | 週末 |
| 体制 | Jarred Sumnerが主導 | 数百のエージェント、8フェーズゲート、3回の相互レビュー |
| トークン数 | 入力59億+出力6.9億 | 約2700万 |
この差から分かるのは、同じ「AIによるコード移行」でも要するトークン量の桁がまるで違うという点だ(公式ブログより)。Bunのような言語処理系の丸ごと移植は数十億トークン規模になる一方、社内ツールの週末移行なら数千万トークンで収まる。自分たちの案件がどちらの桁に近いかを考える手がかりになる。次に気になるのは、これだけ短い期間で動くコードを壊さずに済んだ理由だ。
なぜ品質を保ったまま終えられたのか
公式ブログが示す進め方は、6段階に分かれている。
- 依存関係の地図と、翻訳ルールの一覧(ルールブック)、抜け漏れの棚卸しを作る
- 二重に翻訳して結果を比べる小規模な試験移行で、ルールをストレステストする
- 実装役・査読役・修正役に分かれたエージェントが、全体を並行して翻訳する
- ビルドを繰り返し、出たエラーをキューに積んで順番に潰す
- 起動確認と簡単な動作テストを通す
- 既存のテストスイートを新しいコードで実行し、新旧の出力が一致するか確認する
普段のコードレビューでも、担当者ごとに書き方がばらつくと、レビューのたびに同じ指摘を繰り返す羽目になる。それを防ぐために先に「表記の基準」を決めておくやり方は珍しくない。1番目の手順で作る「ルールブック」も同じ発想だ。公式リポジトリは、ルールブックを「言語間で型やイディオムを対応づけるための参照表になる」と説明している。型の対応関係や例外を先に決め切ってしまえば、あとの翻訳作業はそのルールに従うだけの機械的な繰り返しになる。
もう1つの前提が「judge(判定役)」だ。公式ブログは「強いjudgeを用意しておかないと、いつ終わったと言えるかの基準も、成功したかどうかの物差しも持てない」と釘を刺している。新旧のコードに同じ入力を与えて出力を突き合わせ、機械的に合否を判定する仕組みが、6番目の「動作一致」の正体だ。
決めるのは人、繰り返すのは機械。この役割分担があるから、翻訳する行数が100万行に増えても、確認の手間に歯止めが利く。逆に言えば、ルールブックとjudgeの精度が、そのまま移行全体の質の上限になる。この手順は自分たちのチームでも使えるのだろうか。
自分のチームでも試せるのか
ここまでの手順は、GitHubで公開されているスターターキットとしてそのまま手に入る。中身は、貼り付けて使える8つのプロンプト、ルールブックや進捗管理表のひな形、依存関係を解析するスクリプト、Claude Code用のスキル一式だ。ライセンスはApache-2.0で、商用利用を含めて無料で使える。
使い始める手順も公式リポジトリに示されている。
- 移行対象のリポジトリの中か隣にキットをclone
- キットの
CLAUDE.mdを移行対象リポジトリのCLAUDE.mdへコピー - (任意)
skillフォルダを~/.claude/skills/code-migrationへコピー - 移行対象のリポジトリでClaude Codeを開き、
prompts/00-feasibility.mdを貼り付けて可否判定を実行 - judgeを用意する(必要なら
00b-judge-setup.mdを使う) templates/settings.jsonを移行対象リポジトリの.claude/settings.jsonへコピーprompts/01から06まで、1つずつゲートを確認しながら順番に進める
ここで留保が1つ要る。BunもKriegerの移行も、このキットの上で動いたわけではない。公式ブログは「スターターキットは、上で説明した手順を一般化したテンプレートであり、これらの実際の移行が走ったものそのものではない」と注記している。つまり手元でcloneして使うのは、Anthropicの実績を再現する保証付きの専用ツールではなく、同じ考え方をなぞれるように後から整理されたひな形だ。リポジトリの状態も「Reference code」で、Issueやプルリクエストは監視されていないと明記されている。この手順が、どんな移行にも向くわけでもない。
どんな移行に向くのか
公式リポジトリは対象を「移行が総入れ替えになる場合、つまりすべてのファイルが移り、元の言語のコードが最終的に消える場合」に絞っている。
裏を返せば、少しずつ置き換えていく移行には向かない。同じリポジトリは「JavaScriptからTypeScriptへの移行は件数として最も多いが、その場合はこのキットのほとんどが要らない。TypeScriptはJavaScriptのスーパーセットなので、並行するコードベースを持たずにファイル単位で少しずつ移行できる」と説明している。手元の移行が「一部だけ試しに」で済むなら、このキットの出番ではない。
向くかどうかを分けるのは規模ではなく「総入れ替えかどうか」だ。Bunのような100万行規模でも、Kriegerの16万5000行の社内ツールでも、条件を満たせば同じ6段階に載せられる。ただしどちらの事例でも、移行前から手厚いテストスイートかjudgeが用意されていたことが前提になっている。判定の仕組みをゼロから作るところから始める場合は、その分の時間を見込んでおきたい。
まとめ
Anthropicは、自社のJavaScript実行環境Bunを2週間足らずで100万行分ZigからRustへ書き換えた。その手順は「ルールブック作成→ストレステスト→全体翻訳→コンパイル→動作確認→動作一致」の6段階に整理されている。この手順で実際に使ったプロンプトやテンプレートは、code-migration-kit-with-claude-codeとして公開されている。ライセンスはApache-2.0で、誰でも無料で使える。
向いているのは、言語を丸ごと入れ替える総入れ替えの移行で、事前に強いテストスイートかjudgeを用意できる場合だ。段階的に置き換えられるTypeScript化のような移行や、判定の仕組みがまだ無い状態には向かない。Bunの移行自体がこのキットの上で走ったわけではない点も、実績を自分のプロジェクトにそのまま当てはめる前に踏まえておきたい。
まず動かしてみたい人は、git cloneでキットを手元に置こう。prompts/00-feasibility.mdから着手すれば、Anthropicが実際にたどった手順の入り口に立てる。
コメント
気づきや感想をどうぞ記事への補足や、読んで考えたことをお寄せください。個人情報や、他の人を傷つける内容の投稿はお控えください。
投稿にはGoogleログインが必要です。
Googleでログイン投稿にはGoogleアカウントの表示名が公開されます。メールアドレスは取得・公開しません。
コメントを読み込んでいます…