Experience on Automatically Converting a C++ Monolith to Java EE

この論文は、80 万行の C++ モノリスを Java EE(WildFly)へ移行する際のアプローチや課題解決、および継続的な C++ 開発に対応するための Clang ツールを用いた自動変換手法についての実践経験を報告したものである。

Andre Vehreschild, Lexi Pimenidis

公開日 Tue, 10 Ma
📖 1 分で読めます☕ さくっと読める

Each language version is independently generated for its own context, not a direct translation.

1. プロジェクトの背景:なぜこんなことをしたのか?

ある物流会社は、社内のあらゆるシステム(倉庫管理、印刷、輸送最適化など)を、昔ながらの**「C++」**という言語で動いていました。しかし、これには 3 つの問題がありました。

  • 規模が巨大: 80 万行ものコード(本 800 冊分くらいの量)。
  • 人材不足: C++ の職人は減り、Java の職人は多い。
  • 開発の継続: 変換中に、新しい機能追加やバグ修正も C++ 側で続けなければならない。

そこで、「手作業で書き直すのは無理だ」と判断し、**「ボタン一つで C++ を Java に変える自動ツール(トランスパイラ)」**を作ることにしました。

2. 変換ツールの仕組み:「翻訳ロボット」の正体

このツールは、**「Clang」**という C++ の文法を完璧に理解する「頭脳」を使って動いています。

  • 読み取り: C++ のコードを「構文木(AST)」という、木のような図に変換して理解します。
  • 変換: その図を元に、Java のコードを生成します。
  • テンプレート: 「C++ のこの部分は、Java ではこう書く」という**「型紙(テンプレート)」**を大量に持っています。例えば、C++ の「文字列結合」は、Java では「StringBuilder」という道具を使う、といったルールです。

3. 直面した「3 つの大きな壁」と解決策

C++ と Java は似ているようで、根本的に違う部分があり、ここが最大の難所でした。

壁①:「複数の親を持つ」問題(多重継承)

  • C++ の状況: 一つのクラスが、複数の親クラスから能力を引き継げる(例:「犬」が「動物」かつ「ペット」の両方の性質を持つ)。
  • Java の壁: Java は「一つの親しか持てない」ルールです。
  • 解決策(変身術):
    • データベース関連: 「親になる」のではなく、「道具として持つ」ように変えました(例:「犬は動物だ」→「犬は動物の服を着ている」)。
    • チェーン(命令連鎖)関連: 親から命令を受けるのではなく、**「指揮官(マネージャー)」と「兵士(リンク)」**が交代で命令を渡すように仕組みを変えました。
    • その他: どうしようもない数少ないケースは、人間が手作業で修正し、C++ が変わったらアラートが鳴るようにしました。

壁②:「列挙型(enum)」と「数字」の混同

  • C++ の状況: 「色(赤、青)」という列挙型を、単なる「数字(0, 1)」として扱ったり、逆に数字を無理やり色に変えたりするのが自由でした。
  • Java の壁: Java は厳格で、「数字を勝手に色に変える」ことは許しません。
  • 解決策(変装術):
    • 列挙型を、**「数字を隠し持つ特別なオブジェクト」**として作り変えました。
    • C++ で「赤=0」としていたのを、Java では「赤というオブジェクトの中に 0 が隠れている」という形にし、数字に変換するメソッドを用意しました。これにより、Java の厳格なルールを守りつつ、元の C++ の挙動を再現しました。

壁③:「資源の片付け」(デストラクタ)

  • C++ の状況: 関数が終わると、自動的に「メモリやデータベース接続」などの資源を片付ける(デストラクタ)仕組みがありました。
  • Java の壁: Java には「自動片付け」の仕組みがなく、ゴミ収集(ガベージコレクション)がいつ来るか分かりません。
  • 解決策(契約書):
    • Java には**「Try-with-resources」**という、資源を使うときは「使い終わったら必ず閉じる」と約束する仕組みがあります。
    • ツールは、C++ の「資源を使うクラス」を特定し、自動的にこの「契約書(Try ブロック)」の中に囲むようにコードを書き換えました。

4. 結果:成功への道のり

  • エラーの減少: 変換当初はエラーが山積みでしたが、ツールを改良するにつれて急激に減っていきました。特に「型(数字と文字の区別)」を正しく扱う仕組みを導入した時期に、エラーが劇的に減りました。
  • 最終成果: 80 万行のうち、約 99% 以上は自動変換されました。残った数少ないエラー(約 60 個)は人間が手直しし、無事に Java のサーバー(WildFly)上で動作しました。
  • 継続性: C++ 側で開発を続けながら、変換ツールを回し続けることで、常に最新の Java コードを維持できました。

まとめ

この論文は、**「巨大なレゴ城を、壊さずに別のブロックに作り変える」という不可能に見える挑戦が、「賢い翻訳ロボット」「人間の知恵(ルール作り)」**の組み合わせによって成功したことを示しています。

単なる言語変換ではなく、「建築様式(アーキテクチャ)」そのものを変えるという、非常に高度な工事だったのです。