3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【俺的】COBOL→Java言語移行ガイド(全体構造編)

Last updated at Posted at 2021-09-12

検証環境

COBOL Java
cobc (GnuCOBOL) 3.1.2.0 java 14.0.1 2020-04-14

はじめに

前回の記事では、「なぜマイグレーションが進んでいるのか」「マイグレーションのいいところと課題点」を見ていきました。今回はCOBOLとJavaで、「全体的な書き方でどう変わってくるのか」を書いていこうと思います。

閲覧してほしい方

  • これからCOBOLからオープン系へのマイグレーションに従事する方
  • COBOLとJavaの言語的違いを知っておきたい方
  • COBOL習熟者で、将来オープン言語を触らなければならないがわからない方

COBOL未経験でマイグレーションされる方や、これからCOBOLエンジニアからJavaエンジニアに移る方の駆け出し資料として参考になれば幸いです。

全体構造の比較

まずはCOBOLの全体構造、Javaの全体構造(main)を見てみます。

COBOL

      *--1---------2---------3---------4---------5---------6
       IDENTIFICATION DIVISION.
       PROGRAM-ID. EXAMPLE.
       ENVIRONMENT    DIVISION.
       DATA           DIVISION.
       PROCEDURE      DIVISION.
       MAIN           SECTION.
       MAIN-S.
      * TODO CODE APPLICATION LOGIC HERE
       MAIN-E.
         STOP RUN.

Java(mainクラス)

package com.qiita.zama_8722;

public class Example {

    public static void main(String[] args) {
        // TODO code application logic here
    }
    
}

オープン系言語同士であれば似通ったところが多いと思いますが、COBOLとオープン系言語の場合、全体的な書き方が大きく変わってきます。

1.COBOLには4つのDIVISIONがある

COBOLには

  • DENTIFICATION DIVISION
  • ENVIRONMENT DIVISION
  • DATA DIVISION
  • PROCEDURE DIVISION

があり、それぞれのDIVISIONで何を書かなくてはいけないかが決められています。
詳細はこちらを御覧ください。

例えば、データ項目(変数)はDATA DIVISIONに(その中でもこのモジュールのみで使用すものはWORKING-STORAGE SECTION、呼び出し元モジュールの項目を引き継ぐ場合はLINKAGE SECTIONに)まとめて書く必要がありました。
また、COBOLは古い言語で、入出力がテープの時代でしたので、メインプログラムではENVIRONMENT DIVISIONに、「JCLで定義されたテープ1は入力なのか出力なのか」「そのテープのレイアウトはどうなっているのか」を定義してあげる必要がありました。
しかし、Javaになると、変数の定義は随所で可能になります。メソッドの中で定義すればそのメソッド内でのみ使用可能になり、メソッドの外に書けばそのクラス内で使用可能(クラス変数)になったりします(アクセス修飾子によればクラス外からも使用可能)。また、オープン系言語はテープを使いませんので、ENVIRONMENT DIVISONで定義している内容全体的に不要になります。

2.COBOLはモジュール、Javaはメソッドを呼ぶ

外部のライブラリや基盤機能を使用するにあたって、COBOLとJavaでは呼び出しや値の受け渡しの仕組みが違います。
下位の機能を呼び出したいとき、COBOLはCALL文を使用して下位モジュール自体を呼び出し、呼び出されたモジュールはメインから一通り実行します(つまり、下位モジュールのこのSECTIONだけ実行というのはありません)。

COBOLで外部機能(モジュール)を呼び出す例

メインモジュール

      *--1---------2---------3---------4---------5---------6
       IDENTIFICATION  DIVISION.
       PROGRAM-ID. MAINMODULE.
       ENVIRONMENT     DIVISION.
       DATA            DIVISION.
       WORKING-STORAGE SECTION.
        01 MSG         PIC X(5).
       PROCEDURE       DIVISION.
       MAIN            SECTION.
       MAIN-S.
         PERFORM SUBMODULE.
         DISPLAY MSG.
       MAIN-E.
         STOP RUN.
      *****************************************************
       SUBMODULE       SECTION.
       SUB-S.
         CALL 'SUBMODULE'  USING MSG.
       SUB-E.
         EXIT.

