お問い合わせ

ホーム > COBOLのはなし > COBOLにまつわる昔話 〜 今もCOBOLは良いか 〜

COBOLにまつわる昔話 〜 今もCOBOLは良いか 〜

内田 正章

COBOLは安全か

私が新入社員だったころ(具体年は割愛)、先輩諸氏からピリオド一つでロケットが落ちたという話をよく聞かされました。確かに、COBOLのIF文で「IF A=0 MOVE 10 TO B, MOVE 20 TO C. 」のようなプログラムで、途中の ,(コンマ)〔または空白〕を .(ピリオド)と指定すると異なる結果になります。なるほどこういうことでロケットが落ちた[6]のかと納得したものですが、考えてみると危ない言語仕様とも言えます。でも、これはCやJavaで「if (a==0) b=10; c=20;」と記述しても同じことです[7]。ですから、ピリオド一つのことを取り上げてCOBOLが安全性に欠けると言うのは不公平でしょう。

ただ、異なる型のデータ間の転記や演算を厳しくチェックする後発の言語に比べると、COBOLはこの辺がかなりルーズと言えます。英数字項目を介したやりとりやREDEFINES句などは、私が開発担当者なら便利に活用したいと思うでしょうが、管理者ならトリッキーな利用方法に制限をかけるかもしれません。COBOLの集団項目も、使い方によっては安全性を損なうことがありそうです。そうは言っても、いくつかのデータ項目のまとまりやそれらの繰返し(表/配列)から構成されるごく普通のレコードを集団項目によってデータの階層を自然に表現できるCOBOLの記述性は大きな魅力です[8]。

半世紀以上にわたるソフトウェア開発の苦難の中で発展してきたソフトウェア工学の一つの成果であるオブジェクト指向とそれを実装した後発の言語には、安全性を高めるための仕組みが内包されています[9]。しかし、機能をベースとして構造化手法で構築された既存のシステムを維持/拡張するのであれば、COBOLの記述性の高さがその差をカバーしてくれると考えられないでしょうか。

COBOLは高速か

ICT(情報通信技術)の進化のスピードを表す言葉として、ムーアの法則があります[10]。ムーアの法則自体は半導体の集積密度についてのものですが、俗に、システムの処理速度、補助記憶装置/媒体の記録密度、回線速度などの指数関数的進歩もこの延長線で理解されることがあるようです。実際、コンピュータの処理速度も、誕生以来今日に至るまで驚異的なテンポで高速化しています[11]

コンピュータが大量データの定型処理に広く利用されるようになったのは1960年代以降で、COBOLの歴史に符合します。その後、特に事務処理分野では、かなり長期間にわたってメインフレームコンピュータ中心の時代が続くことになります。メインフレームと言っても、1980年ころの処理速度は現在からは信じられないくらい低いものでした。

この時代のCOBOLコンパイラには、たとえば二つの4バイトのデータ項目AとBについて「MOVE A TO B」の転記を実現するのに、AとBがワード(4バイト)境界に整列されているかどうかでオブジェクトコードを出し分けたりする[12]など、少しでも実行速度を上げるような工夫を随所に施してあります。このような局所的最適化に加え、繰返し処理におけるオーバーヘッドを削減する広域最適化の手法も導入して高速化を追求しましたので、COBOLは他の言語に遜色のない実行性能を有していたと言えると思います[13]

これらの最適化はCPUでの処理が中心の場合に有効ですが、入出力処理を多用することが多い事務処理計算では効果は限定的です。この点についてはOSの能力に依存しますが、それをいかに効率的に引き出すかが問われます。当時、日次処理の夜間バッチにおけるソート処理が朝までに終わらないということがときどき問題になりました。もちろんデータの量に依存する訳ですが、これを加味して機種選択していたという一面があったのかもしれません。COBOLのファミリー製品の一つであるSORTユーティリティも改良を重ねて、増え続けるデータも夜のうちの処理完了を達成しました。

夜間処理と言えば、コンパイル時間も結構シビアでした。ユーザごとに事情は異なると思いますが、500〜1,000ステップのプログラム1,000本程度で業務を構築するというのが一つの標準的なパターンだったように記憶しています。時折、これらを一斉にリコンパイルすることが必要になる場合があります。今でこそ1,000ステップのCOBOLプログラムなど、ノートパソコンでも1秒もかからずにコンパイルできてしまいますが、当時はそのようなスピードは望めません。1本につき1分として、1,000本で17時間。多重処理するにしても、朝までの完了は高いハードルでした。処理性能というと実行時間に目が向きがちですが、コンパイル時間が大きな問題だった時代もありました[14]

ムーアの法則的に飛躍的進展を遂げた現在の環境では、言語の違いによる性能差はほとんど問題にならないでしょう。差が出るとしたら、アプリケーションのアルゴリズムの適切さに依存するのではないかと思います。ただ、技術の進展と歩調を合わせるようにデータ量も当時と比較にならないほど巨大化していますので、ビッグデータを扱うような場合には処理系(コンパイラやランタイムシステム)の能力によって実行時間に有意な差が生じると聞いています。

次回に続く