neverjpのぶらり日記

コンピューター関連の記事とぶらりと出かけた先の写真など

9400COBOL習得



COBOLは非理系の事務員や役人が使える言語として設定されたため、自然言語である英語に近い記述になるようなコマンド語彙や構文(シンタックス)になっています。特に金額計算など事務処理(商用計算)の用途に広く使われています。また科学技術計算向けのFORTRANに次いで国際的な標準化が行われた初期のプログラミング言語でもあり、メーカーやプラットフォームによる型や精度などの相違が少ないため移植性が高く、またCOBOL仕様の拡張も過去との互換性を重視して行われているため、長期間継続的に使用されている場合が多いです。

このため「記述が冗長である」と指摘される場合も多いです。ただし記述が冗長なのは自然言語(英語)に近いためであり、ソースコードのステップ数は多いが可読性は高くプラットフォーム依存性は低いため、特定箇所の修正や影響の確認などの保守作業は比較的容易です。またCOBOL自体の基本仕様が古いのは事実ですが、現実に制約となっているのは稼働プラットフォームや業務運用あるいは保守体制などである場合も多く、COBOLの言語仕様は拡張が続けられており2002年版ではオブジェクト指向にも対応しています。

過去に政府や企業の膨大なデータがCOBOLによって処理され蓄積されているため、現在でもCOBOLによって電算処理されている情報は膨大な数に上ります。現在でも稼動しているCOBOLによるコードは2000億行に上るとされており、これはFORTRANアセンブラを合わせた数十億行に比べても圧倒的に多くなっています。

このように誕生から半世紀たっているにもかかわらず、今なお主流言語として使用されている点で、他の初期の言語とは大きく異なります*1

1950年代、事務処理言語は開発メーカーごとに異なっていました。その統一の必要性を認識していたアメリカ国防総省によって、事務処理用の共通言語の開発が提案され、CODASYL*2が設立されました。そうした背景の下、1959年にCODASYLによって開発された共通事務処理用言語がCOBOLです。

COBOLの開発により、アメリカ政府の事務処理システムは全てCOBOLのみで納品されることとなり、これに伴い、COBOLは事務処理用言語として世界中に普及することになりました。

COBOLより先に誕生したFORTRANが主に科学技術計算用であるのに対して、ほぼ同時期に誕生したCOBOLは大量のデータを処理するための事務処理用及び管理分野用と位置付けられています。COBOLFORTRANは、プログラミング言語の歴史において高水準記述言語としての古典的あるいは原点ともいえる存在を示すものです。

COBOLの言語仕様

年齢を表すageという変数の値を、一定の年数を表すyearsという変数の値の分だけ増やす手続きは、例えば普通のプログラミング言語では

age = age + years*3

と書かれるが、COBOLでは

ADD YEARS TO AGE *4

となります。このように、数学やアルゴリズムの知識がほとんど無くとも構文上の約束事*5さえ憶えて、英語による理路整然とした記述ができれば、COBOLのプログラムを取り扱うことができるようになっています。つまり事務処理の手順を逐一細かく(英語で)記述していけば事務処理が電算自動化できるという、工程的利点が存在します。さらにプログラムのコードそのものがプログラムの機能を説明する仕組みになっているので、コードをそのまま「読む」ことができるという利点もあります。

一方でCOBOLは数学や自然科学、工学などの分野における制御・演算には向いていません。例えば二次方程式 A X2 + B X + C= 0の解(の片方)を求める手続きは、基本的な算術の演算子や初等的な関数 (数学)と再帰的に定義された文法を持つC言語などの多くの近代的プログラミング言語では

X = (-B + SQRT(B ** 2 - (4 * A * C))) / (2 * A)

と一文で済む一方、COBOLでは

MULTIPLY B BY B GIVING B-SQUARED. (BにBをかけてB二乗を得る)

MULTIPLY 4 BY A GIVING FOUR-A.   (Aに4を掛けて四Aを得る)

MULTIPLY FOUR-A BY C GIVING FOUR-A-C. (四AにCを掛けて四ACを得る)

SUBTRACT FOUR-A-C FROM B-SQUARED GIVING RESULT-1.

COMPUTE RESULT-2 = RESULT-1 ** .5.

SUBTRACT B FROM RESULT-2 GIVING NUMERATOR.

MULTIPLY 2 BY A GIVING DENOMINATOR.

DIVIDE NUMERATOR BY DENOMINATOR GIVING X.

と演算を一つずつ分けて別々に記述する必要があります。

このため事務処理用の言語として重宝された一方で、他の主要な言語の方法論とは隔たりが大きいです。他の多くのプログラム言語では、処理を数式などで簡潔に記載する方向性があるが、COBOLでは逆にすべての処理を1行ごとの単純な処理に分解するという方向性があります。この影響で「COBOL(だけ)を習熟しても、他の言語でのプログラミング能力は高いとは限らない」とも言われます。ただし、前述したように過去にCOBOLで処理された膨大なデータが蓄積されたため、これを維持あるいは更新する必要が存在し、COBOLに対する需要はいまだに根強く存在します。

プログラムの書式

典型的なCOBOLの原始(ソース)プログラムは、FORTRANと同様にカラム固定形式で記述することとされており、以下の形式で記述します。

1〜6カラム目「一連番号」

各行を識別するために、6桁のシーケンシャル番号を記述することができます。

7カラム目「標識領域」

その行の標識を記述します。例えば、アスタリスクを記述すると、その行は注記行となります。

