【環境構築】COBOLをおためしで触ってみる

# COBOLとは
COBOLは、金融機関などで基幹システムとして使われるイメージがありますが、
- 政府での税金、年金システム
- 医療機関での支払い処理
- 流通業界での在庫管理システム
- 航空・交通分野での予約管理システム

など、幅広い分野で膨大なデータ処理を必要とする場合に使われるそうです。
なんだか大規模な言語でわくわくしませんか？

今回はそんなCOBOLの実行環境を作って、実際にこーどを実行してみたお話です！

# 環境構築
それでは早速環境構築を始めます。COBOLはコンパイル言語なので、まずバイナリファイルにコンパイルするためのコンパイラをインストールします。

:::note info
今回は`Linux/Unix系のOS`を使用している前提で説明していきます。
:::

## Homebrewのインストール

### パッケージのインストール

以下のコマンドをターミナルで実行して、Homebrewをインストールします。
```bash:bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
<br>

### 環境変数にPATHを追加する
正しくインストールができていれば、`Next steps:`というログが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/639c14a1-04ca-4da9-5427-b72f5ac0bbc9.png)
これの、`printf`から始まるコマンドと`eval`コマンドをコピーしてターミナルで実行します。
これで`Homebrew`のインストールが完了しました！

:::note info
### 環境変数`PATH`とは？
よく、PATHを通すなどと聞くことがありますが、これは一体なんなのでしょうか？
簡潔に言えば、`システムがコマンドを探すための場所（ディレクトリ）をリスト化したもの`です。

どゆことやねん！っていう人のためにより簡単に言うと
`ターミナルなどでコマンドとして実行できるようにするために、コマンドを登録するよ！`ってことです。
:::

## コンパイラをインストールする
COBOLのコンパイラには、`GNU COBOL`というものを使用します。
Homebrewから簡単にインストールすることができるのは正直ありがたかったです...

以下のコマンドをターミナルで実行することでインストールできます。
```bash:bash
brew install gnu-cobol
```

これで実行環境のインストールができました！

# おためしコードを書いてみる
実行環境が整ったということで、実際にCOBOLのコードを書いていきたいと思います！
COBOLの拡張子は`.cob`だそうです

なので、以下のファイルをつくってみました
```cob:index.cob
       IDENTIFICATION DIVISION.
       PROGRAM-ID. 銀行システム.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 口座残高            PIC 9(9) VALUE 0.
       01 ユーザー選択          PIC 9 VALUE 0.
       01 取引金額            PIC 9(9).
       01 終了フラグ           PIC X VALUE 'N'.

       PROCEDURE DIVISION.

       メイン手続き.
           PERFORM UNTIL 終了フラグ = 'Y'
               DISPLAY '--- 銀行システム ---'
               DISPLAY '1. 預金'
               DISPLAY '2. 引き出し'
               DISPLAY '3. 残高照会'
               DISPLAY '4. 終了'
               ACCEPT ユーザー選択

               EVALUATE ユーザー選択
                   WHEN 1
                       PERFORM 預金手続き
                   WHEN 2
                       PERFORM 引き出し手続き
                   WHEN 3
                       PERFORM 残高照会手続き
                   WHEN 4
                       MOVE 'Y' TO 終了フラグ
                   WHEN OTHER
                       DISPLAY '無効な選択です。もう一度選んでください。'
               END-EVALUATE
           END-PERFORM.

           DISPLAY 'ご利用ありがとうございました。'.
           STOP RUN.

       預金手続き.
           DISPLAY '預金額を入力してください: '
           ACCEPT 取引金額
           ADD 取引金額 TO 口座残高
           DISPLAY '預金が完了しました。'.

       引き出し手続き.
           DISPLAY '引き出し額を入力してください: '
           ACCEPT 取引金額
           IF 取引金額 > 口座残高
               DISPLAY '残高が不足しています。'
           ELSE
               SUBTRACT 取引金額 FROM 口座残高
               DISPLAY '引き出しが完了しました。'
           END-IF.

       残高照会手続き.
           DISPLAY '現在の残高は: ' 口座残高 '円です。'.
```
このコードは銀行取引のシミュレーション的なことをするコードです！

:::note info
このコード、左側に変なインデントがありますよね？
実はCOBOLは、**カラム位置に意味をもつ形式**を持つプログラミング言語らしいです！

具体的には、
- 1～6カラム: 行番号などが書かれる部分
- 7カラム目: コメント行や継続行の指示に使用
- 8～72カラム: コードの記述領域
- 73カラム以降: コメント領域（古い時代のカードパンチ端末に合わせて）

という仕様があるみたいです...
独特な記述方法ですね...
:::

# おためしコードを実行してみる

いよいよCOBOLのコードを実行します！
先ほども言いましたが、COBOLはコンパイル言語なので、バイナリファイルにコンパイルします！

### コンパイルしよう
以下のコマンドでバイナリファイルにコンパイルできます。
```bash:bash
cobc -x -free index.cob
```

実行すると、`index`というファイルが生成されます。
これがバイナリファイルです。

### 実行してみよう
ではでは、生成したバイナリファイルを実行します。
バイナリなので、そのままバイナリを渡すだけで実行できちゃいます！
```bash:bash
./index
```
これだけで実行できちゃいます！

### 遊んでみる
このコードでは、ターミナルに`1`や`2`など数字を入力すると操作することができます！
遊ぶもなにもないですが､､､

こーどをいじいじして楽しみましょう(?)

# まとめ
今回は金融機関や政府など、大規模なデータ処理を行うところで使用されている言語「COBOL」に触れてみました！
やはり、昔からある汎用性の高い言語は独特なところがあり、面白いですね！

バイナリファイルを含めたCOBOLのコードはGitHubにてみることができます！
https://github.com/minoru-kinugasa-105/learning-cobol