COBOL→Javaマイグレーションへの布石

## COBOLをJavaに変換する
COBOLからJavaへのプログラム変換を具体例を挙げながら
変換して行こうと思います。

今回は秀和システムの「開発で役立つCOBOLプログラミング入門」の確認問題のプログラムをカスタマイズしたものを、Javaに変換するとどうなるか見ていこうと思います。

まずはCOBOLプログラムの方、実際に本に掲載されているプログラムを一部カスタマイズして変更しています。
```Main03.cbl

       IDENTIFICATION         DIVISION.
       PROGRAM-ID.            Main03.
       DATA                   DIVISION.
       WORKING-STORAGE        SECTION.
       01  カウンタ           PIC 9(2).
       01  年齢               PIC 9(2).
       PROCEDURE              DIVISION.
       対象抽出               SECTION.
      *
           PERFORM 初期化処理.
      *
           PERFORM 主処理.
      *
           STOP RUN.
      *
      *************************************************
       初期化処理             SECTION.
      *************************************************
      *
           INITIALIZE カウンタ.
      *
       初期化処理-EX.
       EXIT.
      *
      *************************************************
       主処理             SECTION.
      *************************************************
      *
           PERFORM 10 TIMES
             DISPLAY "年齢:" WITH NO ADVANCING
             ACCEPT 年齢
      *
             IF 年齢 < 10 OR >= 30 AND <= 39 OR = 44 OR
                = 55 OR >= 75
               THEN
                 ADD 1 TO カウンタ
               ELSE
                 CONTINUE
             END-IF
           END-PERFORM.
           DISPLAY "カウンタ:" カウンタ.
      *
       主処理-EX.
       EXIT.
      *

```

## どのようにJavaに変換するか
```Main03.cbl
       DATA                   DIVISION.
       WORKING-STORAGE        SECTION.
       01  カウンタ           PIC 9(2).
       01  年齢               PIC 9(2).

       PERFORM 10 TIMES
             DISPLAY "年齢:" WITH NO ADVANCING
             ACCEPT 年齢
```
まず作業場所節とPERFORMを10回行うところをmainメソッドで
for文を使い、10回までループ処理させるようにしましょう。
回数が決まっているループ処理にはfor文使うのが有効です。
ここでループ処理に使うのは変数をiを定義します。
```Main03.java
public class Main03 {
	public static void main(String[] args) {
		int i, j = 0;
		for (i = 1; i <= 10; i++) { 
			System.out.print("年齢:");
			int age = new java.util.Scanner(System.in).nextInt();
```
次にDISPLAY "年齢:" WITH NO ADVANCINGのJavaでの実装
System.out.print("年齢:");を使うと後続のScannerクラスと合わせて表示されます。

## 次にIF文の実装
```Main03.cbl
 　          IF 年齢 < 10 OR >= 30 AND <= 39 OR = 44 OR
                = 55 OR >= 75
               THEN
                 ADD 1 TO カウンタ
               ELSE
                 CONTINUE
             END-IF
```
```Main03.java
            if(age < 10 || age >= 30 && age <= 39 ||
			   age == 44 || age == 55 || age >= 75 ) {
			   j++; } else { continue;
			}
```
今回COBOLでのカウンタがJavaでは変数jにあたります。

論理演算子は次の様になります。
<table>
  <caption>論理演算子相関表</caption>
  <thead>
    <tr>
      <th>条件</th> <th>COBOL</th> <th>Java</th>
    </tr>
  </thead>
  <tr>
    <td> AまたはB </td> <td>A OR B</td> <td>A || B</td>
  </tr>
  <tr>
    <td> AかつB </td> <td>A AND B</td><td>A && B</td>
  </tr>
  
</table>

ADD 1 TO カウンタの部分はj++になります。

補足ですが仮にADD 2 TO カウンタならj += 2とかになります。

## Java全体としてのプログラムとしては以下になります。
```Main03.java
public class Main03 {
	public static void main(String[] args) {
		int i, j = 0;
		for (i = 1; i <= 10; i++) { 
			System.out.print("年齢:");
			int age = new java.util.Scanner(System.in).nextInt();
			if(age < 10 || age >= 30 && age <= 39 ||
			   age == 44 || age == 55 || age >= 75 ) {
			   j++; } else { continue;
			}
		}
		System.out.println("カウンタ" + j);
	}
}
```
for文のブロックが終わる直後にカウンタを表示させます。
COBOLでも以下の様にEND-PERFORMの直後にDISPLAY文をいれてカウンタを表示させています。
```Main03.cbl
           PERFORM 10 TIMES
             DISPLAY "年齢:" WITH NO ADVANCING
             ACCEPT 年齢
      *
             IF 年齢 < 10 OR >= 30 AND <= 39 OR = 44 OR
                = 55 OR >= 75
               THEN
                 ADD 1 TO カウンタ
               ELSE
                 CONTINUE
             END-IF
           END-PERFORM.
           DISPLAY "カウンタ:" カウンタ.
```

## 実行結果
2つ同じように年齢をキーボードから受け入れていって同じ結果に
なっているのがお分かりいただけたと思います。
```Main03.cbl実行結果
$ ./Main03
年齢:9
年齢:10
年齢:29
年齢:30
年齢:39
年齢:40
年齢:44
年齢:55
年齢:74
年齢:75
カウンタ:06
```
```Main03.java実行結果
$ java Main03
年齢:9
年齢:10
年齢:29
年齢:30
年齢:39
年齢:40
年齢:44
年齢:55
年齢:74
年齢:75
カウンタ6
```

## 最後に
今回COBOLからJavaに変換しましたが、実行結果も同じ結果になり、
それほど難しくなく、マイグレーション出来たのがお分かりいただけたと思います。

今後も何かCOBOLからJavaに変換するプログラムの企画を考えています。

最後までご覧いただきありがとうございました!

***参考文献***
秀和システム 開発で役立つCOBOLプログラミング入門