ある意味最近熱いCOBOLに触れてみる

![z002_pic001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615941/28a60d13-3cdf-bad9-8168-87fc823d4b01.jpeg)


こちらは[システムアイアドベントカレンダー](https://qiita.com/advent-calendar/2024)13日目の記事です。

## 概要
みなさん、COBOLという言語をご存知でしょうか。
1959年に開発された言語であり、「Common Business Oriented Language」（共通事務処理用言語）というのが名前の由来のようです。

引用：https://ja.wikipedia.org/wiki/COBOL

システム開発黎明期に利用された言語で、主に事務処理システムなどに使用されています。
この歴史のながーい言語がなぜ最近熱いのかというと、COBOLで開発されたシステムの改修が求められて始めているからですね。

Javaなど別の言語でシステムを再構築したいが、COBOLの仕様を把握している人が少ない。
そのため改修が難航しているといったケースがよくあるそうです。

少し前に全銀システムという銀行の通信処理で障害が発生したニュースを覚えていますか？
全銀システムもCOBOLで開発されており、その改修の途中で発生した不具合が障害の原因の可能性もあるとのことでした。

ということで、COBOLをマスターすればでっかいシステムの改修案件に携わるかもしれない！
なんて軽い気持ちで簡単に基礎を学んでみることにしました。（←大規模システムをなめるな）
ちょっとでも興味持ってもらえればと思います。

## 開発環境
こういうのは実行環境から構築するのが大事だったりするのですが
今回は割愛してブラウザ上でコードを実行できるツールを使用しました。

※今回使用したブラウザツール
https://paiza.io/ja

いくつか簡単な処理を実装してみようと思います。

## 基本処理実行例

### ・Hello World
```java
IDENTIFICATION DIVISION.
program-id. Hello.
procedure division.

display "Hello, World!".
STOP RUN.
```
まずはおなじみHello Horld表示。
最初の三行はプログラムを実行するためのいわゆるおまじないのようですね。

![57c8351d54c2a94a72ba5aff0478a6a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615941/f6fa0d6e-e7eb-1033-7605-9e751c9fa6cb.png)

これでHello, World!が表示できました。

### ・変数宣言、ループ文
```java
IDENTIFICATION DIVISION.
program-id. Loop.
data division.
working-storage section.
01 num PIC 9(3).
01 total-num PIC 9(4).
01 num-max PIC 9(3) values 100.
procedure division.

PERFORM varying num from 1 BY 1 until num > num-max
    ADD num TO total-num
END-PERFORM
display total-num
STOP RUN.
```

数字を1から100までループさせ、足した結果を表示させるプログラムを作りました。
PERFORMという命令文で数字を指定範囲内でループさせることができます。
↓実行結果
![e71d591565fbe8abbd65efabfe121ed9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615941/78de367f-e1d0-d319-2887-d9be3283a359.png)

変数の型の記法などは以下を参考にしました。
https://jp-seemore.com/sys/19523/#toc8

### ・フォーム入力
```java
IDENTIFICATION DIVISION.
program-id. Input-Form.
data division.
working-storage section.
01 input-str PIC X(10).
01 input-date PIC 9(6).
procedure division.

ACCEPT input-str FROM CONSOLE.
ACCEPT input-date FROM DATE.
DISPLAY input-date "：" input-str "が入力されました！".
STOP RUN.
```

キーボード入力された内容と入力された日付を表示する処理を作成しました。

![cbd2e2444eb3c2cd080a7ea05b1a6f51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615941/e97ebe13-6b30-fa69-dd0f-2e1754494336.png)
入力した文字と実行日（6桁）が表示されました。

### ・GO TO文
```java
IDENTIFICATION DIVISION.
program-id. Input-Form.
data division.
working-storage section.
procedure division.

GO TO jump-program.
DISPLAY "ここの処理は実行されない！".

jump-program.
DISPLAY "ここまで処理が飛ばされちゃうう".
STOP RUN.
```
おそらくこの言語の鬼門。
GO TO {ラベル名}と記述するとラベル名が書かれたところまで処理が飛ばされる処理です。

上記実行すると1つ目のDISPLAY文が実行されませんでした。
![247242602c97a09574e692afd90fab02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615941/50ea9744-1536-f9dd-1ad6-c68650f2e780.png)

大規模なシステムになればなるほどGO TO文が多く使われ、非常に難解なコード（スパゲティコード）になっている可能性がありそうですね。

## まとめ
基本的な処理をいくつか学んでみましたが、プログラム自体は読みやすくプログラミング＝とっつきにくいというイメージの人も触れやすい言語だと思いました。古くから使われているのも納得です。
しかし読みやすい反面、言語の欠点としてもよく聞く冗長性も非常に感じました。簡単な計算処理でもとても長い処理になってしまいますね。

もう一点はやはり最後に挙げたGOTO文でしょうか。
大規模なシステム、歴史が長いシステムになればなるほどGOTO文が大量発生している可能性がありますね。
改修案件＝これらと向き合っていく作業になるのかもしれません。骨が折れそうです。

それでも銀行や行政などの国に関わるような大きな案件やってみたい！という方はぜひ、COBOLをマスターしてみてはいかがでしょうか。