2026年もCOBOLは現役。だからブラウザだけで動くCOBOL→Java変換ツールを作った
「COBOLはもう終わった」なんて、とんでもなかった
正直、自分もずっとそう思っていた。
でも調べてみたら、現実はまったく逆だった。
- 世界のATM取引の95%はCOBOLで処理されている
- 毎日3兆ドル相当の金融取引がCOBOLシステムを通っている
- 世界に800億行以上のCOBOLコードが現在も稼働中(Micro Focus調査)
- COBOLは毎年新たに15億行書かれている
「化石」どころか、金融・保険・行政の基幹を今も支えてい本当に問題なのは、コードではなく人材だ。
では何が問題か。人材だ。
COBOLを書けるエンジニアの平均年齢は50代後半。2030年代には大量引退が見込まれている。その前に移行できるか——これが今、大企業のIT部門が直面している最大の課題になっている。
COBOL移行はなぜ難しいのか
Javaへの移行が難しい理由は主に3つある。
1. 構文の違いが根本的すぎる
WORKING-STORAGE SECTION.
01 W顧客コード PIC X(07).
01 W金額 PIC 9(09) VALUE ZERO.
PROCEDURE DIVISION.
IF W金額 > 500000
MOVE '高額顧客' TO Wメッセージ
PERFORM 3000-高額処理
END-IF.
これをJavaに変換するには、PIC句の型解析、段落→メソッドのマッピング、EXEC SQLのJDBC変換など、単純な文字列置換では対応できない処理が必要になる。
2. 日本語COBOLという“日本独自の壁”
日本のCOBOLシステムには、変数名やコメントが日本語で書かれているケースが非常に多い。既存の欧米製ツールはほぼ対応していない。
3. 10万〜100万行規模のコードを人力でやると数年かかる
大手銀行の基幹系は平均して数百万行規模。エンジニアが手で書き直すと何年もかかる上、仕様を知っているCOBOLエンジニアがいなくなっていく。
そこでブラウザだけで動く変換ツールを作った
特徴:
- インストール不要。ブラウザで開いてコードを貼るだけ
- ソースコードがサーバーに一切送信されない(全処理がブラウザ内で完結)
- 完全オフライン動作対応 — HTMLファイルを1枚ダウンロードすれば、ネットワーク非接続環境でもそのまま動く。金融機関・官公庁のようにPCがインターネットに繋がっていない環境でも使用可能
- 双方向変換対応(COBOL→JavaだけでなくJava→COBOLも)
- .cbl / .cob ファイルのドラッグ&ドロップ対応
- Shift_JIS自動判定(日本語COBOL対応)
対応構文:
| カテゴリ | 対応内容 |
|---|---|
| データ定義 | WORKING-STORAGE / LINKAGE SECTION、PIC句全型、OCCURS配列、Level77/88 |
| 制御構文 | IF/ELSE/END-IF、EVALUATE(TRUE対応)、PERFORM VARYING/TIMES/THRU |
| 演算 | COMPUTE(ROUNDED)、ADD/SUBTRACT/MULTIPLY/DIVIDE(GIVING/REMAINDER対応) |
| SQL | EXEC SQL SELECT INTO / INSERT / UPDATE / DELETE / COMMIT / ROLLBACK / CURSOR |
| 文字列 | MOVE(複数転送先)、STRING、INSPECT REPLACING、INITIALIZE |
| その他 | REDEFINES(コメント化)、MOVE CORRESPONDING(TODO化)、SECTION対応 |
実際に変換してみる
入力(COBOL)
IDENTIFICATION DIVISION.
PROGRAM-ID. KOKYAKU01.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W顧客コード PIC X(07).
01 W顧客名 PIC X(30).
01 W金額 PIC 9(09) VALUE ZERO.
01 W税率 PIC 9(02)V99 VALUE ZERO.
01 W合計金額 PIC 9(09) VALUE ZERO.
PROCEDURE DIVISION.
1000-初期処理.
MOVE SPACES TO W顧客コード.
MOVE ZEROS TO W金額 W合計金額.
MOVE 0.10 TO W税率.
2000-メイン処理.
MOVE '1234567' TO W顧客コード.
COMPUTE W合計金額 ROUNDED = W金額 * W税率.
IF W合計金額 > 500000
MOVE '高額顧客' TO W顧客名
ELSE
MOVE '通常顧客' TO W顧客名
END-IF.
出力(Java)
import java.sql.*;
import java.math.*;
/**
* COBOLから自動変換されたJavaクラス
* 変換ツール: COBOL → Java Converter v0.8.0
*/
public class Kokyaku01 {
// ===== WORKING-STORAGE SECTION =====
private String w顧客コード = ""; // [変数] W顧客コード PIC X(07) → 文字列(最大7文字)
private String w顧客名 = ""; // [変数] W顧客名 PIC X(30) → 文字列(最大30文字)
private int w金額 = 0; // [変数] W金額 PIC 9(09) → 整数(最大9桁)、初期値=0
private double w税率 = 0.0; // [変数] W税率 PIC 9(02)V99 → 小数を含む数値、初期値=0
private int w合計金額 = 0; // [変数] W合計金額 PIC 9(09) → 整数(最大9桁)、初期値=0
// ===== PROCEDURE DIVISION =====
public void w1000_初期処理() throws SQLException {
w顧客コード = ""; // [代入] 空白をW顧客コードにセット
w金額 = 0; // [代入] ゼロをW金額にセット
w合計金額 = 0; // [代入] ゼロをW合計金額にセット
w税率 = 0.10; // [代入] 0.10をW税率にセット
}
public void w2000_メイン処理() throws SQLException {
w顧客コード = "1234567"; // [代入]
w合計金額 = Math.round(w金額 * w税率); // [計算・四捨五入]
// [条件分岐] もし W合計金額 > 500000 ならば
if (w合計金額 > 500000) {
w顧客名 = "高額顧客";
} else {
w顧客名 = "通常顧客";
}
}
}
PROGRAM-IDからクラス名(Kokyaku01)が自動生成され、段落がメソッドに変換される。日本語変数名もJavaの識別子として維持される。
変換精度スコアの仕組み
ツールには変換後に4指標のスコアが表示される。
| 指標 | 内容 |
|---|---|
| 変換成功率 |
[未変換]行の割合から算出 |
| 構文カバレッジ | 入力に含まれる構文種類数(7種類で評価) |
| 変数解決率 | globalVarsで解決できた変数参照の割合 |
| コメント付与率 |
// [...]コメント付きコード行の割合 |
これにより「どこが変換できていないか」が一目でわかる。
自動変換でカバーできないもの
正直に言うと、このツールだけで移行が完結するわけじゃない。
- COPY文(外部定義ファイルの展開)
- 複雑なネストIF(10段以上)
- 業務ロジックの意味的な変換
- 画面定義(CICS)・JCL
自動変換はあくまで「下書き生成」。本番移行には構造的なレビューとリファクタリングが必要だ。
技術的な実装について
JavaScriptで書いたブラウザ内変換エンジン(約2000行)。主な処理フロー:
-
convert()— COBOL/Javaの入力を受け取り分岐 - WS解析 — PIC句をパースして
globalVarsマップに登録 - 段落収集 —
SECTION・予約語を除いた行をパラグラフ判定 -
convertProcLines()— 再帰的に処理行をJava構文に変換 -
convertSQL()— EXEC SQLブロックをJDBC呼び出しに変換 -
calcScore()— 4指標を計算してスコアカードを描画
SQLはSELECT INTOの:ホスト変数を?プレースホルダに置換しPreparedStatementを生成する。
最後に
COBOLが「終わった言語」だという認識は間違っている。むしろ今が移行の最後のチャンスに近い。担当者が引退する前に、コードの意味を理解している人間が残っている間に動けるかどうかが鍵になる。
このツールを試してみて、「うちのCOBOLはもっと複雑だ」と思ったら相談してほしい。
COBOL移行の無料相談はこちら → COBOL BRIDGE
ツールはOSS公開予定。スターもらえると励みになります。
GitHub: cobol-bridge/cobol-bridge