🏎️

Claude Code に向いているプログラミング言語

に公開12

English version →

TL;DR

Claude Code に 13 言語で簡易 git を実装させたところ、Ruby・Python・JavaScript が最速・最安・最安定でした。静的型付けの言語は 1.4〜2.6 倍遅く、生成コストがかかる傾向がありました。

コスト v1+v2

はじめに

AIコーディングエージェントに向いているプログラミング言語はなんでしょうか。

「AIのバグを防ぐため、型システムは重要!」
「いや、型注釈がないほうがトークン数が少なくて済む!」

定性的な議論は見かけるんですが、定量的な話を見ないので、実験してみました。

実験

Claude Code に、いろいろな言語で「簡易 git」を作らせて、かかった時間やコストを計測しました。
git は Linus が 2 週間で作ったと聞くので、よい題材かなと。

タスクは 2 段階に分けました。

  • v1(新規作成): init / add / commit / log をサポートする version 1 を作る。
  • v2(機能拡張): status / diff / checkout / reset を追加した version 2 を作る。

具体的には、「SPEC-v1.txt を読んで言語 X で実装し、test-v1.sh がパスすることを確認せよ」というプロンプトを与えました。v2 も同様です。

比較した言語は次の通り。

分類 言語
動的型付け Python, Ruby, JavaScript, Perl, Lua
動的型付け+型検査 Python/mypy, Ruby/Steep
静的型付け TypeScript, Go, Rust, C, Java
関数型 Scheme(動的型付け), OCaml(静的型付け), Haskell(静的型付け)

Python/mypy は型注釈付きの Python を書かせて mypy --strict を通させるもの、Ruby/Steep は RBS 型シグネチャを書かせて steep check を通させるものです。型検査なしの Python・Ruby と比較するための条件です。

各言語 20 回ずつ試行しました。モデルは Claude Opus 4.6 (high effort) です。

結果

20回の試行の平均結果です。平均コストでソートしています。

言語 テスト成功率(v1+v2) v1+v2所要時間 平均コスト LOC(v2)
Ruby 40/40 73.1s± 4.2s $0.36 219
Python 40/40 74.6s± 4.5s $0.38 235
JavaScript 40/40 81.1s± 5.0s $0.39 248
Go 40/40 101.6s±37.0s $0.50 324
Java 40/40 115.4s±34.4s $0.50 303
Rust 38/40 113.7s±54.8s $0.54 303
Perl 40/40 130.2s±44.2s $0.55 315
Python/mypy 40/40 125.3s±19.0s $0.57 326
OCaml 40/40 128.1s±28.9s $0.58 216
Lua 40/40 143.6s±43.0s $0.58 398
Scheme 40/40 130.6s±39.9s $0.60 310
Typescript 40/40 133.0s±29.4s $0.62 310
C 40/40 155.8s±40.9s $0.74 517
Haskell 39/40 174.0s±44.2s $0.74 224
Ruby/steep 40/40 186.6s±69.7s $0.84 304

15 言語 × 2 タスク × 20 回 = 600 回の Claude Code の実行のうち、テストをパスしない状態で終わったのは 3 回でした。
失敗の内訳は、Rust が 2 回、Haskell が 1 回。Rust の失敗ログの 1 つを見ると、「テストが間違っている」と主張していました。Rust の他の試行では成功しているので、ハルシネーションだと思われます。

トータルの時間とコスト

v1 + v2 の合計の所要時間のドットプロットです。

所要時間

それからコスト。

コスト

Ruby、Python、JavaScript がトップ 3 で、所要時間 73〜81 秒、コスト $0.36〜0.39。標準偏差も小さく、安定して速いです。

4 位以降は Go、Rust、Java と続きますが、標準偏差が急に大きくなります。Go は平均 102 秒ですが ±37 秒とブレが大きい。

ちなみに、時間とコストの散布図です。おおよそ、所要時間 ≒ コストと言ってよさそうです。

所要時間 vs コスト

最終的なコード行数

v2 が終わった後の LOC(コード行数)です。

コード行数

OCaml(216 行)、Ruby(219 行)、Haskell(224 行)が最もコンパクト。Python(235 行)、JavaScript(248 行)と続きます。C は平均 517 行と突出して多い。

時間と最終的な行数の散布図はこちら。

所要時間 vs 行数

面白いのは、LOC が少ない=速い・安い、とは限らないこと。OCaml と Haskell は LOC こそ少ないのに、時間もコストもそんなによくありません。

v1/v2 詳細結果

v1 と v2 の内訳です。

