<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rust on ROBOCO</title>
    <link>https://roboco.io/ja/tags/rust/</link>
    <description>Recent content in Rust on ROBOCO</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Fri, 16 Oct 2026 10:00:00 +0900</lastBuildDate>
    <atom:link href="https://roboco.io/ja/tags/rust/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>バイブコーディングでレガシーをモダナイズする（1/2）：20年もののC/C&#43;&#43;アプリケーション</title>
      <link>https://roboco.io/ja/posts/legacy-cpp-vibe-coding-modernization/</link>
      <pubDate>Fri, 16 Oct 2026 10:00:00 +0900</pubDate>
      <guid>https://roboco.io/ja/posts/legacy-cpp-vibe-coding-modernization/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;エージェントがレガシーC/C++の前で迷うのは、コードが複雑だからではなく、自分の作業が正しいかどうかを確かめる手段がないからです。モダナイゼーションの最初の投資先は、言語移行ではなく検証環境です。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://roboco.io/posts/images/Dohyun.png&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;チョン・ドヒョン - ROBOCO首席コンサルタント&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;バイブコーディング導入のコンサルティングをしていると、似たような悩みをよく耳にします。「うちのプロジェクトは複雑すぎて、エージェントが指示どおりに仕事をしてくれません」。最初は、ドメインが特殊なのか、プロンプトの書き方に問題があるのだろうと考えていました。しかし事例が積み重なるにつれて、共通点が見えてきました。こう話すチームのプロジェクトは、ほとんどが &lt;strong&gt;20年以上前から続くC/C++のコードベース&lt;/strong&gt; だったのです。&lt;/p&gt;&#xA;&lt;p&gt;同じチームでも、新しく作ったPythonツールやWeb管理画面ではエージェントをうまく使いこなしていました。したがって、問題はチームの能力やエージェントそのものよりも、コードベースの側にあると考えるのが自然です。本記事では、こうしたレガシープロジェクトをバイブコーディングでモダナイズする方法を、公開事例と研究をもとに整理します。根拠資料は2026年10月15日時点で調査した公開事例・論文・ツールドキュメントであり、各数値は発表主体による自己報告である点もあわせてお断りしておきます。&lt;/p&gt;&#xA;&lt;p&gt;本記事は、レガシーコードベースのモダナイゼーションを扱う2部作の1本目です。第1部ではC/C++で書かれたレガシーアプリケーションを扱い、第2部ではPHPで書かれたレガシーWebアプリケーションのモダナイゼーション戦略を扱います。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;シリーズ：バイブコーディングでレガシーをモダナイズする&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;20年もののC/C++アプリケーション（本記事）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://roboco.io/ja/posts/legacy-php-vibe-coding-modernization/&#34;&gt;Webの歴史とともに積み重なったPHP&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;エージェントがレガシーC/C++で失敗する主な理由は、ビルドを再現できないこと、ポインタの所有権がコードに表れていないこと、変更を検証するテストがないことです（これは私のコンサルティング経験にもとづく解釈です）。&lt;/li&gt;&#xA;&lt;li&gt;公開されている成功事例（Google giflib、Wiz fastText、Rukuzu）はいずれも、&lt;strong&gt;範囲の狭いモジュールを強力な検証とともに&lt;/strong&gt; 置き換えています。数百万行を一度に別の言語へ翻訳した事例ではありません。&lt;/li&gt;&#xA;&lt;li&gt;推奨するのは全面的な書き直しではなく、段階的なモダナイゼーションです。既存のコアはModern C++で安定化させ、境界が狭くメモリ欠陥の多いモジュールだけを選択的にRustなどへ移します。&lt;/li&gt;&#xA;&lt;li&gt;エージェントは調査・変換・テスト・反復修正を担い、人は所有権の設計・互換性の判断・リリースに責任を持ちます。&lt;/li&gt;&#xA;&lt;li&gt;最初の90日の目標は全面移行ではなく、代表的なモジュールを1つ本番移行し、同じ手順を繰り返せることを証明することです。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;1-エージェントはなぜレガシーccで迷うのか&#34;&gt;1. エージェントはなぜレガシーC/C++で迷うのか&lt;/h2&gt;&#xA;&lt;p&gt;コーディングエージェントは、コードを読み、修正し、ビルドとテストを実行して結果を確認するというループで仕事をします。このループの最後の段階である「確認」が塞がれると、エージェントは自分が修正したコードが正しいかどうかを知ることができません。私が現場で見てきた20年もののC/C++プロジェクトでは、このループが何か所も途切れていました。&lt;/p&gt;&#xA;&lt;p&gt;第一に、&lt;strong&gt;ビルドを再現できません。&lt;/strong&gt; 特定の開発者のPCに合わせたビルド設定、バージョンが固定されていないベンダーSDK、数十個のプリプロセッサマクロと条件付きコンパイルが絡み合っています。エージェントがクリーンな環境でビルドを実行できなければ、自分の変更がコンパイルできるかどうかすら確認できません。また、同じ関数でも、どのマクロが有効かによって実際にコンパイルされるコードが変わります。実際のコンパイルオプションなしにソースファイルだけを読んだエージェントは、存在しないコードパスを根拠に判断してしまいます。&lt;/p&gt;&#xA;&lt;p&gt;第二に、&lt;strong&gt;ポインタの所有権がコードに表れていません。&lt;/strong&gt; 古いC/C++コードでは、1つの &lt;code&gt;T*&lt;/code&gt; が「このオブジェクトは自分が解放しなければならない」という意味の場合もあれば、「一時的に借りているだけ」という意味の場合もあります。その区別はコードではなく、20年前の作者の頭の中や、すでに失われたWikiの中にあります。エージェントがgrepで呼び出し箇所を見つけても、オブジェクトの破棄後にコールバックが実行されるのか、コンテナの再割り当てによって参照が無効になるのかまではわかりません。そのため、エージェントの修正はもっともらしく見えても、解放後使用（use-after-free）や二重解放を新たに生み出しかねません。&lt;/p&gt;&#xA;&lt;p&gt;第三に、&lt;strong&gt;変更を検証するテストがありません。&lt;/strong&gt; テストがあったとしても、少数の正常系だけを扱っていることが多いです。人間の開発者はこの穴を経験と手動テストで埋めてきましたが、エージェントにはそのようなセーフティネットがありません。結果として、エージェントの生成速度は &lt;strong&gt;検証されていない変更量&lt;/strong&gt; を増やすだけになります。&lt;/p&gt;&#xA;&lt;p&gt;まとめると、これらのプロジェクトが「複雑すぎる」からエージェントが失敗するという診断は、半分しか正しくありません。より正確な診断は、エージェントが成否を判断する手段を持っていないということです。だからこそ、モダナイゼーションの最初の投資先は言語移行ではなく、&lt;strong&gt;エージェントがオリジナルと新しい実装をビルドし、同じ入力で比較できる検証環境&lt;/strong&gt; であるべきです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-公開事例が実際に示していること&#34;&gt;2. 公開事例が実際に示していること&lt;/h2&gt;&#xA;&lt;p&gt;エージェントでC/C++をモダナイズした公開事例は、まだ多くありません。そして数字だけを切り出すと、誇張して受け取られやすいものです。以下の表は主要な事例をまとめたうえで、各数値が何を証明し、何を証明していないのかをあわせて記しています。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;事例&lt;/th&gt;&#xA;          &lt;th&gt;移行元と移行先&lt;/th&gt;&#xA;          &lt;th&gt;発表された結果&lt;/th&gt;&#xA;          &lt;th&gt;この結果が証明していないこと&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Google giflib&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;C 約3千行 → Rust&lt;/td&gt;&#xA;          &lt;td&gt;3千万個以上のGIFで回帰比較、2億回以上の差分ファジング、性能は中立&lt;/td&gt;&#xA;          &lt;td&gt;大規模アプリケーションを一括翻訳できること&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Wiz fastText&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;C++ 約2万行 → Go&lt;/td&gt;&#xA;          &lt;td&gt;2日間で5,434行のGo、保有するモデル検証テストに100%合格&lt;/td&gt;&#xA;          &lt;td&gt;すべてのAPI・プラットフォーム・学習機能の同等性&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Loxation Rukuzu&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Kuzu C++ 約20万行 → Rust&lt;/td&gt;&#xA;          &lt;td&gt;報告時点で15個のcrate、2,700件以上のテスト&lt;/td&gt;&#xA;          &lt;td&gt;20万行全体の機能同等性の完了&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Google IDの型変更&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;32ビット → 64ビットIDへの横断的変更&lt;/td&gt;&#xA;          &lt;td&gt;変更595件のうち74.45%をLLMが生成、総作業時間を約50%削減と推定&lt;/td&gt;&#xA;          &lt;td&gt;言語の全面置き換えの効果&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Bun&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Zig → Rust（C++ではない）&lt;/td&gt;&#xA;          &lt;td&gt;2週間未満で100万行以上を生成、既存CIをすべて通過&lt;/td&gt;&#xA;          &lt;td&gt;本番での同等性（通過後も回帰が19件見つかった）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;これらの事例には繰り返し現れるパターンがあります。GoogleはSIMDやアセンブリを含まない小さなライブラリを選び、C ABI（バイナリレベルの呼び出し規約）をそのまま維持する置き換え実装を目標にしました。初期の変換後、FFI（言語間の呼び出し境界）のメモリ管理が健全でないという問題が見つかり、専門家がunsafeコードを直接レビューしました。Rukuzuは、既存のC++バックエンドと新しいRustバックエンドが同じ抽象インターフェースを実装するようにし、ビルドオプションでどちらかを選べるようにしました。どちらの事例も、&lt;strong&gt;まず置き換え可能な境界を作り、その境界の背後で新旧の実装を比較&lt;/strong&gt; しています。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
