COBOL
| COBOL | |
|---|---|
| パラダイム | 構造化・命令型・オブジェクト指向 |
| 登場時期 | 1959 |
| 開発者 | Grace Hopper, William Selden, Gertrude Tierney, Howard Bromberg, Howard Discount, Vernon Reeves, Jean E. Sammet |
| 最新リリース | COBOL 2002 |
| 型付け | 強い静的型付け |
| 主な処理系 | HP3000 COBOL/II, COBOL/2, IBM OS/VS COBOL, IBM COBOL/II, IBM COBOL SAA, IBM Enterprise COBOL, IBM COBOL/400, IBM ILE COBOL, Unix COBOL X/Open, Micro Focus COBOL, Microsoft COBOL, Ryan McFarland RM/COBOL, Ryan McFarland RM/COBOL-85, DOSVS COBOL, UNIVAC COBOL, Realia COBOL, Fujitsu COBOL, ICL COBOL, ACUCOBOL-GT, DEC VAX COBOL, Wang VS COBOL, Visual COBOL ほか |
| 影響を受けた言語 | FLOW-MATIC, COMTRAN, FACT |
| 影響を与えた言語 | PL/I, CobolScript, ABAP |
| プラットフォーム | z/OS, z/VM, z/VSE, MCP, VOS3, ACOS, GCOS, VMS, OS/400, UNIX, Linux, Windows, Mac OS, CP/M, MS-DOS ほか |
COBOL(コボル)は、事務処理用に開発されたプログラミング言語である。名前「COBOL」は「汎用の商業目的言語」を意味する英語「common business oriented language」に由来する。
目次 |
[編集] 概要
非理系の事務員や役人が使える言語として設定されたため、自然言語である英語に近い記述になるようなコマンド語彙や構文(シンタックス)になっている。特に金額計算など事務処理(商用計算)の用途に広く使われている。また科学技術計算向けのFORTRANに次いで国際的な標準化が行われた初期のプログラミング言語でもあり、メーカーやプラットフォームによる型や精度などの相違が少ないため移植性が高く、またCOBOL仕様の拡張も過去との互換性を重視して行われているため、長期間継続的に使用されている場合が多い。
このため「記述が冗長である」、「仕様が古くレガシーである」と指摘される場合も多い。ただし記述が冗長なのは自然言語(英語)に近いためであり、ソースコードのステップ数は多いが可読性は高くプラットフォーム依存性は低いため、特定箇所の修正や影響の確認などの保守作業は比較的容易である。またCOBOL自体の基本仕様が古いのは事実であるが、現実に制約となっているのは稼働プラットフォームや業務運用あるいは保守体制などである場合も多く、COBOLの言語仕様は拡張が続けられており2002年版ではオブジェクト指向にも対応している。
過去に政府や企業の膨大なデータがCOBOLによって処理され蓄積されているため、現在でもCOBOLによって電算処理されている情報は膨大な数に上る。現在でも稼動しているCOBOLによるコードは2000億行に上るとされており、これはFORTRANとアセンブラを合わせた数十億行に比べても圧倒的に多い。
このように誕生から半世紀たっているにもかかわらず、今なお主流言語として使用されている点で、他の初期の言語とは大きく異なる(2000年時点の世界の民間企業の8割、2009年の日本国内の調査で17.1%で2位[1])。
[編集] 誕生経緯
1950年代、事務処理言語は開発メーカーごとに異なっていた。その統一の必要性を認識していたアメリカ国防総省によって、事務処理用の共通言語の開発が提案され、CODASYL(Conference on Data Systems Languages、データシステムズ言語協議会)が設立された。そうした背景の下、1959年にCODASYLによって開発された共通事務処理用言語がCOBOLである。
その後、1960年1月にCODASYL執行委員会によって最初の仕様書が承認され、合衆国政府印刷局に送られた。この最初の仕様書は1960年4月に発行され、通称COBOL-60と呼ばれている[2] [3]。
COBOLの開発により、アメリカ政府の事務処理システムは全てCOBOLのみで納品されることとなった。これに伴い、COBOLは事務処理用言語として世界中に普及することになる。
COBOLより先に誕生したFORTRANが主に科学技術計算用であるのに対して、ほぼ同時期に誕生したCOBOLは大量のデータを処理するための事務処理用及び管理分野用と位置付けられる。COBOLとFORTRANは、プログラミング言語の歴史において高水準記述言語としての古典的あるいは原点ともいえる存在を示すものである。
[編集] COBOLの言語仕様
年齢を表すageという変数の値を、一定の年数を表すyearsという変数の値の分だけ増やす手続きは、例えば普通のプログラミング言語では
- age = age + years(C言語などではage += yearsのように略記できる)
と書かれる。COBOLでも同様に
COMPUTE AGE = AGE + YEARS
と記述することできるが、
ADD YEARS TO AGE (英語でそのまま「年数を年齢に加える」)
という表現も可能である。このように、数学やアルゴリズムの知識がほとんど無くとも構文上の約束事(全て現在形、語尾変化なしなど)さえ憶えて、英語による理路整然とした記述ができれば、COBOLのプログラムを取り扱うことができるようになっている。つまり事務処理の手順を逐一細かく(英語で)記述していけば事務処理が電算自動化できるという、工程的利点が存在する。さらにプログラムのコードそのものがプログラムの機能を説明する仕組みになっているので、コードをそのまま「読む」ことができるという利点もある。
一方でこのような自然な英語による書き方は数学や自然科学、工学などの分野における制御・演算には向いていない。例えば二次方程式 A X2 + B X + C = 0 の解(の片方)を求める手続きは、算術の演算子を用いれば、
COMPUTE X = (-B + (B ** 2 - (4 * A * C)) ** 0.5) / (2 * A)
と一文で済む一方、数式を使わない書き方では
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に対する需要はいまだに根強く存在する。
[編集] 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次規格の元になる。
- (追加)デバッグ機能
- (追加)MERGE文
- (追加)データ初期化のための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においては正式な文法の一つとして組み込まれている。
AUTHOR.DATE-WRITTENは廃止要素であり、記述してはならない。
[編集] 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の特徴の一つである。
[編集] 標準化
CODASYLによって標準化が行われてきたが、ANSIやISO/IEC JTC 1 SC22/WG4などによっても標準化されている。 なお、1992年1月にCODASYLのCOBOL委員会とANSIのCOBOL委員会は一本化された。
| 米国規格 | 国際規格 | 日本規格 | 主な改正点など | |
| 第1次規格 | 1968年制定 | 1972年制定 | 1972年制定 | 最初の規格 |
| 第2次規格 | 1974年制定 | 1978年制定 | 1980年制定 | 相対・検索ファイル |
| 第3次規格 | 1985年制定 | 1985年制定 | 1988年制定 | 構造化プログラミング |
| 第3次追補1規格 | 1989年追補制定 | 1992年追補制定 | 1992年制定 | 組込関数 |
| 第3次追補2規格 | 1993年追補制定 | 1994年追補制定 | 無し | 誤り訂正 |
| 第4次規格 | 2003年制定 | 2002年制定 | 2011年制定 | オブジェクト指向、マルチバイト文字[4] |
なお、国際規格は ISO/IEC 1989[5]、日本規格は JIS X3002[6]である。
[編集] 問題点と未来
COBOLは事務用として広く使われたため、各処理系(=各機種)ごとに多くの固有部分が発生してしまった。特に、画面処理を行なうプログラム向けの、画面処理機能は各社固有の機能となっている。
また、言語仕様が古くからあり、論理制御機能が弱い問題点もあった。それらはCOBOLの言語仕様の改訂ごとに徐々に改善されて来ている。
[編集] コードの実例 (Hello World)
[編集] 実例1 (Hello World)
000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. HELLOWORLD. 000300 DATE-WRITTEN. 02/05/96 21:04. 000400* AUTHOR BRIAN COLLINS 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.
この例では DISPLAY命令を使い、コンソール(または標準出力)に結果を出力しているが、基本的にCOBOLはファイルの処理が主体である。従ってFILE SECTIONにファイル定義を書くのが基本的な処理方法である。
[編集] 実例2 (Hello World)
000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. HELLO. 001000 DATA DIVISION. 001100 WORKING-STORAGE SECTION. 001200 01 HELLO1 PIC X(12) VALUE 'HELLO WORLD!'. 001300 01 HELLO2. 001400 03 PIC X(12) VALUE '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++のもじり)などである。
- COBOLプログラマーのことをコボラーと呼ぶ人も多い[7]。
- 2003年出版の書籍『13歳のハローワーク』(村上龍)では、起業家である伊藤穰一の発言として「COBOLは過去の言語で、2000年問題にまつわる不具合を修正できるプログラマは皆死んでしまった」という趣旨の記載がされ[8]話題となった。また1990年代の日本のダウンサイジング全盛期には、マスコミなどで「日本のメガバンクや官公庁は前時代のCOBOLを使っているから効率が悪い」との論調が多く見られた。しかし現実には2009年現在でも、CやJavaと並び、COBOLは多数の企業・組織で使われ続けている。
- 2009年9月18日は「COBOL誕生50周年」とされ、Micro Focusが50周年を祝うサイトを立ち上げた。これはCOBOLという名称が決定された1959年9月18日を、COBOLの誕生日としたものである[9]。また、国内主要COBOLベンダーが設立した非営利団体であるCOBOLコンソーシアム[10]は、最初の公的な仕様書であるCOBOL-60が発行された1960年4月をCOBOL誕生年月とし、2010年4月16日にCOBOL誕生50周年記念セミナーを行っている[11]。
- 2009年11月、Micro Focus社のスチュアート・マギルは、「稼動中のCOBOLプログラムは全世界で2400億行で、年間30億行が追加されている。全世界のCOBOLプログラマは200万人。フォーチュン500の90%の企業はCOBOLプログラムを使用中。」との趣旨の発言をした[12]。
[編集] 関連項目
[編集] 脚注
- ^ IPAの「ソフトウェア開発データ白書2009」の「開発に用いた言語」(一次回答のみ)で、22.0% で1位のJavaに続いて、17.1%で2位。
- ^ Sammet, Jean (1981). “The early history of COBOL”. In Wexelblat, Richard L.. History of programming languages I. New York, NY, USA: ACM. pp. 199-243. ISBN 0-12-745040-8.
- ^ 社会を支えるCOBOL、50年の歩み - 誕生50周年、社会を支えつづけるCOBOL:ITpro
- ^ 第4次COBOL規格 COBOL2002のご紹介
- ^ 「http://www.iso.org/iso/catalogue_detail.htm?csnumber=28805 」
- ^ 「http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3002%3A1992&dantaiCd=JIS&status=1&pageNo=0 」
- ^ 「コボラー ドット コム」
- ^ 村上龍・伊藤穰一 「Q&A ITの現状と可能性」『13歳のハローワーク』 幻冬舎、2003年11月30日、420頁。ISBN 4-344-00429-9。
- ^ まだまだ現役:プログラミング言語のCOBOLが誕生50周年 - ITmedia
- ^ COBOLコンソーシアム
- ^ COBOL誕生50周年記念セミナー 社会を支える“ことば”。これまでも、そしてこれからも
- ^ COBOLはクラウド時代も現役、09年は最も多くのコードが書かれた---英マイクロフォーカス CTO スチュアート・マギル氏 - ITpro