言語 v1 所要時間 v1 ターン数 v1 LOC v1 テスト v2 所要時間 v2 ターン数 v2 LOC v2 テスト 合計時間 平均コスト
Ruby 33.2s± 2.5s 6.0 107 20/20 40.0s± 3.0s 7.0 219 20/20 73.1s± 4.2s $0.36
Python 32.9s± 1.3s 6.0 113 20/20 41.8s± 4.5s 7.1 235 20/20 74.6s± 4.5s $0.38
Javascript 36.0s± 3.5s 6.0 123 20/20 45.1s± 4.1s 7.2 248 20/20 81.1s± 5.0s $0.39
Go 47.5s±34.5s 7.7 143 20/20 54.1s±12.3s 9.7 324 20/20 101.6s±37.0s $0.50
Java 64.3s±31.1s 8.7 152 20/20 51.2s± 8.1s 9.6 303 20/20 115.4s±34.4s $0.50
Rust 53.6s±36.7s 9.4 139 19/20 60.1s±19.2s 10.1 303 19/20 113.7s±54.8s $0.54
Perl 84.4s±43.1s 9.2 173 20/20 45.7s± 6.8s 7.5 315 20/20 130.2s±44.2s $0.55
Python/mypy 52.7s± 8.3s 9.2 171 20/20 72.6s±14.4s 12.2 326 20/20 125.3s±19.0s $0.57
Ocaml 80.9s±28.8s 11.2 111 20/20 47.1s± 6.0s 9.2 216 20/20 128.1s±28.9s $0.58
Lua 96.4s±42.8s 10.1 226 20/20 47.2s± 5.2s 8.1 398 20/20 143.6s±43.0s $0.58
Scheme 66.7s±36.7s 8.9 171 20/20 63.9s±10.0s 10.6 310 20/20 130.6s±39.9s $0.60
Typescript 69.9s±18.8s 12.2 149 20/20 63.1s±17.8s 11.3 310 20/20 133.0s±29.4s $0.62
C 65.0s±18.2s 8.2 276 20/20 90.8s±39.1s 13.7 517 20/20 155.8s±40.9s $0.74
Haskell 74.3s±39.1s 10.3 119 19/20 99.6s±32.4s 16.4 224 20/20 174.0s±44.2s $0.74
Ruby/steep 105.0s±65.2s 20.2 150 20/20 81.6s± 8.8s 17.2 304 20/20 186.6s±69.7s $0.84

ターン数とは、1 回のプロンプト実行中に Claude が何回 API ラウンドトリップ(ツール呼び出し → 結果受け取り → 次の応答)を繰り返したかの回数です。

v1(新規作成)の所要時間

v1 所要時間

v1 では言語間の差が大きく出ています。Python(32.9 秒)と Ruby(33.2 秒)が僅差でトップ、JavaScript(36.0 秒)が続きます。一方、Ruby/Steep は 105.0 秒と Ruby の約 3.2 倍。Lua(96.4 秒)や OCaml(80.9 秒)も遅め。

v1 は空のディレクトリからスタートするので、Cargo.tomlpackage.json などのプロジェクト設定ファイルを生成するコストが含まれます。Python/Ruby/JavaScript などは minigit ファイル 1 つを生成するだけで済むので、差が大きくなっている可能性があります。

v2(機能拡張)の所要時間

v2 所要時間

v2 だけを見ると、言語間の差は縮まっています。トップ 3 は Ruby(40.0 秒)、Python(41.8 秒)、JavaScript(45.1 秒)で変わらず。Perl(45.7 秒)、OCaml(47.1 秒)、Lua(47.2 秒)が僅差で続きます。

Haskell は v2 でも最も遅く、平均 99.6 秒。LOC は 224 行と最少クラスなのに時間がかかっており、思考トークンが多い模様。C は 90.8 秒で、LOC の多さ(517 行)が効いています。

Python vs Python/mypy を比べると、v1 で 1.6 倍、v2 で 1.7 倍の差。Ruby vs Ruby/Steep では v1 で 3.2 倍、v2 で 2.0 倍です。

さらなるデータや再試について

実験コードや結果はすべて次の GitHub リポジトリで公開しています。

https://github.com/mame/ai-coding-lang-bench

実行ごとの結果は report.md をご参照ください。実行ログや実際に生成されたソースコードも data ブランチ に置いてあります。

なお、benchmark.rb は --dangerously-skip-permissions を使うので、再試をしてみたい方はご注意ください(筆者は Docker の中で実行しました)。

議論

ここからは筆者の解釈です。筆者は Ruby のコミッタなので、バイアスがあることにご注意ください。また、筆者は生成されたコードを全部分析したわけでもありません。

何が速さ・安さの原因なのか?

この実験から原因を断定することはできません。また、シンプルな単一の理由があるとも思えません。

