COBOLの基本の書き方

# COBOL入門のきっかけ

地方での未経験エンジニア転職で内定をいただいた企業のシステムがCOBOLで作られていたため、学習を始めた。

手続き型の言語で、冗長になってしまうが可読性は高く、数字の処理が早く正確のため金融系のシステムで現在でもよく使われている面白い言語。

内定企業様のシステムも請求書や費用の計算をする会計用のシステム。

# なにはともあれまずは体験

## 環境構築

わたしは現在Windowsを利用しています。Macについては[MacにCobolを入れていじってみた話](https://qiita.com/yhinoz/items/125ff9809f74f5890a33)の記事などを参考にしてみてください。

とりあえずコードを動かしたいのでIDEをインストールします。

OpenCobolIDEという、OpenCobol専用みたいなIDEを入れるだけでCOBOLのコーディング・実行ができます。

[Download project files](https://launchpad.net/cobcide/+download)

## さっそくコーディング

IDEインストールしたらすぐにコード打てました。

シンプルで見やすい。

## **COBOL(コボル)プログラムの書き方**

COBOLは、大きく分けて4つの部で構成されています。それぞれの部は「見出し」があります。

プログラムは「見出し部（IDENTIFICATION DIVISION）」から始まり、「環境部（ENVIRONMENT DIVISION.）」、「データ部（DATA DIVISION）」「手続き部（PROCEDURE DIVISION）」と処理を順に記述していきます。

見出し部以外は省略することが可能で、部（DIVISION）の中にはいくつかの節（SECTION）や段落があります。

```jsx
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO-WORLD.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 こんにちは世界 PIC X(14).
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
            MOVE "HELLO,WORLD!!!" TO こんにちは世界
            DISPLAY こんにちは世界
            STOP RUN.
       END PROGRAM HELLO-WORLD.
```

出力結果

```jsx
HELLO,WORLD!!!
```

### WORKING-STORAGESECTIONに変数を定義。

```jsx
 WORKING-STORAGE SECTION.
       
				01 こんにちは世界 PIC X(14).

　　　　 //こんにちは世界の部分が変数名。
				//01は階層構造を表すレベルナンバー。
				//PICはPICTUREの省略。省略しなくても良い。
				//X(14)は変数のデータ型とデータ長（後述）。
```

### PROCEDURE DIVISION.以下に処理を記載する。

```jsx
  PROCEDURE DIVISION.
       MAIN-PROCEDURE.
　
            MOVE "HELLO,WORLD!!!" TO こんにちは世界
						//MOVE "HOGE" TO 変数名　の形で"HOGE"を変数に代入できる

            DISPLAY こんにちは世界　//DISPLAY 変数名　で出力
```

## 簡単な足し算をしてみる(ADD~TO句)

前述した4つの部（ディビジョン）と節（セクション）がわかりやすいようにコメント入れてます。

ちなみにCOBOLのコメントは7列目を**`*`**にするか文中であれば`***>**`でコメントにできます。

```jsx
      //見出し部
       IDENTIFICATION DIVISION.
      //ファイル名
       PROGRAM-ID. ADD_SAMPLE.
       
      //データ部 
       DATA DIVISION.
      //作業場所節
       WORKING-STORAGE SECTION.
       01 WORK-AREA.
           03 WORK-GROUP-1.
               05 WORK-NUM-1 PIC 9(3).
               05 WORK-NUM-2 PIC 9(3).
           03 WORK-SUM PIC 9(3).
          //後述の計算で必要な変の定義
           03 WORK-SUB PIC 9(3).
           03 WORK-MUL PIC 9(5).
           03 WORK-DIV PIC 9(1).　
      //手続き部
       PROCEDURE DIVISION.
      
      //メインセクション 
       MAIN SECTION.
       
            //数値を変数に設定するMOVE句
            MOVE 100 TO WORK-NUM-1.
            MOVE 200 TO WORK-NUM-2.
            
            //WORK-SUMに加算した結果を代入するADD句
            ADD WORK-NUM-1 WORK-NUM-2 TO WORK-SUM
            
            //結果を出力するDISPLAY句
            DISPLAY "TOTAL:"WORK-SUM
            STOP RUN.
       END PROGRAM ADD_SAMPLE.
     **//出力結果
　　　TOTAL:300**
```

### 減算はSUBTRACT~FROM句、乗算はMULTIPLY~BY句、除算はDIVIDE~BY句を使う

```jsx
      **//減算** 
						//SUBTRACT 減算する変数 FROM 減算対象変数 GIVING 代入する変数
						//WORK-NUM-2からWORK-NUM-1の値を引いた値がWORK-SUBに再代入される
            SUBTRACT WORK-NUM-1 FROM WORK-SUB
            
            //結果を出力するDISPLAY句
            DISPLAY "TOTAL SUB:"WORK-SUB
　　　**//出力結果
　　　TOTAL:100
************************************************************
　　　//乗算**
            //MULTIPLY 変数A BY 変数B GIVING 結果を代入する変数
            MULTIPLY WORK-NUM-1 BY WORK-NUM-2 GIVING WORK-MUL
            
            //結果を出力するDISPLAY句
            DISPLAY "TOTAL MUL:"WORK-MUL
      **//出力結果
　　　TOTAL:20000
************************************************************
			//除算**
　　　　MAIN SECTION.
       
            //数値を変数に設定するMOVE句
            MOVE 100 TO WORK-NUM-1.
            MOVE 200 TO WORK-NUM-2.
          
            //DIVIDE 変数A BY 変数B GIVING 結果を代入する変数
            DIVIDE WORK-NUM-2 BY WORK-NUM-1 GIVING WORK-DIV
            
            //結果を出力するDISPLAY句
            DISPLAY "TOTAL DIV:"WORK-DIV
      **//出力結果
　　　TOTAL:2J**
```

## 読みやすいがやはり長い

変数を定義する箇所と処理の箇所が明確に分かれていてるので慣れると読みやすくはなるのだが、コードが長くなってくると大変そう。。。

JavaScriptなら3行。。。

```jsx
const a = 100
const b = 200

console.log = a+b
```

特に変数名はわかりやすくして置かないと、後々PS

むしろ新規開発はほぼなくなっているから、すでにあるコードを読み解いていくのは骨が折れそう。

ただ個人的にはわかりやすいし、嫌いではないので今後も学習頑張っていきます！

## 付け足し

ちなみに四則演算は文章的でなく最近のプログラミング的な書き方もあるそうです。

```jsx
加算 COMPUTE WORK-SUM = WORK-NUM-1 + WORK-NUM-2
減算 COMPUTE WORK-SUB = WORK-NUM-2 - WORK-NUM-1
乗算 COMPUTE WORK-MUL = WORK-NUM-1 * WORK-NUM-2
除算 COMPUTE WORK-DIV = WORK-NUM-2 / WORK-NUM-1
```

こっちの方が見慣れた感じでよさそうです。

参考文献

****[ふとCOBOL入門してみたいなと思った人向けCOBOL入門](https://qiita.com/FPC_COMMUNITY/items/4e4fbbdb70e6b79b5729)****