COBOL
COBOL-73 (追加)WRITE文によるページ送り (追加)LINAGE句 (変更)INSPECT文の機能拡張 (変更)直接記憶装置アクセス機能を相対編成と索引編成に組み替え (変更)登録集機能 (変更)再実行機能 (変更)独立項目記述と一連項目記述の相対位置の自由化
COBOL-76 (追加)データベース機能 (追加)ビット列操作 (変更)ファイル定義方法の整理 (廃止)独立項目(レベル番号77) (廃止)ALTER
COBOL-78 第3次規格の元になる。 (追加)構造化プログラミング機能 EVALUATE文 PERFORM文の機能拡張 名前の有効範囲の規定の整備 (変更)プログラム間連絡機能 (変更)データベース機能
COBOL-81 (追加)浮動小数点 (追加)算術式による添字 (変更)正書法の改訂(自由書式の導入) (廃止)デバッグ機能(デバッグ行以外) (廃止)ENTER文 (廃止)CORRESPONDING機能
COBOL-84(25周年記念版) 第3次規格(補追)の元になる。 (追加)組み込み関数 (追加)データ検証 (VALIDATE) 機能 (追加)行の一部分に注釈を書く方法 (廃止)RERUN機能
COBOL-88 (追加)表SORT機能 (追加)定数の連結 (追加)画面制御機能 (追加)いくつかの組み込み関数 (廃止)区分化機能 (変更)語の長さを60字以下までとする。
COBOL-93(最終版) (追加)マルチオクテット処理 (追加)ファイルの排他共用制御 (追加)いくつかの組み込み関数 (変更)語の長さを30字以下までにもどす。
COBOLの文法は英語の表現に近い。たとえば、ある数値型変数W-NOに対し数値100、英字型変数W-CHARに文字列'ABC'を代入する場合は、以下のような表記をする。
MOVE 100 TO W-NO.(またはCOMPUTE W-NO = 100.)
MOVE 'ABC' TO W-CHAR.
このように、COBOLの文法は自然言語(英語)に類似した文章的なものであることから、その可読性(ドキュメント性)の面で優れていると言われている。ただし、数学の定理を例にとれば、それを自然言語に直したところで理解が容易になるわけではないため、これは否定派にはCOBOLの冗長性と捉えられる部分でもある。
過去のバージョンとの互換性を重視した国際標準規格にしたがって多くのプラットフォームでコンパイラが開発されてきたので、COBOL to COBOLのマイグレーション(プラットフォームの更新)は比較的容易である。
膨大なCOBOLプログラムおよびそれらの処理するデータが、企業や政府機関に長年開発し続けられ稼働している。ガートナー発という情報によれば、メインフレームが世界1万サイト以上あって3万8千のレガシーシステムがあり、COBOLは全プログラム約3,100億行のうちの約65%の約2,000億行あって、毎年約50億行が増えているという 。これはFORTRANとアセンブラを合わせた資産の数十億行に比べて圧倒的に多い。また、世界の商用データの約75%、商用トランザクションの80%以上(Google検索の200倍以上)である。COBOL開発者は85万人以上いるが、COBOL開発者の増加より減少がずっと速いという。
日本国内では、2016-2021年のソフトウェア開発データ1,476件をまとめたIPAのレポートによると、1位のJava(42.4%)に次いでCOBOLは16.3%で2位である。
このように、誕生から60年以上たってもなお主流言語のひとつの座を占めている点で、他の初期の言語を引き離している。
年月が経ってこのレコードに追加項目AD-START-DATE(広告開始日)が発生したら、FILLERを削ってその新項目に宛てることで、授受データのレコード長を変更しなくて済む。
FILLERによって、固定長レコードファイルの運用が円滑になった。ただ、この例で500バイトを使い切れば、やはりレコード長の変更が必要になる。だからといってむやみに長いFILLERを入れると、容量的な効率低下を招くのでバランスが必要である。
製品が多くなってPRODUCT-NO(製品番号)を8桁から12桁に拡張しようとすると、後続の項目群の開始番地が順繰りにずれてしまうので変更の影響が大きい。
COBOLが扱うデータベースの領域定義も、多くの場合同様に固定長の項目からなるレコードという考えで行われてきた。
システムが実際に入力したデータがプログラムが用意した桁数を1桁でも超えたとき、SIZE ERRORとしてエラー処理を行うのが普通である。オプションにより上を切り落として続行も可能。桁数が不足したときにデータのミスでなければ、プログラムとそのデータを授受するシステムのプログラムで一斉に桁数を増やす修正をしなければならない。データの変換も必要となる。
このように桁数やバイト数の変更は大変なため、COBOLプログラマやSEは常に桁数やバイト数の設定や変更を意識し、プログラムの使用されるのが何十年でもその間になるべく桁溢れが起こらないように目を配って作業している。
CODASYLでは常時言語仕様の改定をおこなっており、その成果を1~5年ごとにとりまとめてCOBOLの仕様書を発行していた。
COBOL-60 最初の版
COBOL-61 手続き部の構成の変更、4つの部が出揃う
拡張COBOL-61(1963年) (追加)ソート機能 (追加)報告書作成機能 (追加)算術文での複数の答え (追加)CORRESPONDING機能
COBOL-65 第1次規格の元になる。 (追加)大記憶ファイルの処理機能 (追加)指標による添字付け、表引き (廃止)誤り診断メッセージへの要求 (廃止)必須機能と選択機能の区分
COBOL-68 この年から開発報告 (JOD) 形式になる。 (追加)プログラム間連絡機能 (追加)映像端末処理用のSUSPEND文 (追加)割り算の余りを求める機能 (追加)注釈行 (追加)一般化されたCOPY機能 (追加)論理的なページあふれ条件の指定と検出 (追加)略語による記法 (変更)EXAMINE文の機能拡張 (廃止)PICTURE句と重複する編集句 (廃止)NOTE文、REMARKS段落 (廃止)DEFINE文 (廃止)一部の略記法
COBOL-69 (追加)通信機能 (追加)翻訳印刷におけるページ送り (追加)実行時の日付と時刻の呼び出し (変更)文字列操作機能 (追加)STRING文 (追加)UNSTRING文 (追加)INSPECT文 (廃止)EXAMINE文 (追加)SIGN句 (廃止)データ部の定数節
COBOL-70 第2次規格の元になる。 (追加)デバッグ機能 (追加)MERGE文 (追加)データ初期化のためのINITIALIZE文 (変更)報告書作成機能の全面的な改定 (廃止)RANGE句
なお、0、負の数、小数を扱う場合は、下記のように数字編集項目によるゼロサプレスとUNSTRING文を組み合わせることでパディングされた0を除いて表示させることが出来る。
COBOLの数字編集項目によるゼロサプレスは、単純に0を空白に置き換えるだけであるから、先頭に空白が生じる(=整数部分が右寄せになる)。ゼロサプレスを行い更に先頭の空白も除去したい(=左寄せにしたい)場合は、空白を区切り文字に指定してUNSTRING文を用いれば良い。上記の例では、UNSTRING文実行後の変数DUMMY-IKIには常に空白が入り(対象の文字列がいきなり空白=区切り文字から始まり、その前には何も無いため、何も入らない=空白が入る)、変数HENSHU-IKIには数字の部分だけが入る。
主にANSI COBOL 1985の文法について述べる。
COBOLのプログラムは、次の4つのDIVISIONをこの順番で記述するのが基本となっている。
IDENTIFICATION DIVISION......見出し部
ENVIRONMENT DIVISION......環境部
DATA DIVISION......データ部
PROCEDURE DIVISION......手続き部
以上のような特徴は、固定長レコードやその中の文字列や数値を容易にかつ厳密に扱えるというCOBOLの大きな長所にともなう、保守、機能追加していく上での大きな短所である。
補足
COBOLのデータ型の宣言で、COBOL85以前から可変長のデータ宣言も可能になっている。
COBOLの仕様拡張により、ポインタ操作も可能になっており、実装しているCOBOLコンパイラも複数、開発されている。
DBMSとの連携により、データベースを操作する場合、DBMS側でレコードの定義、ビューの定義などを行う。そのため、レコードのフィールド変更などがあっても、ビューなどで変更対象のフィールドを参照するアプリケーション以外は、修正や再コンパイルは必要ない。
RDBMSとの連携では、可変長データ、BLOBなど、多様なデータ型の扱いも可能となっている。ただし、COBOL側の受け渡しの変数の宣言は、COBOLコンパイラにより、COBOLの可変長データ型を使うものと、COBOLでは有効長を持つ固定長データ型を使うものなど、開発元による実装の違いがある。
階層型、ネットワーク型データベースをCODASYLが国際標準化した構造型データベースのNDLに準拠した埋込み型DMLを、IBM、富士通、日立などのメインフレームのCOBOLでは実装している。
標準SQLに準拠した埋込み型SQLを、IBM、富士通、日立などのメインフレームのCOBOLでは実装している。