COBOLとは1959年に事務処理用に開発されたプログラミング言語です。この変化の早いIT業界で半世紀(60年)以上も昔に開発されたCOBOLが今でも生き残っているのがスゴイことです。しかも、最近になりTwitterでトレンド入りもしているというのです。COBOLに何が起きているのでしょうか。また、COBOLとはどんな言語なのでしょうか。謎めいたCOBOL言語を使ってみましょう。

COBOLの人気急浮上の理由

最初に、今になって急にCOBOLが話題になった理由を種明かししておきます。2020年4月にアメリカ・ニュージャージー州の州知事が、COBOLについて言及したのです。新型コロナの流行によりアメリカではロックダウンが実施されました。それにより、アメリカで失業率が増加し、COBOLで実装されていた失業保険の給付申請のためのシステムがダウンしてしまったのです。それで、州知事がシステムを強化するため、COBOLプログラマーが必要だと会見で述べたのです。

筆者を含め、現役エンジニアの多くは、COBOLについて知っている事と言えば、「古い言語であること」「金融など特定の業界で使われ続けていること」くらいではないでしょうか。実際、COBOLに関わる仕事の多くは保守運用が大半で、新規システム開発には使われることは少なくなっています。また、以前より「COBOLは衰退する」と言われており積極的に学習したい言語ではなくなっていました。

しかし、COBOLは事務処理に特化しており、シンプルで処理の流れを掴みやすいことから、未だ根強い人気を誇っているのも事実です。プログラミング言語のランキングでは、常に50以内をキープしています。ちなみに、本稿執筆時点で、8月のTIOBE Indexでは28位、IEEE Spectrum言語ランキングでは43位となっています。

とは言え、COBOLで組まれたシステムが多く存在するのにも関わらず、COBOLエンジニアが高齢化しており、定年により多くのCOBOLエンジニアが退職してしまうことが近年の問題となっています。つまり、もともとCOBOLエンジニアが不足してきていたところに、今回、新型コロナの影響でCOBOLエンジニアの絶対的な不足があぶり出された形となったのです。

なお、1984年公開の映画「ターミネーター」の中で描かれた2029年でもCOBOLが現役で使われていたことが話題になっていましたが、あと9年で全COBOLのシステムが他の言語に置き換わることはあり得ないので現実になりそうです。

身近になりつつあるCOBOL

なお、COBOLは60年も前の古い言語なのですが、COBOLは規格化されており、その言語規格は拡張され続けています。古い言語と言われつつも、2002年にはオブジェクト指向にも対応しています。最新の規格はCOBOL 2014です。

そして、かつてCOBOLは高価な大型汎用コンピューターであるメインフレーム上で動かすことが一般的だったので、簡単には動かすことができないと思っている方も多いようです。しかし、最近ではオープンソースのCOBOL処理系があり、クラウド上でもCOBOLのアプリケーションが動くようになっています。例えば、2018年11月にはAWS LambdaでCOBOLがサポートされることが発表され話題になりました。

GnuCOBOLをインストールしてみよう

それでは、オープンソースのCOBOLを利用して、COBOLのプログラムを作ってみましょう。今回利用するのは、GnuCOBOL(旧OpenCOBOL)です。これは、COBOL85、COBOL2002、COBOL2014標準に対応しています。それでは、各OSでGnuCOBOLをインストールしてみましょう。

【Windows 10の場合】

WindowsでGnuCOBOLを使うには、WSL(Windows Subsystem for Linux)を使うのが便利です。WSLとUbuntu/Linuxのインストールはこちらが参考になります。

そして、Ubuntu/Linux上でGnuCOBOLをインストールするには、端末(ターミナル)上で以下のコマンドを実行します。

sudo apt update
sudo apt install open-cobol

【macOSの場合】

macOSではHomebrewを使います。Homebrewとはパッケージ管理ツールであり、こちらからインストールできます。Homebrewをインストールしたら、ターミナル.appを起動して、以下のコマンドを実行しましょう。

brew install gnu-cobol

COBOLで一番簡単なプログラム - Hello, World!

それでは、COBOLで一番簡単なプログラムを作ってみましょう。COBOLで画面に「Hello, World!」とだけ表示するプログラムを作ってみます。

以下のプログラムを「hello.cbl」という名前で保存します。

        IDENTIFICATION DIVISION.
        PROGRAM-ID. HELLO.
        PROCEDURE DIVISION.
        DISPLAY "Hello, World!".
        STOP RUN.

そして、コマンドラインから以下のように入力すると、プログラムを実行できます。

cobc -x -o hello hello.cbl
./hello

敢えてレトロなコンソール画面(cool-retro-term)で実行してみると、以下のように表示されます。

  • COBOLで画面に「Hello,World!」と表示したところ

    COBOLで画面に「Hello,World!」と表示したところ