ただ、傾向から仮説を考えることはできます。

  • 型システムの有無: 動的型付けの言語のほうが安定して速く生成できる傾向は確実にあるようです。
  • 短く簡潔に書けること: 短く書ける言語のほうが速く書けるのは直感にあいます。ただし、OCaml や Haskell は最終的な行数が少ないのにコストが高い。思考中に消費されるトークン数が多いようです。
  • 手続き型と関数型: Ruby 、Python 、JavaScript のトップ 3 を除くと、いわゆる手続き型と関数型言語で生成効率に大きな差はないように見えます。特筆すべきは、OCaml が v2(機能拡張)で 47.1 秒と JavaScript に迫る速さでした(OCaml は手続き型的にも書けるので、純粋な関数型との比較は難しいですが)。
  • 言語固有の難しさ: C のメモリ管理、Rust の所有権などが生成効率に影響している可能性はあるかもしれません。
  • AI の習熟度: Python・Ruby・JavaScript は学習データが大量にあるはず。一方、Scheme・Haskell は少ないと思われ、結果も遅い傾向があります。Ruby/Steep が Ruby の 2.0〜3.2 倍かかるのに対し Python/mypy は Python の 1.6〜1.7 倍で済んでいるのも、mypy のほうが AI にとって馴染みがあるからかもしれません。

おそらく、これらが複合的に効いていると考えるのが妥当でしょう。

型がないと生成コードにバグがある可能性は?

あります。テストをパスしたというだけなので。動的型付けの言語では、テスト外のパスで型エラーが起きるかもしれません。

ただ、個人的な意見なのですが、型エラーはバグの中では検出やデバッグがしやすい部類のものです。もし型検査なしでは型エラーを頻繁に混入させるようなエージェントだとしたら、もっと発見しにくいロジックのバグも同程度に書いているはずで、型検査の有無以前の問題ではないでしょうか。

もうひとつ興味深いのは、600 回の実行のうち、失敗(テストが通らないまま終了)したのは Rust(2 回)と Haskell(1 回)だけだという事実です。どちらも静的型付けで、所有権やモナドなど独自の概念を持つ言語です。たまたまかもしれませんが、まあ、型があってもバグは出ます。

差はたかだか 2 倍程度。大差ないのでは?

個人的には大差だと思います。

実際の開発では、作りながら仕様を固めるので、「プロンプト投げる → 待つ → 次のタスクを考える」を高頻度で繰り返します。「待つ」が 1 分なのと 30 秒なのとでは、通算時間だけでなく集中力的に大きく違う。レスポンスタイムはアジャイル開発で命です。

「時間をかけても堅牢なものを作るべき」という主張もわかりますが、競合他社が倍の速度でサービスを拡充していっているとき、座して待つのが正解でしょうか? 開発スピードもまた品質の一つです。

ただ、もし将来、1 秒と 0.5 秒になったら、大差ないといって良いと思います。

題材の規模が小さすぎる。型システムは規模が大きくなったときに効くはずだ。

否定しません。ただ、言語間で公平に比較できる大規模プロジェクトを用意するのは結構大変そう。誰かやってください。

言語選定はエコシステムや実行速度のほうが重要では?

それはそう。生成の観点でも、エコシステムに乗れれば生成されるコード量は少なく済むので、速く安いと予想されます。また、作りたいアプリで実行速度が必須なら、遅い動的型付けの言語を選ぶ道理はありません。

ちなみに今回はあくまで言語自体の比較にフォーカスするため、外部ライブラリなしで実装できそうな問題を選びました。ハッシュに SHA256 を使うとライブラリ差が出るので、独自ハッシュを使う仕様にしています。

まとめ

Claude Code の生成に向いているプログラミング言語を定量的に検討しました。
少なくとも現状のプロトタイピング段階では、Ruby 、Python 、JavaScript が向いていると言って良さそうです。

アプリの規模が大きくなれば他の言語が有利になるかもしれません。ぜひ誰か検証してください。

昔から言われている話ですが、初期は動的型付けでスピーディーに開発し、仕様が固まって規模が大きくなったら静的型付けに移行する、というのはやはり正しい戦略なのかもしれません。コーディングエージェントは言語移植にめっぽう強い印象がある(要検証)ので、これがよりいっそう現実的な選択肢になってくるかも?

注意

  • 2026 年 3 月時点の評価です。AI の進化速度を考えると、半年後にはもう怪しいかも。
  • この実験は the Claude for Open Source Program のお世話になりました。6 ヶ月の無料 Claude Max 20x、ありがとう Anthropic!

Discussion

soya-miyoshisoya-miyoshi

題材によるところが大きいかもと感じました。gitのようなファイル操作主体のシステムは型の恩恵が出にくく、ウェブアプリのようにDB→ドメインモデル→DTOとデータ変換が連鎖する構造だと型はより価値を発揮すると思います。「速さ」という軸では動的型付けに分があるのは人間でも同じですが、安全に開発するという意味では型は捨てきれないですね。反論ではなく別軸の観点として!

Yusuke EndohYusuke Endoh

