Java/.NET開発者のための「ここが変だよ、COBOL」:COBOL - Getting Started(1)(2/2 ページ)
50年前に事務処理用に開発されたCOBOLは、いまでも多くの企業で使われ続けている。基盤部分が近代化してもCOBOLは生き残るかもしれない(編集部)
Java/.NET開発者のための「COBOLとは?」
次に、プログラミング言語COBOLの特徴を、Javaや.NETに親しんでいる方向けに整理して見ます。
1.コンパイラ言語である
COBOLはFORTRANやCと同様に、コンパイラがソースコードから機械語オブジェクトを生成するという意味での「コンパイラ言語」です。この点がJava仮想マシンや.NETフレームワークのような実行基盤向けの中間コードを生成する言語とは異なっています。
インタープリタ形式で実行するCOBOL処理系も存在しますが、ほとんどの実装は生成されたオブジェクトコードとランタイムシステムの協調によって稼働します。従って、COBOLではターゲットマシン向けにコンパイルすることが必須です。Intel Windows向けにコンパイルされたオブジェクトはRISCマシンのUNIXサーバでは動作しません。
一方で、.NETのマネージコードを生成するCOBOL処理系もあります。この場合はC#と同様にMSIL(Microsoft Intermediate Language)のアセンブリが生成され、.NETクラスローダによって実行されます。
2.基本的に静的な言語である
JavaやC#との最も大きな違いは、COBOLが徹底的にstaticな言語であることです。基本的にはCOBOLプログラムは、main()メソッドとstaticなメンバーのみを持っているJavaクラスみたいなものです。プログラムのロード時にメモリ領域が静的に確保され、その上での演算を1つのプロセスに専念させることができます。このような実行形態は大量のバッチ処理を高速に実行するのに有利です。
現在ではCOBOLもオブジェクト指向になっていて、クラスメソッドの定義や動的なインスタンス化ができるようになっています。また、C言語と同様にポインタ操作もできますので、動的なデータ構造を処理するプログラミングも可能となってはいます。しかし、現存する膨大なCOBOL資産のほとんどはそんなふうに書かれてはいません。
3. 言語機能が構文によって実現されている
COBOLは、非常に多くの機能を英語ライクな言語の文法でサポートしています。Javaや.NET言語では、コンパイラが構文解析する文法の要素はCOBOLに比べて非常に少ないです。
言語としてのJavaやC#の基本文法は、パッケージやクラス、メソッドなどの宣言を行う基本的なプログラムの枠組みに、ループや条件分岐などの制御構造を表す構文、それに若干の既定義データ型(基本型)、これがすべてです。にもかかわらずプログラマがシステム資源にアクセスするために豊富な手段を享受できるのは、文法以外に用意された膨大なクラスライブラリがあるからです。
これに対して、COBOLは、時代の要求に応えるためにデータ処理に必要な機能を次々に言語に取り込んで発展し続けてきました。例えば、COBOLにはファイルのソートを行うSORT文、文字列の連結を行うSTRING文などが文法としてサポートされています。
COBOLの「ここが変だよ」
COBOLは半世紀にも及ぶ歴史がありますので、コンピュータの黎明期のムードを色濃く残している部分があり、近年の言語に慣れたプログラマには異質に感じられることがあります。ここではそのような側面をハイライトして見ましょう。
1.カラムに依存する正書法
初期の汎用コンピュータでは入力データの媒体として穿孔パンチカードが活躍しました。これは穴あけのパターンで1枚に80文字のASCIIコードを記述できる厚紙です。
COBOLやFORTRAN のソースプログラムも、キーパンチャと呼ばれるオペレータによって手書きのコーディングシートから穿孔カードに打ち込まれ、このカードの束がカードリーダにセットされてコンパイルのジョブが開始したのです。
この歴史的背景から、COBOLもFORTRANもソース行の形式が固定カラムになっています。COBOLではソースの一行は以下のような領域で構成されます。
1〜6けた目
行番号を書く領域
7けた目
ここに「*」を書くとコメント行扱いとなる、継続行であるときはここに「-」を書く
8〜11けた目
主に見出しやラベルを書く領域
12〜72けた目
本文を書く領域
73〜80けた目
注記を書く領域、本文には影響しない
2.長ったらしい記述
普通のCOBOLプログラムの1行目には、
IDENTIFICATION DIVISION.
と書いてあります。これがプログラムの見出しを記述する構文です。
当然、1文字でもスペルミスがあるとコンパイルエラーとなります。Javaに慣れたプログラマが初めてCOBOLのソースを見ると「これがプログラミング言語か?」と首をかしげるでしょう。それほどに COBOLの記述は冗長に見えます。
これは言語の設計目標の1つとして英語の表現に近づけることがあったためです。日本では1960年代に日本語の表現に近いCOBOLを作る試みがなされたそうです。
ケッカ ヲ ゴウケイラン ニ ウツス.
というような文を許容する日本語COBOLが本当にあったそうで、期待もされていたとのことです。これはしかし普及することはありませんでした。
一方、欧米人でさえもこのようなコーディングを面倒と感じたのか、簡易記法で記述したソースから完全なCOBOL文法に準拠したソースを生成するトランスレータも多く作成されています。
3. 物理的なバイト順を意識するデータ型
COBOLでは数字データを表現するために非常に豊富なバリエーションの型が利用できます。
Javaでは、プログラマが操作の対象とするのはオブジェクトであり、例えば、BigDecimalのオブジェクトは、持っているけた数で表現される抽象的な数値のみを表しています。
ところが、COBOLプログラマは自分が宣言した数字タイプの変数(COBOLではデータ項目と呼びます)が、メモリ上で物理的にどのようなバイト並びで格納されているかを知っています。
例えば、パック十進形式という数字のデータ型があります。これは1バイトを2つの4ビットのフィールドで区切って、それぞれに10進数の位取りを格納するものです。
また、COBOLでは複数の基本型の変数を階層構造でまとめて1つの複合構造を定義できます。これをレコードと呼びます。複数の基本型メンバーを持つクラスを作成して処理するのに似ていますが、COBOLのレコードはメモリ上の物理的なレイアウトが意識されています。
宣言された順番にメモリ上に並んでいることが言語として保証されているので、プログラマはそれを意識したプログラミングを行うことができます。例えば、再定義という機能を使うとメモリ上の同じ領域を異なる形式のレコードとして取り扱うことができます。
4. ユニークな文字集合
COBOLでは、変数名や手続き名などでプログラマが付ける識別名のことを利用者語と呼びます。利用者語で使用できる文字は、数字、英字、およびハイフン(-)です。ただし、ハイフンは利用者語の先頭と末尾には使えません。
現在のCOBOLはアンダースコア(_)も許容していますがあまり普及してはいません。UNIXやWindowsなどのオープンOSの世界での外部名の規則はハイフンを許さず、アンダースコア(_)を許容していますので、ここにギャップがあります。
なお、減算を意味するマイナス(-)は必ず分離符のスペースで区切って書かなければなりません。さもないと利用者語の一部と認識されてしまいます。
また、英字の大文字と小文字の区別はありません。COBOLでは2002年の改訂で初めて小文字の使用が規格化されました。このため、現在でも大多数のプログラマはすべて大文字でコーディングしています。この点も違和感を持たれることがあります。
また、英語表記ライクであることを標榜するCOBOLでは、ピリオド(.)は常に終止符を意味し、文を区切ってしまいます。このため、.NETやJavaのクラス、メソッドを参照するための結合子としてのピリオドはCOBOLプログラム内にそのまま記述することができません。
そこでCOBOLでは、これらを参照するためには以下のように引用符で括って文字定数として記述し、これにCOBOL上の名前を付けて使用します。
CLASS CLASS-STRING AS “System.String”.
なお、COBOLはかなり初期から日本語の取り扱いをサポートしています。データとしての日本語の取り扱いはもちろんのことですが、利用者語にも日本語が使用できるため、書き方によっては極めて設計文書に近いプログラム記述が可能となります。
これは、Javaやほかの.NET言語にはない特徴です。COBOLプログラマはコードを打ち込む手間を惜しまずに、文書としての読みやすいプログラムを生産してきたといえるでしょう。
COBOLの強み
このように現在のIT環境から見ると「異色」にさえ感じさせるところがあるCOBOLですが、実際には現在のオープン系のシステム構築においても幅広く利用されています。「既存のアプリケーション資産があるから」という消極的な理由だけでなく、新規開発においても、あえてCOBOLを選択するケースは多くあります。何故でしょうか。以下にその理由を挙げてみます。
1. 金融業務での記述力
事務処理向け言語として開発されたCOBOLの持つ十進演算機能は金融分野では他言語には替えがたい力です。固定桁数の十進変数間の切り捨て四則演算は金融業務の基本です。
もちろん、Javaでも.NETでもこれは可能ですがプログラミングは煩雑となる上に、ターゲットマシン向けに最適化されたオブジェクトコードで実行されるCOBOLと比較すると実行性能は低下します。
2. 管理しやすさ
スキルの高いハッカータイプのプログラマにとってCOBOLは決して魅力あるプログラミング言語ではないかもしれません。しかし、大規模開発プロジェクトを率いる管理者から見るとCOBOLによる開発は安心感があります。
一般に、多くのプログラマが関与する開発において、製造されるプログラムの品質のばらつきが少ないのがCOBOLだといわれています。スーパープログラマが非常に高度なテクニックを駆使して極めて高速に実行されるコードを書く、というようなことはCOBOLではほとんどありえません。
リバースエンジニアリングを行うツールも市場に流通しており、管理者が生産性や品質に関する正確なデータを取得することができます。
3. 新しいテクノロジへの親和性
COBOLが主に活躍するのは未だにバッチ処理です。しかし、企業活動のコアとなるビジネスロジックを記述する言語として、COBOLはオープン系システム構築におけるサーバサイドコンポーネントの中に活路を見出してもきました。
基盤としてJava EEや.NETを選択しても、そこからCOBOLによるコンポーネントをサービスとして利用する方法は多数あります。従来型の書き方によるCOBOLサブルーチンをそのままWebサービスとしてエクスポーズすることも可能となっています。
現在、どのようなテクノロジを構築基盤に採用したとしてもCOBOLがまったく使えないということはありません。この点についてはこの連載の第3回で詳しく紹介したいと思います。
以上、COBOLとは何かについて、主にJavaや.NETの開発者を対象として解説しました。第2回ではコードの書き方の実際を取り上げます。
Copyright © ITmedia, Inc. All Rights Reserved.