8〜11カラム目「A領域」

12〜72カラム目「B領域」

A領域及びB領域において、コードを記述します。ピリオド(厳密にはピリオド及びその後に続くスペース)を記述してコードの行端を示します。

COBOLプログラムの基本構造(4つのDIVISION)

COBOLのプログラムは、次の4つのDIVISIONがその基本構造となっており、次の順番の通りにこれらのDIVISIONを記述することが必要です*6

• IDENTIFICATION DIVISION.(見出し部)

• ENVIRONMENT DIVISION.(環境部)

• DATA DIVISION.(データ部)

• PROCEDURE DIVISION.(手続き部)

IDENTIFICATION DIVISION.

「PROGRAM-ID.」(プログラム識別名)、「AUTHOR.」(作成者名)、「DATE-WRITTEN.」(作成日)等のプログラムの実行には直接影響しない文を記述します。これらの内容は、他の言語では注釈文(コメント文)として任意に記述することになっていますが、COBOLにおいては正式な文法の一つとして組み込まれています。

ENVIRONMENT DIVISION.

プログラムが実行されるコンピュータの環境を記述します。「ENVIRONMENT DIVISION.」は、「CONFIGURATION SECTION.」(環境節)と「INPUT-OUTPUT SECTION.」(I-O節)に大別されます。

DATA DIVISION.

プログラムで使用する変数及びデータ並びにその型について記述します。プログラムで使用する変数及びデータのすべては、DATA DIVISION.で定義しなければなりません。

「DATA DIVISION.」は、「FILE SECTION.」と「WORKING-STORAGE SECTION.」に大別されます。データの型の宣言は、PICTURE(PIC)句によって行います。

引数でデータを受け取る場合は、引数を「LINKAGE SECTION」で宣言します。

COBOLにおけるデータの分類

COBOLのプログラムにおけるデータは、次の3つに分類されます。

• 変数 (Variables)

• 定数 (Literals)

• 表意定数 (FigurativeConstants) - 予め名称が定められている特定の意味を持つ定数(表意定数)を利用できます。この定数の実体は、実行されるシステムよってその意味が有効になるように実現されます。例としては、HIGH-VALUES、LOW-VALUES等が挙げられます。

COBOLにおける変数

COBOLにおける変数の型は、次の3つが基本となっています。

• 数値型 (Numeric)

• 英数字型 (AlphaNumeric)

• 英字型 (Alphabetic)

数値型は主に

99999 または 9(5)

と表記されます。

文字列型も

XXXXX または X(5)

と表記されます。

CSV形式で他の言語と比較をすると、COBOLでは

ABC,D△△,EF△,G△△(固定の長さ、△はスペース)

他の言語(VB、C、,Javaなど)では

ABC,D,EF,G

となります。

COBOLではスカラー型変数及びレベル番号による多次元の配列を使用することができるとともに、これらを複数組み合わせて階層構造を持つ固定長「レコード型」(構造体)を構成して定義することもできます。なお、この「レコード型」はCOBOLによって初めて導入された概念です。

COBOLのプログラミングにおける特徴的な記述方法として、レベル番号によって表現される階層構造を持つレコードのデータ構造の定義を挙げることができます。なお、レベル番号は"01"から"49"までとされるが、特殊なレベル番号として"66"、"77"等があります。

事務処理用及び管理分野用とされるCOBOLにおいては、会計・経理処理などのように通貨を対象とした正確な数値計算が特に要求されるため、数値に対する10進数から2進数への基数変換時に、計算誤差の発生しない2進化10進数による数値型(固定小数点数)を用いることができます。これはFORTRANなどのプログラミング言語において浮動小数点方式などによって実数を近似値で表現しようとする発想とは対照的です。

無名の変数等として"FILLER"という名称を記述することができます。無名項目の"FILLER"は、COBOLにおける変数等の領域の定義は固定長となるため、そのような固定長領域内における予備的な領域の確保という意味合いも有しています。

PROCEDURE DIVISION.

実行されるプログラムの内、実際の処理部分のコードを記述します。 引数を受け取る場合は、「PROCEDURE DIVISION USING 引数名[,引数名……]」という書き方をします。

上記3つのDIVISIONを記述したあとの4番目のDIVISIONである「PROCEDURE DIVISION」においてプログラムコードを記述する文法となっているため、COBOLは「前置きが長い」言語と評されることもあります。その一方で、このような4つのDIVISIONの明確な記述などによる厳格で形式的な文法に基づくプログラムの記述方法によってCOBOLは、その可読性、ドキュメント性、保守性が高い言語であるとも言われます。なお、これと関連してCOBOL予約語の数は膨大で、文字数の長いものが多いことはCOBOLの特徴の一つです。

私はCOBOLを使ってY総業の在庫管理(販売管理)オンラインシステムのAPプログラムを仕様書作成からプログラミングまで約1万ステップを一人で、半年でデバッグまでを行いしました。

この項、Wikipediaを参照させていただきました。

人気ブログランキングへ←人気ブログランキングに参加しています。よろしければ1票を!


*1:2000年時点の世界の民間企業の8割、2009年の日本国内の調査によると17.1%で2位

*2:Conference on Data Systems Languages、データシステムズ言語協議会

*3C言語などではage += yearsのように略記できる

*4:英語でそのまま「年数を年齢に加える」

*5:全て現在形、語尾変化なしなど

*6:括弧及び括弧内の日本語は説明のために付与したものである