opensource COBOL 4J でできる COBOL to Java 変換とは?【後編】
前編では、COBOLの歴史に触れるとともに、opensource COBOL 4Jについて紹介しました。後編では、opensource COBOL 4J はじめの一歩として、Dockerコンテナを使って COBOL to Java 変換を試す手順を紹介します。
1. おさらい
近年では、DX推進として既存のITシステムのブラックボックス解消やデータの利活用が進められていることに加えて、メーカーのメインフレーム製造終了やCOBOL技術者の減少などの理由から、COBOLシステムをパッケージやJavaに置き換える動きが加速しています。
企業の脱COBOLの事例や計画がニュース記事となることも増えており、一層それが加速している印象があります。
今後、COBOLが新規構築に使われることは減りますが、既存のCOBOLシステムの保守は続きます。最新技術や最新環境ともうまく組み合わせ、複数の言語スキルがある兼任のCOBOL技術者が対応し、適材適所で利用していく動きになると考えられます。
一方で、OSSのCOBOLコンパイラがあります。その一つとしてOSSコンソーシアムが開発するGnuCOBOLやopensource COBOL 4Jなどがあります。
OSSコンソーシアムがOSSのCOBOLコンパイラopensource COBOL 4Jを開発し、Githubにて公開しています。opensource COBOL 4Jは、COBOLをトランスレートして Javaを生成、javacでバイトコードを生成するため、COBOLを Java にマイグレーションすることが可能です。
COBOLを継続されたい、一方でクラウドなどの技術と連携しやすいJavaへの移行を検討するニーズも増えてきた。今回は、COBOL 4Jを活用したJava移行の手順を紹介します。
2. OSSコンソーシアムとは
opensource COBOL 4Jを開発したOSSコンソーシアムは、オープンソース・ビジネスを推進する団体です。その中で様々な部会(IoTや人工知能、開発基盤)があり、基幹システムにおけるOSS化の普及・促進を目指すオープンCOBOLソリューション部会がopensource COBOL 4Jを開発しました。
オープンCOBOLソリューション部会に当社も参加しており、バージョンアップや日本語マニュアルの作成などを積極的に行っています。また、当社ではopensource COBOLへのマイグレーションサービスを提供しています。
3. opensource COBOL 4Jの利用手順
Opensource COBOL 4J 早速OSSコンソーシアムが Docker Hubで公開しているコンテナ を使い、お手元のWindows PCで COBOL to Java 変換を試していきます。
手順1. まずは Docker をインストールする
Docker Desktop for Windows をダウンロードし、Docker Desktop Installer.exe をダブルクリックしてインストールを開始します。インストール後、Dockerアプリケーションを起動します。ステータスバーにクジラのアイコンが表示されれば、Docker Desktopは起動・実行中です。アイコンが赤い場合は、クジラを右クリックして、restartを選択してください。
手順2. opensource COBOL 4J コンテナを作成
Dockerを起動後、コマンドプロンプトを開いて下記コマンドを実行します。
docker run -itd -v /c/Develop/share:/root/share –name cobol4j
opensourcecobol/opensourcecobol4j
opensource COBOL 4J がインストールされたコンテナ cobol4j が作成されます。PCの C:/Develop/share フォルダは、コンテナ内の /root/share にマウントされています。
手順3. サンプルプログラムを作成
C:/Develop/share に HELLO.cbl という名前で下記のサンプルプログラムを作成します。
HELLO.cbl
******************************************************************
IDENTIFICATION DIVISION.
******************************************************************
PROGRAM-ID. HELLO.
AUTHOR. HIROIMON.
DATE-WRITTEN. 2022-07-01.
******************************************************************
DATA DIVISION.
******************************************************************
WORKING-STORAGE SECTION.
01 MY-TEXT PIC X(40).
******************************************************************
PROCEDURE DIVISION.
******************************************************************
MAIN-RTN.
MOVE “HELLO WORLD!” TO MY-TEXT.
DISPLAY MY-TEXT.
STOP RUN.
opensource COBOL 4J がインストールされたコンテナ cobol4j が作成されます。PCの C:/Develop/share フォルダは、コンテナ内の /root/share にマウントされています。
手順4. コンパイルと実行確認
コマンドプロンプトより、下記のコマンドでコンテナ cobol4j を起動してアタッチします。
docker start cobol4j
docker attach cobol4j
※手順2で docker run -itdをした後であれば、docker startは不要です。
アタッチをした後、/root/share に先ほど作成した HELLO.cbl があることを確認します。
# cd /root/share
# ls -1
total 4
-rwxrwxrwx 1 root root 937 Nov 29 09:55 HELLO.cbl
opensource COBOL 4J の cobj コマンドを実行します。このコマンド一発で、COBOL to Java変換による HELLO.java の作成と、その後の javac コマンドの起動が行われ、HELLO.class が生成されます。
# cobj HELLO.cbl
# ls -1
total 36
-rw-r–r– 1 root root 1187 Nov 29 09:59 ‘HELLO$1.class’
-rw-r–r– 1 root root 1187 Nov 29 09:59 ‘HELLO$2.class’
-rw-r–r– 1 root root 1187 Nov 29 09:59 ‘HELLO$3.class’
-rw-r–r– 1 root root 1635 Nov 29 09:59 ‘HELLO$4.class’
-rwxrwxrwx 1 root root 937 Nov 29 09:55 HELLO.cbl
-rw-r–r– 1 root root 5677 Nov 29 09:59 HELLO.class
-rw-r–r– 1 root root 6102 Nov 29 09:59 HELLO.java
# java HELLO
HELLO WORLD!
exit でコンテナから抜けてコマンドプロンプトに戻り、コンテナ cobol4j を停止しました。
# exit
docekr stop cobol4j
そして、Javaプログラムを見てみる
ディレクトリ C:/Develop/share に HELLO.java が生成されています。
下記は、COBOLの手続き部やデータ部の初期化に相当する箇所を抜粋したコードです。COBOLの変数名や手続き部の該当行がコメントで生成されています。COBOLの各命令は、opensource COBOL 4Jランタイムライブラリ(libcobj.jar) が提供する様々なclassに変換されています。このランタイムライブラリのJavaプログラムもOSSで公開されていますので、ブラックボックスはありません。
OSSコンソーシアムやコミュニティでは、処理性能の改善や可読性の向上が議論されています。今後のリリースにも期待です。
HELLO.java
public CobolControl[] contList = {
new CobolControl(0, CobolControl.LabelType.label) {
public Optional
return Optional.of(contList[1]);
}
},
/* <中略> */
/* MAIN-RTN */
new CobolControl(3, CobolControl.LabelType.label) {
public Optional
/* HELLO.cbl:16: MOVE */
{
f_MY_TEXT.moveFrom (c_1);
}
/* HELLO.cbl:17: DISPLAY */
{
CobolTerminal.display (0, 1, 1, f_MY_TEXT);
}
/* HELLO.cbl:18: STOP */
{
CobolStopRunException.throwException (b_RETURN_CODE.intValue());
}
return Optional.of(CobolControl.pure());
}
},
CobolControl.pure()
};
/* <中略> */
public void init()
{
try {
cob_unifunc = null;
b_RETURN_CODE = new CobolDataStorage(4); /* RETURN-CODE */
b_MY_TEXT = new CobolDataStorage(40); /* MY-TEXT */
initAttr();
f_MY_TEXT = CobolFieldFactory.makeCobolField(40, b_MY_TEXT, a_1); /* MY-TEXT */
c_1 = CobolFieldFactory.makeCobolField(12, “HELLO WORLD!”, a_1);
} catch(Exception e) {
e.printStackTrace();
}
}
まとめ
いかがだったでしょうか。今回は、opensource COBOL 4J はじめの一歩として、Dockerコンテナを使って COBOL to Java 変換を試す手順をご紹介しました。
そして、Java移行方式を以下にまとめました。

opensource COBOL 4Jを活用することで、Java変換とCOBOL継続の二刀流が可能となります。Javaエンジニアによるメンテナンスも可能となりますし、OSSで公開されているため、誰でも取得して利用できます。
また、COBOLの業務ロジックを100%再現しているため、Javaでは手間がかかる演算や固定長などのCOBOL文化をJava環境で実装できます。
今後、COBOLを取り巻く現状や、基幹システムのマイグレーションに関する情報などをご紹介していきます。