0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ATM取引の95%が今もCOBOLで動いている事実と、Java移行ツールを作った話

0
Posted at

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エンジニアがいなくなっていく。


そこでブラウザだけで動く変換ツールを作った

COBOL → Java 変換ツール(無料)

特徴:

  • インストール不要。ブラウザで開いてコードを貼るだけ
  • ソースコードがサーバーに一切送信されない(全処理がブラウザ内で完結)
  • 完全オフライン動作対応 — 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行)。主な処理フロー:

  1. convert() — COBOL/Javaの入力を受け取り分岐
  2. WS解析 — PIC句をパースしてglobalVarsマップに登録
  3. 段落収集 — SECTION・予約語を除いた行をパラグラフ判定
  4. convertProcLines() — 再帰的に処理行をJava構文に変換
  5. convertSQL() — EXEC SQLブロックをJDBC呼び出しに変換
  6. calcScore() — 4指標を計算してスコアカードを描画

SQLはSELECT INTO:ホスト変数を?プレースホルダに置換しPreparedStatementを生成する。


最後に

COBOLが「終わった言語」だという認識は間違っている。むしろ今が移行の最後のチャンスに近い。担当者が引退する前に、コードの意味を理解している人間が残っている間に動けるかどうかが鍵になる。

このツールを試してみて、「うちのCOBOLはもっと複雑だ」と思ったら相談してほしい。

COBOL移行の無料相談はこちら → COBOL BRIDGE


ツールはOSS公開予定。スターもらえると励みになります。
GitHub: cobol-bridge/cobol-bridge

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?