サブモジュール

      *--1---------2---------3---------4---------5---------6
       IDENTIFICATION  DIVISION.
       PROGRAM-ID. SUBMODULE.
       ENVIRONMENT     DIVISION.
       DATA            DIVISION.
       WORKING-STORAGE SECTION.
        01 HELLO       PIC X(5) VALUE 'HELLO'.
       LINKAGE         SECTION.
        01 MSG         PIC X(5).
       PROCEDURE       DIVISION
                       USING MSG.
       MAIN            SECTION.
       MAIN-S.
         MOVE HELLO    TO MSG.
       MAIN-E.
         GOBACK.

一方Javaは、呼び出したいクラスをインスタンス化した上で、呼び出したいメソッドを指定し、呼び出し先クラスは呼び出されたメソッドのみを実行します。ただし、クラス変数等の初期化を行うコンストラクタ(ここではpublic Library())は、インスタンス化時に自動で実行されます。

Javaで外部クラスを呼び出す例

呼び出し元Javaクラス

package com.qiita.zama_8722;

public class Example {

    public static void main(String[] args) {
        Library lib = new Library();
        String msg;
        msg = lib.getHello();
        System.out.println(msg);
    }
    
}

呼び出し先Javaクラス

package com.qiita.zama_8722;

public class Library {
    
    private String msg;

    public Library() {
        // 初期値は"Hello"
        msg = "Hello";
    }
    
    public String getMsg() {
        return this.msg;
    }
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

COBOL、Javaの処理の流れを図にすると、以下のようになります。

fig1.png

端的にまとめると、COBOLは手続型言語、Javaはオブジェクト指向言語です。ちなみに、それぞれの意味は、

手続き型言語 【procedural language】
手続き型言語とは、プログラミング言語の分類の一つで、コンピュータが実行すべき命令や手続きを順に記述していくことでプログラムを構成する言語。
手続き型言語(procedural language)とは - IT用語辞典 e-Words

オブジェクト指向言語 【object-oriented language】
オブジェクト指向言語とは、プログラミング言語のうち、互いに関連するデータの集合とそれらに対する手続き群をひとまとめにした「オブジェクト」(object)をプログラムの基本的な構成単位として扱うことができるもの。
オブジェクト指向言語(object-oriented language)とは - IT用語辞典 e-Words

です。

3.COBOLとJavaの値の受け渡し方の違い

上記の図でも少し説明を入れていますが、COBOLはモジュール間で値を受け渡しするとき、呼び出し元はCALL文の後ろにUSING句を記載し、そこに呼び出し先モジュールに渡したい項目(もしくはCOPYレイアウト)を記載します。呼び出し先では、LINKAGE SECTIONPROCEDURE DIVISIONUSING句に受け取る項目(もしくはCOPYレイアウト)を記載します。実行結果の返却も渡されたCOPYレイアウトに入れることによって、呼び出し元モジュールでUSING句に記載したCOPYレイアウトに結果が入ります。

Javaの場合、「値が返ってくるメソッド」「値が返ってこないメソッド」の2つがあります。
「値が返ってくるメソッド」は、メソッド名の前に「返す値の型」を記載し、返す値はreturn文に記載します(先程の呼び出し先JavaクラスのgetMsg()がまさにそうです)。
一方、「値が返ってこないメソッド」は、メソッド名の前にvoidを記載します。voidと記載すれば、そのメソッドにreturn文は書きませんので、返却値がありません。

まとめ

ここまで、COBOLとJavaで、全体的な構造や外部機能の呼び出し方がどう違うのかをざっくり見てきました。
次回は、項目の定義方法や基本文法の書き方の違いを見ていこうと思います。

続き→基本文法編

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?