プログラムを確認してみましょう。画面に文字を出すだけなのに、5行書く必要があります。そのうち、冒頭3行にはプログラムの定義を必ず書く決まりになっています。また、ソースコードの各行の左側にスペースを8個入れなくてはなりません。そして、DISPLAYで画面に文字を出力します。

1から10まで加算して表示してみよう

Hello, World!を書いてみてどう感じたでしょうか。次に、ループを使う例として1から10まで順次加算するプログラムを作ってみましょう。

以下のプログラムを「loop.cbl」という名前で保存しましょう。

        IDENTIFICATION DIVISION.
        PROGRAM-ID. loop.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
        01 I   PIC 9(2).
        01 CNT PIC 9(2).
        PROCEDURE DIVISION.
        MAIN.
           MOVE 0 TO I
           MOVE 0 TO CNT
           PERFORM UNTIL I >= 10
              ADD 1 TO I
              ADD I TO CNT
              DISPLAY "I=" I ", CNT=" CNT
           END-PERFORM.
           DISPLAY "CNT=" CNT
           STOP RUN.
        END PROGRAM loop.

そして、以下のようなコマンドでプログラムを実行します。

cobc -x -o loop loop.cbl
./loop

実行すると、以下のように表示されます。

  • 1から10まで加算するプログラム

    1から10まで加算するプログラム

プログラムを確認してみましょう。COBOLで変数を使うには、プログラムの冒頭、DATA DIVISION.とWORKING-STORAGE SECTION.以下の部分で変数を宣言する必要があります。ここでは、変数IをPIC 9(2)型で宣言します。9(2)というのは符号なし十進数字2桁の整数を表します。

PERFORMからEND-PERFORMまでがループです。「PERFORM UNTIL 条件」のように書きますが、条件が偽の間繰り返し処理を行います。そして、MOVEが代入文、ADDが加算演算子となります。

FizzBuzz問題を解いてみよう

続いて本連載で必ず解いているFizzBuzz問題を解いてみましょう。FizzBuzz問題とは以下のようなお題です。

> 1から100までの数字を出力する際に、3の倍数の時「Fizz」、5の倍数の時「Buzz」、3と5の倍数の時「FizzBuzz」と表示するプログラムを作って下さい。

以下のプログラムを「fizzbuzz.cbl」という名前で保存しましょう。

        IDENTIFICATION DIVISION.
        PROGRAM-ID. FizzBuzz.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
        01 N     PIC 9(3) VALUE 1.
        01 FIZZ  PIC 9(1).
        01 BUZZ  PIC 9(1).
        PROCEDURE DIVISION.
           PERFORM 100 TIMES
              COMPUTE FIZZ = FUNCTION MOD(N 3)
              COMPUTE BUZZ = FUNCTION MOD(N 5)
              IF FIZZ = 0 AND BUZZ = 0 THEN
                 DISPLAY "FizzBuzz"
              ELSE IF FIZZ = 0 THEN
                 DISPLAY "Fizz"
              ELSE IF BUZZ = 0 THEN
                 DISPLAY "Buzz"
              ELSE
                 DISPLAY N
              END-IF
              END-IF
              END-IF
              ADD 1 TO N
           END-PERFORM.
        STOP RUN.

プログラムを実行するには以下のコマンドを実行します。

cobc -x -o fizzbuzz fizzbuzz.cbl
./fizzbuzz

すると以下のように表示されます。

  • COBOLでFizzBuzz問題を解いたところ

    COBOLでFizzBuzz問題を解いたところ

プログラムを確認してみましょう。PERFORM 100 TIMESと書くと100回繰り返しを行います。COMPUTE FIZZ = FUNCTION MOD(N 3)と書くと、Nを3で割った余りを変数FIZZに代入します。IF .. THEN .. ELSE .. END-IFは条件分岐の構文で他の言語にもあります。とは言え、英語的には分かりやすいのかもしれませんが、全体的に記述が冗長ですよね。

COBOLのまとめ

以上、簡単にCOBOLについて見てみました。ソースコードの左側に8個のスペースを入れないといけないこと、プログラムの冒頭で変数宣言が必要なことなど、COBOLには癖が強いルールがあることが分かりました。しかし、FizzBuzz問題を解いてみて、少しコツを掴むことができれば、全く他のプログラミング言語とそれほど異なるわけではないことも分かったのではないでしょうか。

なお、コードエディタのVisual Studio CodeにCOBOLの拡張があり、これを使うとシンタックスハイライトや入力補完などができるようです。COBOLを手軽に開発できる環境も整ってきています。今回紹介したように、COBOLエンジニアが不足しているそうです。本稿をきっかけに、COBOLを嗜んでおくと、いつか何かの役に立つかもしれません。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。