2010年代もあと1ヶ月以内に終わるこの頃に,1990年代以前のイメージがある(個人の感想です)言語をやってみませんか。銀行などの基幹システムにも使われていると評判の,あのCOBOLです。
調べてみると,COBOLは1959年に開発されていました。想像よりもかなり古かった……。今年で60周年の言語なんですね。
こんな感じで書き慣れない導入部分を書いてると無駄に疲れるので,とりあえず実際にCOBOLを動かしましょう。
COBOLを動かす
とりあえず環境を構築しましょう。Homebrewにはgnu-cobol
というパッケージがあったのですが,自分の環境(macOS Catalina)ではうまく動きませんでした。
どうやらWindows向けには別の実装もあるようなのですが,macOSにはなかったので,Dockerで動かしました。
Docker Hubで cobol
などで調べて,いろいろやってたら Dockerイメージを見つけました。そして,そのイメージ名でググったら プログラムちょい替え(4)COBOLを40年ぶりにうごかしてみた:dockerでcobolという記事が見つかりました。
はい,見事に先にやってる人いましたね。ただ,もうここまで記事を書いてるので,そのまま続けます。このDockerイメージを使わせてもらっていろいろコードを動かしましょう。
Dockerで動かしてみる
実際にコード動かしてみたいですが,そもそも動かすコードがなければ試せないので,自分が書いたコードのレポジトリをcloneしてください。
git clone https://github.com/stmkza/cobol-test.git && cd cobol-test
次に,Dockerコンテナを起動させます。
docker run -it --rm -v `pwd`:/home/cobol kaizenjapan/cobol /bin/bash
コンテナの中に入ったら,以下のコマンドを実行してください。
cd /home/cobol
cobc -x hello-world.cbl && ./hello-world
Hello, world.
と表示されたと思います。 hello-world
のところを fizzbuzz
に変えて,FizzBuzzも試してみてください。
COBOLのすごいところ
ここまでを読んだだけだと,COBOLがただの普通の言語であるかのように見えると思います。
えっ,文法がおかしいって? 検閲により削除 とか 検閲により削除 が普通の言語として見なされてるくらいだから,COBOLも文句なしに普通の文法ですよね。
ただ,COBOLの真にすごいところは,固定小数点10進演算ができるところなんです。他の言語だとライブラリを使わないとできないことが標準でできます。decimal
型などがある言語を使ってる人にとってはそこまで利点を感じないかも知れませんが,そういうのがない言語だとライブラリを使う必要があります。言語によっては標準の演算子で計算ができません。
しかも,どこかで普通の数字として計算してしまって,誤差が出るかも知れない,結構気を遣います。
それでは実際にその威力を試してみましょう。
compute.cbl
では,0.00001
を10000
回足しています。普通に計算すると答えは0.1
ですよね。COBOLでも答えは0.1
になります。
123456*8901234567890123456789012345678901234567890
IDENTIFICATION DIVISION.
PROGRAM-ID. COMPUTE-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM PIC 9(1)V9(5) VALUE 0.
PROCEDURE DIVISION.
PERFORM 10000 TIMES
ADD 0.00001 TO NUM
END-PERFORM.
DISPLAY NUM
STOP RUN.
* Result: 0.10000
ここで普通じゃん って思った人,同じ処理をPHPでやってみましょう。残念ながらDockerイメージにはPHPが入っていないので,適当な環境でcompute.php
を実行してみてください。
<?php
$num = 0;
for($i=0; $i<10000; $i++) {
$num += 0.00001;
}
echo $num . "\n";
// Result: 0.099999999999994
どうでしたか?自分の環境では0.099999999999994
になりました。お金の計算などをするときにこのような誤差が出てしまっては大問題です。
他にもCOBOLの利点はたくさんあると思うのですが,自分がさらっと触ってみた範囲内では,これが一番の驚きでした。
みなさんもCOBOLを使ってみてはいかがでしょうか。