【俺的】COBOL→Java言語移行ガイド（基本文法編）

## 検証環境
|COBOL|Java|
|:---:|:---:|
|cobc (GnuCOBOL) 3.1.2.0|java 14.0.1 2020-04-14|

## はじめに
[前回の記事](https://qiita.com/zama_8722/items/544e049fa7746e3f4ce2)では、「全体構造から見たCOBOLとJavaの違い」を見ていきました。今回はCOBOLとJavaで、「基本文法がどのように変わってくるのか」を書いていこうと思います。最終回です。

### 閲覧してほしい方（前編より）
* これからCOBOLからオープン系へのマイグレーションに従事する方
* COBOLとJavaの言語的違いを知っておきたい方
* COBOL習熟者で、将来オープン言語を触らなければならないがわからない方

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

## １．データID ⇔ 変数
Java等オープン言語でいう変数、COBOLでいうデータIDの定義方法は、根本的な考えから違います。

まずそもそも、COBOLでは、好きな箇所でデータIDの定義はできません。使いたいデータIDは、`DATA DIVISION`の`WORKING-STORAGE SECTION`で定義しなければなりません。

```:COBOL
      *--1---------2---------3---------4---------5---------6
       DATA            DIVISION.
       WORKING-STORAGE SECTION.
        01 VARIABLE    PIC X(5).
```

この場合、`01 VARIABLE    PIC X(5).`がデータ名定義で、「レベル01で`VARIABLE`というデータ名をXタイプ5桁で定義」を意味します。データ名に関して詳しいことについては、[こちら](https://qiita.com/zama_8722/items/adf22305cbd9033dc87e)をご覧ください。
しかしJavaの場合、変数は使用したいとき、使用したい場所で定義することができます。記法は以下のとおりです。

```java:Java
public static void main(String[] args) {
    // mainメソッドで使用可能なint型variableを定義
    int variable;
}
```

## ２．`IF` ⇔ `if`
`if`においては、COBOLとJavaで記法が似ている上、考え方はどちらも同じです。

```:COBOL
      *--1---------2---------3---------4---------5---------6
         IF    CONDITION
             THEN
                 DISPLAY 'CONDITION IS TRUE.'
             ELSE
                 DISPLAY 'CONDITION IS FALSE.'
         END-IF.
```

```java:Java
if (condition) {
    System.out.println("Condition is true.");
} else {
     System.out.println("Condition is false.");
}
```

どちらも`condition`が`true`のときに、上側のロジックが走ります。
COBOLのほうが、どちらかといえばVB寄りの記法です。
ただし、「かつ」や「または」といった論理演算子については、COBOLとJavaでは違いがあります。

|言語|COBOL|Java|
|:---:|:---:|:---:|
|かつ|`AND`|`&&`|
|または|`OR`|`\|\|`|

## ３．`EVALUATE` ⇔ `switch`
基本的な使用方法は、COBOLとJavaではあまり変わりません。

```:COBOL
      *--1---------2---------3---------4---------5---------6
         EVALUATE EXPRESSION
             WHEN 1
                DISPLAY 'EXPRESSION IS 1'
             WHEN 2
                DISPLAY 'EXPRESSION IS 2'
             WHEN OTHER
                DISPLAY 'EXPRESSION IS NOT 1 AND 2'
         END-EVALUATE.
```

```java:Java
switch(expression) {
    case 1:
        System.out.println("expression is 1");
        break;
    case 2:
        System.out.println("expression is 2");
        break;
    default:
        System.out.println("exrepssion is not 1 and 2");
        break;
}
```

ただし、COBOLでは使用てきていた以下の記法は使用できません。

* `EXPRESSION`を`TRUE`として、`WHEN`に式を書く方法

```
      *--1---------2---------3---------4---------5---------6
         EVALUATE TRUE
             WHEN EXPRESSION = 1
                DISPLAY 'EXPRESSION IS 1'
             WHEN EXPRESSION = 2
                DISPLAY 'EXPRESSION IS 2'
             WHEN OTHER
                DISPLAY 'EXPRESSION IS NOT 1 AND 2'
         END-EVALUATE.
```

* 2つ以上の項目の同時比較
* `ANY`を使用した判定

```
      *--1---------2---------3---------4---------5---------6
         EVALUATE EXPRESSION1  EXPRESSION2
             WHEN 1            1
                DISPLAY 'EXPRESSION1 IS 1'
                DISPLAY 'EXPRESSION2 IS 1'
             WHEN 2            ANY
                DISPLAY 'EXPRESSION1 IS 2'
                DISPLAY 'EXPRESSION2 IS ANY'
             WHEN OTHER
      *--       EXREPSSION2 ﾊ ANYﾃﾞｶﾅﾗｽﾞ ｲｯﾁｽﾙ
                DISPLAY 'EXPRESSION1 IS NOT 1'
         END-EVALUATE.
```


## ４．`PERFORM VARYING UNTIL` ⇔ `for`

COBOLとJavaでは、記法が結構変わってきます。
また、COBOLでは終了条件を記載しますが、Javaでは継続条件を記載します。

```:COBOL
      *--1---------2---------3---------4---------5---------6
      *-- 10ｶｲ LOOP
      *-- I ﾊ 1　ｶﾗ 1 ｽﾞﾂ ﾌﾔｼﾃ I > 10 ﾆ ﾅﾙﾏﾃﾞ
         PERFORM VARYING I FROM 1 BY 1
           UNTIL I > 10
             DISPLAY 'LOOP:' I
         END-PERFORM.
       MAIN-E.
         STOP RUN.
```

```java:Java
// iは1から1ずつi++でインクリメントして、i <= 10の間
for (int i = 1; i <= 10; i++) {
    System.out.println("Loop:" + i);
}
```

## ５．`PERFORM UNTIL` ⇔ `while`

結局のところ、COBOLでループを使用するときは、`PERFORM`です。
`UNTIL`のみ残すことで、オープン言語における`while`と同じになります。

```:COBOL
      *--1---------2---------3---------4---------5---------6
         PERFORM UNTIL I > 10
           DISPLAY  'LOOP:' I
           ADD 1  TO I
         END-PERFORM.
```

```java:Java
int i = 1;
while (i <= 10) {            
    System.out.println("Loop:" + i);
    i++;
}
```

## 最後に

ここまでCOBOLとJava（オープン系言語）の比較をしてきました（後半なぐり書きみたいになりましたが…）。
もちろん、COBOLとJavaの違いなんて、こんなものではありません。あくまで基礎の一部を書いたまでになります。

ですが、この3シリーズ（[導入](https://qiita.com/zama_8722/items/2e9f82a77c9bebfe12a8)・[構造編](https://qiita.com/zama_8722/items/544e049fa7746e3f4ce2)・本編）で、マイグレーションに従事する方やこれから業務がCOBOL⇔オープンに変わる方に、少しでも支えになれば幸いです。

以上で【俺的】COBOL→Java言語移行ガイドを全編終了します。ありがとうございました。