COBOL

出典: フリー百科事典『ウィキペディア(Wikipedia)』

COBOLコボル, COmmon Business Oriented Languageの略)は事務処理用に開発されたプログラミング言語である。英語圏の技術者に理解しやすい文法であり、大型計算機における主流言語のひとつである。

目次

[編集] 誕生経緯

1950年代、事務処理言語は開発メーカーごとに異なっていた。その統一の必要性を認識していたアメリカ国防総省によって、事務処理用の共通言語の開発が提案され、CODASYL(Conference on Data Systems Languages、データシステムズ言語協議会)が設立された。そういった背景の下、1959年にCODASYLによって開発された共通事務処理用言語がCOBOLである。

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

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

[編集] CODASYL COBOLの言語仕様の変遷

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次規格の元になる。
    • (追加)デバッグ機能
    • (追加)MARGE文
    • (追加)データ初期化のためのINITIALIZE文
    • (変更)報告書作成機能の全面的な改定
    • (廃止)RANGE句
  • 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機能
    • (追加)定数の連結
    • (追加)画面制御機能
    • (変更)組み込み関数
    • (廃止)区分化機能
  • COBOL-93
    • (追加)マルチオクテット処理
    • (追加)ファイルの排他共用制御

[編集] COBOLの文法の概要 (主にANSI COBOL 1985)

[編集] 表記法

COBOLの文法は英語の表現に近い。たとえば、ある変数 W-NO に対し数値 1 、W-CHARに'ABC'を代入する場合は、以下のような表記をする。

MOVE  1       TO  W-NO.
MOVE  'ABC'   TO  W-CHAR.

このように、COBOLの文法は自然言語(英語)に類似した文章的なものであることから、その可読性(ドキュメント性)の面において優れていると言われている。(ただしこれは、否定派からCOBOLの冗長性と捉えられる部分でもある。数学の定理を例にとれば、それを自然言語に直したところで理解が容易になるわけではないからである。)

[編集] プログラムの書式

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

  • 1~6カラム目「一連番号」
各行を識別するために、6桁のシーケンシャル番号を記述することができる。
  • 7カラム目「標識領域」
その行の標識を記述する。例えば、アステリスクを記述すると、その行は注記行となる。
  • 8~11カラム目「A領域」
  • 12~72カラム目「B領域」
A領域及びB領域において、コードを記述する。ピリオド(厳密にはピリオド及びその後に続くスペース)を記述してコードの行端を示す

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

COBOLのプログラムは、次の4つのDIVISIONがその基本構造となっており、次の順番の通りにこれらのDIVISIONを記述することが必要である。(カッコ及びカッコ内の日本語は説明のために付与したものである。)

  • 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)

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の特徴の一つである。

[編集] 標準化

CODASYLによって標準化が行われてきたが、ANSIISO/IEC JTC 1 SC22/WG4などによっても標準化されている。 なお、1992年1月にCODASYLのCOBOL委員会とANSIのCOBOL委員会は一本化された。

  • 第1次規格 米国規格1968年制定,国際規格1972年制定,日本規格1972年制定 最初の規格
  • 第2次規格 米国規格1974年制定,国際規格1978年制定,日本規格1980年制定 主な改正点:相対・検索ファイル
  • 第3次規格 米国規格1985年制定,国際規格1985年制定,日本規格1988年制定 主な改正点:構造化プログラミング
  • 第3次追捕規格 米国規格追捕1989年制定,国際規格追捕1992年制定,日本規格1992年制定 主な改正点:組込関数
  • 第4次規格 国際規格2002年制定 主な改正点:オブジェクト指向、マルチバイト文字

[編集] 問題点と未来

COBOLは事務用として広く使われたため、各処理系(=各機種)ごとに多くの固有部分が発生してしまった。特に、画面処理を行なうプログラム向けの、画面処理機能は各社固有の機能となっている。

また、言語仕様が古くからあり、論理制御機能が弱い問題点もあった。それらはCOBOLの言語仕様の改訂ごとに徐々に改善されて来ている。

[編集] コードの実例1 (Hello World)

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.     HELLOWORLD.
000300 DATE-WRITTEN.   02/05/96        21:04.
000400*       AUTHOR    BRIAN COLLINS
000500 ENVIRONMENT DIVISION.
000600 CONFIGURATION SECTION.
000700 SOURCE-COMPUTER. RM-COBOL.
000800 OBJECT-COMPUTER. RM-COBOL.
000900
001000 DATA DIVISION.
001100 FILE SECTION.
001200
100000 PROCEDURE DIVISION.
100100
100200 MAIN-LOGIC SECTION.
100300 BEGIN.
100400     DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
100500     DISPLAY "HELLO, WORLD." LINE 15 POSITION 10.
100600     STOP RUN.
100700 MAIN-LOGIC-EXIT.
100800     EXIT.

この例では DISPLAY命令を使い、コンソール(または標準出力)に結果を出力しているが、基本的にCOBOLはファイルの処理が主体である。従ってFILE SECTIONにファイル定義を書くのが基本的な処理方法である。


[編集] コードの実例2 (Hello World)

000100 IDENTIFICATION          DIVISION.
000200 PROGRAM-ID.             HELLO.
000500 ENVIRONMENT            DIVISION.
001000 DATA DIVISION.
001100 WORKING-STORAGE    SECTION.
001200 77  HELLO1                 PIC X(12)  VALUES 'HELLO WORLD!'.
001300 01  HELLO2.
001400    03  FILLER                PIC X(12) VALUES 'HELLO WORLD!'.
100000 PROCEDURE DIVISION.
100100 HAJIME.
100200     DISPLAY 'HELLO WORLD!'.
100300     DISPLAY HELLO1.
100400     DISPLAY HELLO2.     
100500     STOP RUN.

[編集] その他

「COBOLの冗長さ」は有名で、時折ハッカージョークのネタにされる。例えばCOBOLのオブジェクト指向拡張案「ADD 1 TO COBOL GIVING COBOL」(C++のもじり)などである。

2003年出版の書籍『13歳のハローワーク』(村上龍)では「COBOLは過去の言語で、修正できるプログラマは皆死んでしまった」という趣旨の記載がされた。また、マスコミでも「日本のメガバンクや官公庁は前時代のCOBOLを使っているから効率が悪い」との指摘が多い。しかし現実には2008年現在でも、CやJavaと並んで、多数の企業・組織でCOBOLは使われ続けているのが現実であり、システムの更新コストや労力等を総合的にみれば、使用言語のみで効率を判断するのは間違いであることがわかる。

[編集] 関連項目