はい、題材に依りそうなのはおっしゃるとおりだと思います。ただ、仮にウェブアプリという題材を選んだら、Ruby on Rails という長年の蓄積があるので、コードの短さと AI 習熟度の面からそれこそ Ruby が圧勝しそうな予感がしました(未検証)。みんなが納得できる題材の選定はむずかしいですね。

ロードロード

https://github.com/Tencent-Hunyuan/AutoCodeBenchmark
Tencentの出してるBenchMarkで副作用的に言語事の測定をされてる先行研究があるので、上位言語が入ってないのは残念でした・・・

haboritehaborite

AutoCodeBenchのPass@nはテスト通過率に基づく指標なので、この記事中で主に扱われている速さ・安さとはまた話が違ってくるとは思います。コードを公開して頂いているので、今後他の人が色んな言語で試した結果を見てみたいというのは同意です。

Yusuke EndohYusuke Endoh

情報ありがとうございます!
とりあえずその表で上位になっている Elixir と Kotlin(と参照用に Ruby)を雑に 2 回ずつ手動実行してみました。

1回め時間 1回めコスト 2回め時間 2回めコスト
Elixir 166.6s $0.71 392.4s $1.20
Kotlin 252.5s $0.89 145.4s $0.71
Ruby 77.6s $0.38 80.9s $0.38

サンプル数少なすぎるし、ブレが大きいのでなんとも言いがたいですが、あまり望み高そうではありませんでした。このベンチとは相性よくないのかもしれません。

この実験、別日に測定した値を比較するのはよくないと思っていて(日進月歩でモデルが改善しているし、サーバの調子もありそうなので)、やるならきちんと言語リストに含めて全言語再試したいと思うんですが、電気代も手間もそこそこかかるので、よければご支援をご検討いただけると幸いです :-) (かならずやるとは約束できませんが……)

https://github.com/sponsors/mame

nakatanakata

検証お疲れ様です。15言語(型検査の条件違い含む)で600回にも及ぶ定量データ、とても参考になります!
記事を読ませていただき、「テストの失敗をどう捉えるか」で結果の見え方が変わってきそうで面白いなと感じました。
人間がAIを「コーディングツール」として使い、スピーディーにプロトタイピングを回す前提なら、動的型付け言語の生成の速さと安定性は圧倒的な武器になりますよね。
一方で、今後AIに自律的な「コーディングエージェント」として開発を任せる将来を想像すると、Rustなどで起きたテスト失敗は「AIがバグを出した」というよりも、「AIのハルシネーションによる潜在的なバグをコンパイラが未然に弾いてくれた(=安全性が機能した)」という見方もできるかもしれないなと思いました。
AIをツールとして見るか、エージェントとして見るかで言語の評価が変わってくるという視点に気づくことができ、非常に考えさせられる検証でした。ありがとうございます!

Yusuke EndohYusuke Endoh

PHP がないことを嘆く声が多いので、2 回だけ実行してみた結果をこっそりコメントで報告。

1回め時間 1回めコスト 2回め時間 2回めコスト
PHP 441.5s $1.37 377.5s $1.12

サンプル数 2 で断定的なことは言いませんが、厳しそうな予感……。

yoheikikutayoheikikuta

興味深い検証ありがとうございます。
こういう題材があると色々な比較ができて面白いですね。
例えば高いモデルを使った方が本当に有効なのかどうかとかを定量的に比較したりもできそう。
Python で Opus 4.6 high effort と Haiku 4.5 で 3 回試行した平均値を比べると、この問題の難易度だと Haiku 4.5 の方が良い結果になったりしました(Amazon Bedrock 経由で使っていたりして色々条件も違うので絶対的な時間やコストは書かれている内容と乖離ありますが、この表での相対比較はできそう)。

Total Time Avg Cost
Python (Opus 4.6 high effort ) 180.6s $0.74
Python (Haiku 4.5) 132.4s $0.17
Yusuke EndohYusuke Endoh

ご無沙汰してます!

なるほど、Python では Haiku 4.5 でいけるのですね。上で C# で再試してくれた方によると、Opus 4.6 medium effort でも FAIL したそうなので、適切なモデルを選択するのは難しいですね……。

それで思いましたが、弱いモデルでも PASS できる確率が高い言語ほど AI 向きだ!という主張もおもしろいかもですね。(AI に関しては専門家でないのでユーザ気分で気軽に雑なこといいます)

yoheikikutayoheikikuta

ご無沙汰してます!

なるほど、色々な視点が出てきて味わい深いですね。
このような結果の多様性はプログラミング言語やAIモデルの多様性を感じさせるもので、個人的に好みです(AI使うんだったらこのパターンで使っておけ、で終了だと面白くないので)。

木戸明木戸明

C#、highだと成功率上がるんですが何故かPass2で50%位失敗するので一旦諦めました……。
来週また機会があれば調査してみます。