COBOL VS PHP

初めまして！
エイチームブライズでサイト開発を行っている@aoi_coro_です。

この記事は[エイチームブライズ/エイチームコネクト/エイチーム引越し侍 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hikkoshi) 4日目の記事です。

# 概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253515/50308669-d083-8326-9e30-4c9aba1e596a.png)　**VS**　![image.png](https://qiita-image-store.s3.amazonaws.com/0/253515/cea9d60f-33a0-4d8e-d29c-0c0f36bf7349.png)

熟成された10年物の` COBOL` 使いな私が、転職を機に` PHP` を触るようになったので、
COBOLとPHPのココがいいよね！を簡単に比較紹介してみようと思います。
最初に断っておきますが、個人の主観入りまくりなので、参考程度にしかなりません。
※PHPに関してはまだまだ初心者:beginner:なので、間違っていたらツッコミお願いします！

技術？何それ美味しいの？的な気軽な読み物だと思ってください:cake:

# COBOLとPHPとは

##言語について

詳しくはwikipediaで調べていただいた方がいいですが、簡単に説明します。

* COBOL [[wiki]](https://ja.wikipedia.org/wiki/COBOL)
事務処理用に開発されたプログラミング言語で、
金融業:moneybag:や医療系:hospital:でよく使用されています。（行政:office:でもまだ現役･･･）

* PHP [[wiki]](https://ja.wikipedia.org/wiki/PHP_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))
オープンソースの汎用プログラミング言語で、
サーバーサイドで動的なウェブページ:globe_with_meridians:を作成するのによく使用されています。

##人気について
まずは、この二つの言語がQiitaにはどのくらい投稿されているのか調べてみました。
（2018-12-02時点）

* COBOL
検索結果　211件
記事　43件
フォロワー　31人

* PHP
検索結果　29,516件
記事　13,874件
フォロワー 30,256人

桁が･･･違いすぎる･･･！！
Qiitaには**コボラー**があまりいないのでしょうか、まぁ何となくCOBOL技術者は閉じた世界にいるイメージがあるので納得です。

>COBOL技術者がコボラーと呼ばれるとき、モダンでないプログラミング言語を扱っていることを揶揄するニュアンスを伴っていることがある

･･･らしいですが、私はCOBOLへの**愛**:sparkling_heart:を込めて**コボラー**と呼んでいます。

脱線しました。

もちろん、Qiita以外でもみてみましたが、COBOLよりPHPの方が圧倒的に人気なのは一目瞭然です。
[2018年 人気＆嫌われプログラミング言語トップ25- Stack Overflow](https://news.mynavi.jp/article/20180604-639227/)
[人気プログラミング言語、トップ10](https://www.businessinsider.jp/post-177609)

#COBOLとPHPの記述比較
まずは手始めに世界一有名なプログラムから
## 「Hello World」はPHPがいい！
世界一有名なプログラム「Hello world」をCOBOLとPHPで書いてみます。
（//の後ろは本来の記述ではありません、この記事が読みやすいよう説明用の補足です）

* COBOL

```cobol:qiita&nbsp;hello.cbl
000010 IDENTIFICATION                   DIVISION.  //見出し部
000020 PROGRAM-ID.                      SAMPLE-01. //見出し部（プログラム名）
000030 PROCEDURE                        DIVISION.  //手続き部
000040     DISPLAY "Hello world!".                 //Hello world!を表示
000050     STOP RUN.                               //処理終了
```
（COBOLだとシンタックスハイライトが効かない･･･なんて地味なんだ･･･）

* PHP

```php:qiita&nbsp;hello.php
<?php echo "Hello world!"; ?>　 //Hello world!を表示
```
（PHPはカラフルでいいなぁ）

COBOLで書くと5行も必要ですが、PHPだと1行ですみます。PHP凄い!

##記述方法はPHPがいい！

* COBOL

COBOLはカラム固定形式で記述します。（カラムとは文字数のこと）

1～6カラム目
　「一連番号」 各行を識別するために、6桁の番号を記述することができます。
7カラム目
　「標識領域」 その行の標識を記述します。
8～11カラム目
　「A領域」
12～72カラム目
　「B領域」
A領域およびB領域に、コードを記述します。

* PHP

PHPにはカラム固定形式なんてものはないです。
素晴らしい！文字位置をいちいち考えなくて良いなんて！

記述をそれぞれ詳しく知りたい方はもっといい記事が沢山ありますので、調べてみてください。
この記事の目的はCOBOLとPHPの比較なので、今回は割愛します。

## 計算するならPHPがいい？

例として変数Aを+１してみましょう。

* COBOL

```cobol:qiita&nbsp;add.cbl
000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE-01.
000030 DATA                             DIVISION.  //データ部
000040 WORKING-STORAGE                  SECTION.   //データ部（変数等の定義）
000050 01 A  PIC 9(1).                             //変数Aを1桁の数字タイプで定義
000060 PROCEDURE                        DIVISION.
000070     INITIALIZE A.                           //Aを初期化（数字は0埋め)
000080     COMPUTE A = A + 1.                      //A+1
000090     ADD 1 TO A.                             //A+1
000100     DISPLAY A.                              //Aを表示
000110     STOP RUN.
```
* PHP

```php:qiita&nbsp;add.php
<?php
  $A = 0;      //Aを初期化（変数Aに0を代入）
  $A = $A + 1; //A+1
  $A++;        //A+1
  echo $A;     //Aを表示
  echo ++$A;   //Aに+1して表示
?>
```
$A++で+1できてしまうPHPはやはり凄いです！
が、COBOLのADDは文字だけで+1するという離れ業をしてのけています！
どちらも=はいらない子でした。ここは引き分けとします。

## 条件分岐ならPHPがいい？

条件分岐（IF文）はよく使いますよね。

* COBOL

```cobol:qiita&nbsp;if.cbl
000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE-01.
000030 DATA                             DIVISION.
000040 WORKING-STORAGE                  SECTION.
000050 01 A  PIC 9(1).
000060 PROCEDURE                        DIVISION.
000070     INITIALIZE A.                           //Aを初期化（数字は0埋め)
000080     IF A = 0                                //Aが0ならば
000090       DISPLAY 1                             //1を表示
000100     ELSE                                    //Aが0でないとき
000110       DISPLAY 2                             //2を表示
000120     END-IF.                                 //IF文ここまで
000130     STOP RUN.
```
* PHP

```php:qiita&nbsp;if.php
<?php
$A = 0;           //変数Aに0を代入
if ($A == 0) {    //Aが0ならば
    echo 1;       //１を表示
} else {          //Aが0でないとき
    echo 2;       //2を表示
}                 //IF文ここまで
?>
```

おや？あまり差がありません。
これも引き分けか？と思うところですが、PHPには三項演算子なるものがあります。

```php:qiita&nbsp;if.php
<?php 
$A = 0;                //変数Aに0を代入
echo $A == 0 ? 1 : 2 ; //上のIF文と同じ結果を表示
?> 
```
簡単な条件分岐ならこちらで十分！
PHPとはなんて便利な言語なのでしょう！

## 配列処理ならPHPがいい！
配列処理は慣れると便利なのですが、初心者にはちょっと複雑です。

例）配列に1~5の数字を順番に代入

|1|2|3|4|5|
|:---|:---|:---|:---|:---|


* COBOL

```cobol:qiita&nbsp;table1.cbl
000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE-01.
000030 DATA                             DIVISION.
000040 WORKING-STORAGE                  SECTION.
000050 01 TABLE_A.                                   //TABLE_Aを定義
000060   03 A PIC 9(1) OCCURS 5.                     //配列Aを定義
000060 01 X PIC 9(1).                                //繰り返し処理用の添字Xを定義
000070 PROCEDURE                        DIVISION.
000080     INITIALIZE TABLE_A.                       //TABLE_Aを初期化（数字は0埋め)
000090     PERFORM VARYING X FROM 1 BY 1 UNTIL X > 5 //Xを1〜5より大きくなるまで繰り返す
000100       MOVE　X TO A(X)                           //AのX番目にXを代入
000110       DISPLAY　A(X)                             //AのX番目を表示
000120     END-PERFORM.                              //繰り返し
000130     STOP RUN.
```
この処理の結果は下記のように表示されます。

```
1
2
3
4
5
```

* PHP

```php:qiita&nbsp;table1.php
<?php
$TABLE_A = array();           //TABLE_Aを初期化
for($X = 0; $X < 5; $X++){    //Xを0〜5になるまで繰り返し
  $TABLE_A[] = $X + 1;        //TABLE_AにX+1を代入
}
print_r($TABLE_A);            //TABLE_Aを表示
?>
```
この処理の結果は下記のように表示されます。

```
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
```

COBOLは1からはじまりますが、PHPは0から始まるので注意が必要です。

配列の中身を表示するのにCOBOLだといちいち繰り返し処理が必要ですが、
PHPはprint_rするだけでいい！

配列作成後の処理は圧倒的にPHPが楽です。
例えば、全ての値を10倍にするとします。

* COBOL

```cobol:qiita&nbsp;table2.cbl
000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE-01.
000030 DATA                             DIVISION.
000040 WORKING-STORAGE                  SECTION.
000050 01 TABLE_A. 
000060   03 A PIC 9(2) OCCURS 5.                     //数字タイプの2桁に変更
000060 01 X PIC 9(1).
000070 PROCEDURE                        DIVISION.
000080     INITIALIZE TABLE_A.
000090     PERFORM VARYING X FROM 1 BY 1 UNTIL X > 5
000100       MOVE　X TO A(X)
000110     END-PERFORM.
000120     PERFORM VARYING X FROM 1 BY 1 UNTIL X > 5 //Xを1〜5より大きくなるまで繰り返す
000130       COMPUTE A（X)　= A(X) * 10              //AのX番目にA(X)の値の10倍を代入
000140       DISPLAY　A(X)                           //AのX番目を表示
000150     END-PERFORM.                             //繰り返し
000160     STOP RUN.
```
この処理の結果は下記のように表示されます。

```
10
20
30
40
50
```

* PHP

```php:qiita&nbsp;table2.php
<?php
$TABLE_A = array();
for($X = 0; $X < 5; $X++){
  $TABLE_A[] = $X + 1;
}
foreach($TABLE_A as $key=>$val){ //TABLE_Aの全てを処理する
  $TABLE_A[$key] = $val * 10;    //中身(val)を10倍してTEBLE_Aのkeyの中身として代入
}                                //繰り返し
print_r($TABLE_A);               //TABLE_Aを表示

//2018-12-04
print_r(array_map(function($x){return $x*10;}, range(1,5))); //結果はTABLE_Aを表示と一緒
?>
```
- 2018-12-04 @rf_pさんと会社の同僚に教えて頂いた1行での記述方法を追加。1行って･･･。

この処理の結果は下記のように表示されます。



```
Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
    [4] => 50
)
```
わざわざ回数を宣言しなくても配列全てを処理してくれるPHPは便利です！
他にも配列を処理するための関数がいっぱいありますし！
COBOLなんて変数Aの桁を変更し忘れて9(1)のままで実行すると桁落ちします･･･

# 結論

ここまで読んでくださってありがとうございます。:blush:

COBOLとPHPを比べてみて、PHP凄い！PHP書きやすい！PHP便利！となった私ですが、COBOLにも良いところがあります。
データの一括処理（バッチ処理と言います）には非常に重宝されていますし、何より処理を記述する上で覚えなくてはいけない単語が少ないです。
つまり、プログラムを書いたことがない新人でも２週間もあればある程度は書けると思っています。
PHPは関数をいかに多く覚えているかでコーディング速度にかなりの差が出ますし、関数を知らないと処理時間が余分にかかるようなコーディングをしてしまうこともあります。覚える単語が多くて眩暈がしました。

**COBOL vs PHP　は　引き分け！**
**個人的にはどっちも好き！で終わりたいと思います！**

絶滅危惧種扱いされるコボラーですが、COBOLは時代に追いつきました。
なんとAWS LambdaにCOBOLが追加されたんですよ！何それ凄い！

COBOL<まだだ！まだ終わらんよ！！

[プログラミング言語「COBOL」がTwitterトレンド入り　AWS Lambdaのサポート言語に追加、技術者がざわつく](http://www.itmedia.co.jp/news/articles/1811/30/news102.html)

あまりの面白さに手を出そうかと思いましたが、ちょっと時間が足りませんでした。
そのうち遊んでみようと思います！

# お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](http://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](http://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)）よりお問い合わせ下さい。

# 明日
明日は、頼りになるデータアナリストの@k_0120さんがGoogle式リスティング広告について書いてくれます！
エンジニアもデータ分析をしないといけない時代、コードを書いて満足しているだけではいけないので、
分析⇒ブラッシュアップ⇒成果爆上げ！まで出来るようになりたいなぁと思う今日この頃です。