「COBOL」の版間の差分

提供: miniwiki
移動先:案内検索
(1版 をインポートしました)
(内容を「 '''COBOL'''('''コボル''') コンピューターのプログラミング言語の一。事務用のデータ処理に用いられる。英文に近い命令や構...」で置換)
(タグ: Replaced)
 
1行目: 1行目:
{{Infobox プログラミング言語
 
|名前 = COBOL
 
|パラダイム = [[構造化プログラミング|構造化]]・[[命令型プログラミング|命令型]]・[[オブジェクト指向プログラミング|オブジェクト指向]]
 
|開発者 = [[グレース・ホッパー|グレース・ホッパー (Grace Hopper)]], William Selden, Gertrude Tierney, Howard Bromberg, Howard Discount, Vernon Reeves, [[:en:Jean E. Sammet|Jean E. Sammet]]
 
|登場時期 = 1959
 
|最新リリース = COBOL 2014
 
|型付け = [[型システム|強い]][[静的型付け]]
 
|プラットフォーム = [[z/OS]], [[z/VM]], [[z/VSE]], [[MCP]], [[VOS3]], [[ACOS]], [[GCOS]], [[OpenVMS|VMS]], [[OS/400]], [[UNIX]], [[Linux]], [[Microsoft Windows|Windows]], [[Mac OS]], [[CP/M]], [[MS-DOS]] ほか
 
|処理系 = フリー: [https://sourceforge.net/projects/open-cobol/ GnuCOBOL], [http://tiny-cobol.sourceforge.net/index.php TinyCOBOL], [http://www.cobol-it.com/index.php?page=products COBOL-IT]
 
  
[[UNIX]]: COBOL X/Open
+
'''COBOL'''('''コボル''')
  
[[富士通]]: [http://software.fujitsu.com/jp/cobol/ NetCOBOL], COBOL97, [http://globalserver.fujitsu.com/jp/software/cobol/ COBOL85], COBOL G
+
コンピューターのプログラミング言語の一。事務用のデータ処理に用いられる。英文に近い命令や構文規則を備え、最初期の高級言語として知られる。
 
 
[[日立]]: COBOL2002, [http://www.hitachi.co.jp/Prod/comp/soft1/cobol85/product/overview.html COBOL85]
 
 
 
[[日本電気|NEC]]: [http://jpn.nec.com/cobol/index.html COBOL], [http://www.nec.co.jp/cced/nxcob/ COBOL85 for IPF]
 
 
 
[[ヒューレット・パッカード|HP]]: [http://h71000.www7.hp.com/commercial/cobol/ HP COBOL for OpenVMS], DEC COBOL, VAX COBOL
 
 
 
[[IBM]]: [http://www-06.ibm.com/software/jp/zseries/products/awdtools_cobol_zos.html Enterprise COBOL for z/OS], [http://www-03.ibm.com/software/products/us/en/cobolaix COBOL for AIX], COBOL for OS/390 & VM, COBOL for MVS & VM, COBOL for VSE/ESA, SAA AD/Cycle COBOL/370, COBOL/400, ILE COBOL, VS COBOL II, OS/VS COBOL, DOS/VS COBOL
 
 
 
[[ICL]] (International Computers Limited) : ICL COBOL
 
 
 
[[:en:Liant|Liant Software Corporation]](Ryan McFarland): RM/COBOL
 
 
 
[[マイクロフォーカス]]: [http://www.microfocus.co.jp/products/COBOL/visualcobol/Visual_COBOL_Datasheet.asp Visual COBOL], [http://www.microfocus.co.jp/products/COBOL/netexpress/ Net Express], [http://www.microfocus.co.jp/products/COBOL/serverexpress/ Server Express], ACUCOBOL-GT(旧Acucorp社製品)
 
 
 
[[マイクロソフト]]: [http://msdn.microsoft.com/ja-jp/library/cc440080%28v=vs.71%29.aspx .NET Framework 用 COBOL], COBOL for JVM
 
 
 
[[ユニシス]] ([[UNIVAC]]) : UCOB(NPE COBOL), ACOB(ASCII COBOL)
 
 
 
[[:en:Wang Laboratories|Wang Laboratories]]: Wang VS COBOL
 
|影響を受けた言語 = [[:en:FLOW-MATIC|FLOW-MATIC]], [[:en:COMTRAN|COMTRAN]], [[:en:FACT computer language|FACT]]
 
|影響を与えた言語 = [[PL/I]], [[:en:CobolScript|CobolScript]], [[ABAP]]
 
|ライセンス =
 
|ウェブサイト =
 
}}
 
{{プログラミング言語}}
 
'''COBOL'''('''コボル''')は、1959年に事務処理用に開発された[[プログラミング言語]]である。名前は「{{lang|en|'''Co'''mmon '''B'''usiness '''O'''riented '''L'''anguage}}」(共通事務処理用言語)に由来する。
 
 
 
== 概要 ==
 
非[[理系]]の事務員や官吏でもプログラミングできる言語として設計されたため、[[自然言語]]である[[英語]]に近い記述をめざしたコマンド語彙や構文(シンタックス)が採用されている。特に金額計算など事務処理用に広く使われている。COBOLは自然言語(英語)に近い構文を持つため、そのソースコードは記述が冗長にはなるが、[[可読性#プログラミング|可読性]]が高い。本のように、部、節、段落、文という階層で記述される。人によっては関数や数式だらけの言語よりもハードルが低い。[[リフレクション (情報工学)|リフレクション]]ができないなど、モダンなプログラミング言語に比べて論理制御機能は貧弱である。一方、文字列解析や文字列編集、帳票、画面編集などの事務処理機能は豊富である。
 
 
 
COBOLは仕様の古い言語である。ただ、言語規格は拡張が続けられていて、2002年版以降では[[オブジェクト指向]]にも対応して部品性を向上した。現実のプロジェクトで制約となるのは、COBOLの言語機能の不足よりは、稼働プラットフォーム、業務運用あるいは保守体制である場合も多い。
 
 
 
COBOLは、科学技術計算向けの[[FORTRAN]]に次いで国際的な標準化が行われた、初期のプログラミング言語である。過去のバージョンとの互換性を重視した国際標準規格にしたがって多くのプラットフォームでコンパイラが開発されてきたので、COBOL to COBOLの[[マイグレーション]](プラットフォームの更新)は比較的容易である。
 
 
 
膨大なCOBOLプログラムおよびそれらの処理するデータが、企業や政府機関に長年開発し続けられ稼働している。[[ガートナー]]発という情報によれば、メインフレームが世界1万サイト以上あって3万8千の[[レガシー]]システムがあり、COBOLは全プログラム約3,100億行のうちの約65%の約2,000億行あって、毎年約50億行が増えているという
 
<ref>[http://www.uctcorp.com/cobol-programmers.asp Around 80% of the world's actively used code is none other than COBOL]</ref>
 
<ref>[http://want2change.wordpress.com/tag/cobol/ 20 Things You Might Not Know About COBOL (as the Language Turns 50)] (Darryl Taft)</ref>
 
<ref>[http://www.cobug.com/cobug/docs/MicroFocusTorontoCratosSUMMARY-PresentationJan2006.pdf Platform Migration] (CRATOS; Andrew Wickett) p.9 "COBOL Facts"</ref>。これは[[FORTRAN]]と[[アセンブリ言語|アセンブラ]]を合わせた資産の数十億行に比べて圧倒的に多い。また、世界の商用データの約75%、商用トランザクションの80%以上(Google検索の200倍以上)である。COBOL開発者は85万人以上いるが、COBOL開発者の増加より減少がずっと速いという。
 
 
 
日本国内では、2004-2009年のプロジェクトデータ2,417件をまとめた[[情報処理推進機構|IPA]]のレポートによると、1位の[[Java]](25.4%)に次いでCOBOLは16.8%で2位<ref>{{PDFlink|[http://sec.ipa.go.jp/users/publish/SEC-TN10-002-03.pdf ソフトウェア開発データ白書2010-2011]}} ([[情報処理推進機構|IPA]]) 39ページ「図表4-4-1、4-4-2開発言語(第1回答)」</ref>である。
 
 
 
このように、誕生から半世紀たってもなお主流言語のひとつの座を占めている点で、他の初期の言語を引き離している。
 
 
 
== 誕生経緯 ==
 
[[1950年代]]、事務処理言語は開発メーカーごとに異なっていた。その統一の必要性を認識していた[[アメリカ国防総省]]によって、事務処理用の共通言語の開発が提案され、[[CODASYL]](Conference on Data Systems Languages、データシステムズ言語協議会)が設立された。そうした背景の下、[[1959年]]にCODASYLによって開発された共通事務処理用言語がCOBOLである。
 
 
 
その後、1960年1月に[[CODASYL]]執行委員会によって最初の仕様書が承認され、[[合衆国政府印刷局]]に送られた。この最初の仕様書は1960年4月に発行され、通称COBOL-60と呼ばれている<ref>{{cite book
 
  | last = Sammet
 
  | first = Jean
 
  | editor = Wexelblat, Richard L.
 
  | title = History of programming languages I
 
  | pages = 199-243
 
  | publisher = ACM
 
  | location = New York, NY, USA
 
  | year = 1981
 
  | url =
 
  | isbn = 0-12-745040-8
 
  | chapter = The early history of COBOL
 
  | chapterurl = http://portal.acm.org/citation.cfm?id=1198367
 
  | pmid = }}</ref>
 
<ref>[http://itpro.nikkeibp.co.jp/article/COLUMN/20100319/345985/ 社会を支えるCOBOL、50年の歩み - 誕生50周年、社会を支えつづけるCOBOL:ITpro]</ref>。
 
 
 
COBOLの開発により、アメリカ政府の事務処理システムは全てCOBOLのみで納品されることとなった。これに伴い、COBOLは事務処理用言語として世界中に普及することになる。
 
 
 
== 問題点と未来 ==
 
<!-- これはそれほどの特記事項でもないと思いますが→ COBOLは事務用として広く使われたため、各処理系(=各機種)ごとに多くの固有部分が発生してしまった。特に、画面処理を行なうプログラム向けの、画面処理機能は各社固有の機能となっている。-->
 
COBOL言語規格は、ローカル変数が作りにくく論理制御機能面が弱かった古典的言語からの脱皮を図っている。オブジェクト指向を採用し、入れ子プログラムを可能としたうえ、COBOLからCOBOLクラスライブラリのみならずJavaのクラスライブラリも呼べるようにするなど、相互運用性や共同開発容易性、安全性を改善してきている。
 
 
 
2013年現在、COBOLプログラマーは意外に多い。実際はCOBOLと他のプログラミング言語の両方を使えるプログラマーの比率が多い。ただ、メインフレーム事業が全盛期を過ぎるとともに、ユーザ企業のアプリケーション資産を理解しているCOBOLプログラマー、さらにはCOBOLの分かるプログラマーやCOBOL流の設計の分かるSEさえ、転職や引退で減少しつつある。COBOL資産を多く抱えている企業の周辺では人材がまだ確保されて育成を図っている一方、その外側では要員不足がじわりと将来に不安の影を投げかけている。
 
 
 
こうした状況の中、一部でメインフレームからオープン系のCOBOLへのマイグレーションが行われているとともに、従来のデータを従来のように処理できるJavaプログラムへの簡単・確実なコンバージョン、マイグレーションも望まれている。
 
 
 
== COBOLのエピソード ==
 
* COBOLもモダン化を図っているが、COBOL技術者が'''コボラー'''と呼ばれるとき、モダンでないプログラミング言語を扱っていることを揶揄するニュアンスを伴っていることがある。
 
* 「COBOLの冗長さ」は、時折[[ハッカー]]ジョークのネタにされる。例えばCOBOLのオブジェクト指向拡張案「ADD 1 TO COBOL GIVING COBOL」([[C++]]のもじり)などである。
 
* [[構造化プログラミング]]を提唱した計算機科学者[[エドガー・ダイクストラ]]は、各種言語の欠点を挙げた中でCOBOLについて「COBOLを使っていると人は無能になってしまう。COBOLの教育は犯罪とみなすべきである。」と述べた<ref name="Dijkstra1">{{cite web|url=http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD498.html|title=E. W. Dijkstra Archive: How do we tell truths that might hurt? (EWD498)|publisher=University of Texas at Austin|author=Dijkstra|accessdate=2013-01-14}}</ref>。これが書かれたのは、企業ではCOBOLで新人教育がされ、[[構造化プログラミング]]も知らずにGO TO文だらけの巨大な[[スパゲティプログラム]]を普通に書いていてレビューと障害修正が大変だった1975年である。
 
*[[2009年]]9月18日は「COBOL誕生50周年」とされ、[[マイクロフォーカス]]が50周年を祝うサイトを立ち上げた。これはCOBOLという名称が決定された1959年9月18日を、COBOLの誕生日としたものである<ref>[http://www.itmedia.co.jp/enterprise/articles/0909/19/news006.html まだまだ現役:プログラミング言語のCOBOLが誕生50周年 - ITmedia]</ref>。また、国内主要COBOL[[ベンダー]]が設立した[[非営利団体]]である[[COBOLコンソーシアム]]<ref>[http://www.cobol.gr.jp/ COBOLコンソーシアム]</ref>は、最初の公的な仕様書であるCOBOL-60が発行された1960年4月をCOBOL誕生年月とし、2010年4月16日にCOBOL誕生50周年記念セミナーを行っている<ref>[http://www.cobol.gr.jp/knowledge/material/100416_report.html COBOL誕生50周年記念セミナー 社会を支える“ことば”。これまでも、そしてこれからも]</ref>。
 
*[[2009年]]11月、マイクロフォーカスのスチュアート・マギルは、「稼動中のCOBOLプログラムは全世界で2,400億行で、年間30億行が追加されている。全世界のCOBOLプログラマは200万人。[[フォーチュン500]]の90%の企業はCOBOLプログラムを使用中。」との趣旨の発言をした<ref>[http://itpro.nikkeibp.co.jp/article/Interview/20091127/341216/ COBOLはクラウド時代も現役、09年は最も多くのコードが書かれた---英マイクロフォーカス CTO スチュアート・マギル氏 - ITpro]</ref>。
 
 
 
== COBOLの言語仕様 ==
 
年齢を表すageという変数の値を、一定の年数を表すyearsという変数の値の分だけ増やす手続きは、例えば普通のプログラミング言語では
 
 
 
: <syntaxhighlight enclose="none" lang="c" style="font-size:smaller;">age = age + years;</syntaxhighlight>([[C言語]]などでは<syntaxhighlight enclose="none" lang="c" style="font-size:smaller;">age += years;</syntaxhighlight>のように略記できる)
 
 
 
と書かれる。COBOLでも同様にCOMPUTE文によって
 
 
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">COMPUTE AGE = AGE + YEARS.</syntaxhighlight>
 
 
 
と記述することもできるが、
 
 
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">ADD YEARS TO AGE.</syntaxhighlight>(英語でそのまま「年数を年齢に加える」)
 
 
 
という表現も可能である。
 
 
 
このように、数学やアルゴリズムの知識を豊富にもっていなくても、全て現在形、語尾変化なし、など、構文上の約束事さえ覚えて、英語による理路整然とした記述ができれば、COBOLのプログラムを書けるように考えられている。つまり事務処理の手順を逐一細かく英語で書き下せば事務処理が電算化できるということである。さらにプログラムのコードそのものがプログラムの機能を説明する仕組みになっているので、そのまま読み下したときに分かりやすい。
 
 
 
こういった特性を、まだ人工知能、自然言語処理の研究が浅い時期に追求してCOBOLを設計したのは、意義深く、産業的にも効果があった。ただ、ソフトウェアが大規模化し相互に絡み合うように接続されてきた現代、動詞や前置詞を明示するかどうかという命令記述の次元だけでは視点が不足である。モジュール性、処理の強力さを含めて可読性と保守性を総合評価しなおすと、場面によってはまたちがう結果も生じてくる。
 
 
 
自然言語指向な書き方が優れているといっても、複雜な数式、関数を扱う科学技術計算分野における制御・演算には向いていない。[[二次方程式]] A X<sup>2</sup> + B X + C = 0 の解(の片方)を求める手続きは、COBOLでもCOMPUTE文を用いて簡潔に書こうとすれば、
 
 
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">COMPUTE X = (- B + (B ** 2 - 4 * A * C) ** 0.5) / (2 * A).</syntaxhighlight>
 
 
 
と一文で済む。ただし、数式を極力使わない書き方にこだわれば、
 
 
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MULTIPLY B BY B GIVING B-SQUARED.</syntaxhighlight>(BをB倍し、B-SQUAREDに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MULTIPLY 4 BY A GIVING FOUR-A.</syntaxhighlight>(Aを4倍し、FOUR-Aに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MULTIPLY FOUR-A BY C GIVING FOUR-A-C.</syntaxhighlight>(CをFOUR-A倍し、FOUR-A-Cに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">SUBTRACT FOUR-A-C FROM B-SQUARED GIVING D.</syntaxhighlight>(B-SQUAREDからFOUR-A-Cを引き、Dに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MOVE FUNCTION SQRT(D) TO ROOT-D.</syntaxhighlight>(Dの正の平方根を、ROOT-Dに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">SUBTRACT B FROM ROOT-D GIVING NUMERATOR.</syntaxhighlight>(ROOT-DからBを引き、NUMERATORに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MULTIPLY 2 BY A GIVING TWO-A.</syntaxhighlight>(Aを2倍し、TWO-Aに代入)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">DIVIDE NUMERATOR BY TWO-A GIVING X.</syntaxhighlight>(NUMERATORをTWO-Aで割り、Xに代入)
 
 
 
と演算子1個あたり1文に膨れ上がって、見通しが明らかに悪くなる。もっとも、これほど複雜な式をこのように逐一書くプログラマはおよそ現代には存在しない。
 
 
 
COBOLでは同じ処理を書くのに、少なくとも「COMPUTE ~」と書く必要もあり、他節に述べるようにいろいろなDIVISIONの記述も必要となるなど、モダンな言語より長くなりがちである。また、パズルのように巧妙な制御機能がさほど多彩に備わっているわけではない。Eclipseなどの[[統合開発環境]]でCOBOLも使えるようになったが、Javaのような小粒度なモジュールに関してもインタフェースを明確に記述するスタイルの言語よりも、そこでされるサポートは少ない。
 
 
 
このようなことから、COBOLに習熟している人がモダンな言語でのプログラミング能力が高いとは限らない。それでも、世界的に蓄積され社会を動かしているCOBOL資産を保守・更新するという使命は重要である。他言語も習熟している技術者であっても、言語の欠点を多階層な共通モジュール作成やツール作成などでカバーしながら、社会基盤を支えるCOBOL関連プロジェクトで活動している。
 
 
 
== COBOLの文法の概要 ==
 
主にANSI COBOL 1985の文法について述べる。
 
=== 表記法 ===
 
COBOLの文法は英語の表現に近い。たとえば、ある数値型変数W-NOに対し数値100、英字型変数W-CHARに文字列'ABC'を代入する場合は、以下のような表記をする。
 
 
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MOVE 100 TO W-NO.</syntaxhighlight>(または<syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">COMPUTE W-NO = 100.</syntaxhighlight>)
 
: <syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">MOVE 'ABC' TO W-CHAR.</syntaxhighlight>
 
 
 
このように、COBOLの文法は[[自然言語]](英語)に類似した文章的なものであることから、その[[可読性]](ドキュメント性)の面で優れていると言われている。ただし、数学の定理を例にとれば、それを自然言語に直したところで理解が容易になるわけではないため、これは否定派にはCOBOLの冗長性と捉えられる部分でもある。
 
 
 
=== プログラムの書式 ===
 
典型的なCOBOLの原始(ソース)プログラムは、FORTRANと同様にカラム固定形式で記述する。
 
 
 
; 1~6カラム目「一連番号」
 
: 各行を識別するために、6桁のシーケンシャル番号を記述することができる。
 
; 7カラム目「標識領域」
 
: その行の標識を記述する。例えば、アスタリスクを記述すると、その行は注記行となる。
 
; 8~11カラム目「A領域」
 
; 12~72カラム目「B領域」
 
: A領域およびB領域に、コードを記述する。ピリオドおよびその後に続くスペースを記述してコードの行末を示す。
 
 
 
最近のCOBOLコンパイラには、行の長さが固定である必要がなく、一連番号の不要な自由形式をサポートするものがある。
 
 
 
=== COBOLプログラムの基本構造 ===
 
COBOLのプログラムは、次の4つのDIVISIONをこの順番で記述するのが基本となっている。
 
 
 
* IDENTIFICATION DIVISION……見出し部
 
* ENVIRONMENT DIVISION……環境部
 
* DATA DIVISION……データ部
 
* PROCEDURE DIVISION……手続き部
 
 
 
==== IDENTIFICATION DIVISION ====
 
「PROGRAM-ID」(プログラム識別名)を記述する。
 
 
 
「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)
 
* 表意定数 (Figurative Constants) - あらかじめ名称が定められている特定の意味を持つ定数(表意定数)を利用できる。この定数の実体は、実行されるシステムよってその意味が有効になるように実現される。たとえば、HIGH-VALUES、LOW-VALUESがある。
 
 
 
===== COBOLの扱うデータの特徴とメンテナンス =====
 
COBOLの代表的な変数型(項類)に、次のものがある。
 
* 数字項目 (numeric item) - 例:99999 または 9(5)
 
* 英数字項目 (alphanumeric item) - 例:XXXXX または X(5)
 
* 英字項目 (alphabetic item) - 例:AAAAA または A(5)
 
* 数字編集項目 (numeric edited item) - 例:ZZZ,ZZ9
 
* 英数字編集項目 (alphanumeric edited item) - 例:AZ9/Z9/Z9
 
 
 
COBOLでは固定長のレコード(繰り返しデータ単位)の中に固定長でデータ項目を含むという使い方が多い。たとえば、
 
<pre style="font-family:monospace;">
 
00076543SYOUYURAMEN        20121013
 
00076544SHIORAMEN          20111231
 
</pre>
 
などである。データには包含関係の階層があり、領域再定義機能により同じメモリ領域を何通りかの構成で解釈できる。
 
 
 
他の多くの言語(VB、C、Javaなど)では、改行までが繰り返しデータ単位で、その中の項目は可変長でコンマやタブなどの区切り記号で区切るという使い方が多い。たとえば[[Comma-Separated_Values|CSV]]形式
 
<pre style="font-family:monospace;">
 
76543,SYOUYURAMEN,20121013
 
76544,SHIORAMEN,20111231
 
</pre>
 
がある。最近のCOBOLコンパイラには、CSV形式の入出力をサポートするものもある。
 
 
 
COBOLでは基本項目を並べて集団項目を作る。レベル番号を用いて階層構造を作る。OCCURS句により多次元配列を作る。これらによる固定長や可変長の「[[レコード]]」(C言語などの[[構造体]]に相当)のレイアウトを定義する。なお、「レコード」という型はCOBOLによって初めて導入された概念である。
 
 
 
COBOLの階層的データの包含関係は、階層の深さを表すレベル番号"01"から"49"を各データ記述に付けることで記述される。
 
 
 
こうした階層や領域再定義などのデータ構造をもつファイルやレコードの定義と処理は、COBOLの得意とするところで、[[Java]]言語および従来のJavaのクラスライブラリによってはなかなかうまく再現できない。
 
 
 
COBOLでは、何百兆円という大きな金額の計算や、小数点以下何桁まで正確に複利計算をしても1円の誤差も出ない正確な小数計算が得意である。[[固定小数点数]]方式で整数とスケール(桁)を扱える数値項目は通常最大18桁(中間結果はそれ以上)あり、特に内部10進項目などの[[2進化10進数]]を用いれば、メモリを節約しつつ性能も確保できる。メインフレームではこれをサポートする専用のCPU命令まで設けられ、高速化が図られた。
 
 
 
このアプローチは、10進2進変換に伴う誤差が避けられない[[浮動小数点数|浮動小数点]]数によって実数を近似値で表現しようとする他の言語の発想とは対照的である。[[FORTRAN]]には浮動小数点数はあっても内部10進項目などはなかった。[[Java]]では任意桁の整数、小数を扱えるBigInteger、BigDecimalというクラスが提供されているが、文字配列で処理しているために金額計算、利息計算をCOBOLほど少ないCPUステップでは行えていない。
 
 
 
COBOLでは無名の変数等として"FILLER"という名称を記述することができる。無名項目の"FILLER"は、COBOLにおける変数等の領域の定義は固定長となるため、そのような固定長領域内での予備的な領域の確保という意味合いも有している。たとえば
 
<syntaxhighlight lang="cobol">
 
000100 01 PRODUCT-REC.
 
000200    03 PRODUCT-NO    PIC 9(8).
 
000300    03 ...
 
000400    03 PRODUCT-NAME  PIC X(20).
 
000500    03 FILLER        PIC X(500).
 
</syntaxhighlight>
 
で予備項目500バイトを含む製品レコードPRODUCT-RECを定義して他のシステムとデータを交換しはじめる。年月が経ってこのレコードに追加項目AD-START-DATE(広告開始日)が発生したら、FILLERを削ってその新項目に宛てることで、授受データのレコード長を変更しなくて済む。
 
<syntaxhighlight lang="cobol">
 
000100 01 PRODUCT-REC.
 
000200    03 PRODUCT-NO    PIC 9(8).
 
000300    03 ...
 
000400    03 PRODUCT-NAME  PIC X(20).
 
000500    03 AD-START-DATE  PIC 9(8).
 
000600    03 FILLER        PIC X(492).
 
</syntaxhighlight>
 
FILLERによって、固定長レコードファイルの運用が円滑になった。ただ、この例で500バイトを使い切れば、やはりレコード長の変更が必要になる。だからといってむやみに長いFILLERを入れると、容量的な効率低下を招くのでバランスが必要である。
 
 
 
製品が多くなってPRODUCT-NO(製品番号)を8桁から12桁に拡張しようとすると、後続の項目群の開始番地が順繰りにずれてしまうので変更の影響が大きい。
 
 
 
COBOLが扱うデータベースの領域定義も、多くの場合同様に固定長の項目からなるレコードという考えで行われてきた。
 
 
 
システムが実際に入力したデータがプログラムが用意した桁数を1桁でも超えたとき、SIZE ERRORとしてエラー処理を行うのが普通である。オプションにより上を切り落として続行も可能。桁数が不足したときにデータのミスでなければ、プログラムとそのデータを授受するシステムのプログラムで一斉に桁数を増やす修正をしなければならない。データの変換も必要となる。
 
 
 
このように桁数やバイト数の変更は大変なため、COBOLプログラマやSEは常に桁数やバイト数の設定や変更を意識し、プログラムの使用されるのが何十年でもその間になるべく桁溢れが起こらないように目を配って作業している。
 
 
 
以上のような特徴は、固定長レコードやその中の文字列や数値を容易にかつ厳密に扱えるというCOBOLの大きな長所にともなう、保守、機能追加していく上での大きな短所である。
 
 
 
===== 補足 =====
 
* COBOLのデータ型の宣言で、COBOL85以前から可変長のデータ宣言も可能になっている。
 
* COBOLの仕様拡張により、ポインタ操作も可能になっており、実装しているCOBOLコンパイラも複数、開発されている。
 
* DBMSとの連携により、データベースを操作する場合、DBMS側でレコードの定義、ビューの定義などを行う。そのため、レコードのフィールド変更などがあっても、ビューなどで変更対象のフィールドを参照するアプリケーション以外は、修正や再コンパイルは必要ない。
 
* RDBMSとの連携では、可変長データ、BLOBなど、多様なデータ型の扱いも可能となっている。ただし、COBOL側の受け渡しの変数の宣言は、COBOLコンパイラにより、COBOLの可変長データ型を使うものと、COBOLでは有効長を持つ固定長データ型を使うものなど、開発元による実装の違いがある。
 
 
 
==== PROCEDURE DIVISION ====
 
実行されるプログラムの内、実際の処理部分のコードを記述する。
 
引数を受け取る場合は、「PROCEDURE DIVISION USING 引数名 [, 引数名……]」という書き方をする。
 
 
 
上記3つのDIVISIONを記述したあとやっと「PROCEDURE DIVISION」で実行手順のコードを記述する文法であるため、COBOLは「前置きが長い」言語ともいえる。
 
 
 
[[予約語 (COBOL)|COBOLの予約語]]の数は膨大で、文字数の長いものが多い。
 
 
 
== コードの実例 ==
 
=== 実例1 ([[Hello world]]) ===
 
<syntaxhighlight lang="cobol">
 
000100 IDENTIFICATION DIVISION.
 
000200 PROGRAM-ID. HELLO.
 
000300 PROCEDURE DIVISION.
 
000400    DISPLAY 'HELLO, WORLD!'.
 
000500    STOP RUN.
 
</syntaxhighlight>
 
出力
 
<pre style="font-family:monospace;">
 
HELLO, WORLD!
 
</pre>
 
この例では DISPLAY命令を使って文字列をコンソールまたは標準出力に出力している。
 
 
 
COBOLはレコードレイアウトの決まったファイルの処理に使われることが多い。その場合はふつう、ファイル節(FILE SECTION)にレコードとそれを構成するデータ群の定義を書く。そして、実行部(PROCEDURE DIVISION)のREAD文、WRITE文などでそのレコードを読み書きする。
 
 
 
=== 実例2 (Hello world) ===
 
作業領域節(WORKING-STORAGE SECTION)にデータを定義した例。
 
 
 
<syntaxhighlight lang="cobol">
 
000100 IDENTIFICATION DIVISION.
 
000200 PROGRAM-ID. HELLO.
 
000300 DATA DIVISION.
 
000400 WORKING-STORAGE SECTION.
 
000500 01 HELLO1      PIC X(15).
 
000600 01 HELLO2.
 
000700    03 FILLER  PIC X(06) VALUE 'HELLO,'.
 
000800    03 FILLER  PIC X(01) VALUE SPACE.
 
000900    03 FILLER  PIC X(06) VALUE 'WORLD!'.
 
001000    03 FILLER  PIC X(01) VALUE SPACE.
 
001100    03 FILLER  PIC 9(01) VALUE 2.
 
001200 PROCEDURE DIVISION.
 
001300    MOVE 'HELLO, WORLD! 1' TO HELLO1.
 
001400    DISPLAY HELLO1.
 
001500    DISPLAY HELLO2.
 
001600    STOP RUN.
 
</syntaxhighlight>
 
出力
 
<pre style="font-family:monospace;">
 
HELLO, WORLD! 1
 
HELLO, WORLD! 2
 
</pre>
 
 
 
=== 実例3 ([[Fizz Buzz]]) ===
 
<syntaxhighlight lang="cobol">
 
000100 IDENTIFICATION DIVISION.
 
000200 PROGRAM-ID. FIZZBUZZ.
 
000300 DATA DIVISION.
 
000400 WORKING-STORAGE SECTION.
 
000500 01 I  PIC 9(3).
 
000600 PROCEDURE DIVISION.
 
000700    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
 
000800      EVALUATE FUNCTION MOD(I 3) = ZERO
 
000900          ALSO FUNCTION MOD(I 5) = ZERO
 
001000      WHEN TRUE  ALSO TRUE
 
001100        DISPLAY 'FIZZBUZZ'
 
001200      WHEN TRUE  ALSO FALSE
 
001300        DISPLAY 'FIZZ'
 
001400      WHEN FALSE ALSO TRUE
 
001500        DISPLAY 'BUZZ'
 
001600      WHEN OTHER
 
001700        DISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)
 
001800      END-EVALUATE
 
001900    END-PERFORM.
 
002000    STOP RUN.
 
</syntaxhighlight>
 
出力
 
<pre style="font-family:monospace;">
 
1
 
2
 
FIZZ
 
4
 
BUZZ
 
FIZZ
 
7
 
8
 
FIZZ
 
BUZZ
 
11
 
 (中略)
 
FIZZBUZZ
 
91
 
92
 
FIZZ
 
94
 
BUZZ
 
FIZZ
 
97
 
98
 
FIZZ
 
BUZZ
 
</pre>
 
COBOLでは[[除法|剰余]]を求める際に、[[商]]・剰余それぞれを格納する変数を定義した上でDIVIDE文を用いることが多いが、商は不要で剰余のみが知りたい場合や、それを変数に格納しておく必要が無い場合は、組み込み関数の[[MOD]]を用いても良い。
 
 
 
また、COBOLの数字項目は定義された桁数よりも少ない桁数の値が格納された場合、[[ゼロサプレス|ゼロパディング]]した状態で扱うため、このまま表示させると001、002、…、098と先頭に0が補われて表示されてしまう。<math>N</math>桁で定義された数字項目に、正の整数<math>n</math>が格納された場合、その最上位桁の位置は左から<math>N - \left \lfloor \log_{10} n \right \rfloor</math>カラム目であるから、上記のように<syntaxhighlight enclose="none" lang="cobolfree" style="font-size:smaller;">DISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)</syntaxhighlight>と記述することで、パディングされた0を除いた部分だけを表示させることが出来る。
 
 
 
なお、0、[[正の数と負の数|負の数]]、[[小数]]を扱う場合は、下記のように数字編集項目による[[ゼロサプレス]]とUNSTRING文を組み合わせることでパディングされた0を除いて表示させることが出来る。
 
<syntaxhighlight lang="cobol" highlight="6-8,20-25">
 
000100 IDENTIFICATION DIVISION.
 
000200 PROGRAM-ID. FIZZBUZZ.
 
000300 DATA DIVISION.
 
000400 WORKING-STORAGE SECTION.
 
000500 01 I                                PIC S9(3).
 
000600 01 HENSHU-IKI                      PIC X(4).
 
000700 01 HENSHU-NUM REDEFINES HENSHU-IKI  PIC ---9.
 
000800 01 DUMMY-IKI                        PIC X(1).
 
000900 PROCEDURE DIVISION.
 
001000    PERFORM VARYING I FROM -100 BY 1 UNTIL I > 100
 
001100      EVALUATE FUNCTION MOD(I 3) = ZERO
 
001200          ALSO FUNCTION MOD(I 5) = ZERO
 
001300      WHEN TRUE  ALSO TRUE
 
001400        DISPLAY 'FIZZBUZZ'
 
001500      WHEN TRUE  ALSO FALSE
 
001600        DISPLAY 'FIZZ'
 
001700      WHEN FALSE ALSO TRUE
 
001800        DISPLAY 'BUZZ'
 
001900      WHEN OTHER
 
002000        COMPUTE HENSHU-NUM = I
 
002100        UNSTRING
 
002200          HENSHU-IKI DELIMITED BY ALL SPACE
 
002300          INTO DUMMY-IKI HENSHU-IKI
 
002400        END-UNSTRING
 
002500        DISPLAY HENSHU-IKI
 
002600      END-EVALUATE
 
002700    END-PERFORM.
 
002800    STOP RUN.
 
</syntaxhighlight>
 
COBOLの数字編集項目によるゼロサプレスは、単純に0を空白に置き換えるだけであるから、先頭に空白が生じる(=整数部分が右寄せになる)。ゼロサプレスを行い更に先頭の空白も除去したい(=左寄せにしたい)場合は、空白を区切り文字に指定してUNSTRING文を用いれば良い。上記の例では、UNSTRING文実行後の変数DUMMY-IKIには常に空白が入り(対象の文字列がいきなり空白=区切り文字から始まり、その前には何も無いため、何も入らない=空白が入る)、変数HENSHU-IKIには数字の部分だけが入る。
 
 
 
=== 実例4 (Fizz Buzz) ===
 
<syntaxhighlight lang="cobol">
 
000100 IDENTIFICATION DIVISION.
 
000200 PROGRAM-ID. FIZZBUZZ.
 
000300 DATA DIVISION.
 
000400 WORKING-STORAGE SECTION.
 
000500 01 I          PIC 9(3).
 
000600 01 HENSHU-IKI  PIC X(8).
 
000700 PROCEDURE DIVISION.
 
000800    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
 
000900      MOVE SPACE TO HENSHU-IKI
 
001000      IF FUNCTION MOD(I 3) = ZERO
 
001100        MOVE 'FIZZ' TO HENSHU-IKI
 
001200      END-IF
 
001300      IF FUNCTION MOD(I 5) = ZERO
 
001400        STRING
 
001500          HENSHU-IKI DELIMITED BY SPACE
 
001600          'BUZZ' DELIMITED BY SIZE
 
001700          INTO HENSHU-IKI
 
001800        END-STRING
 
001900      END-IF
 
002000      IF HENSHU-IKI = SPACE
 
002100        MOVE I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)
 
002200          TO HENSHU-IKI
 
002300      END-IF
 
002400      DISPLAY HENSHU-IKI
 
002500    END-PERFORM.
 
002600    STOP RUN.
 
</syntaxhighlight>
 
出力結果は実例3と同じであるが、STRING文による文字列の連結を利用することで、3の倍数かつ5の倍数(すなわち15の倍数)か否かの判定を無くしている。なお、上記の例におけるSTRING文は、[[Java]]等における<syntaxhighlight enclose="none" lang="java" style="font-size:smaller;">henshu_iki = henshu_iki + "Buzz";</syntaxhighlight>(あるいはこれを略記した<syntaxhighlight enclose="none" lang="java" style="font-size:smaller;">henshu_iki += "Buzz";</syntaxhighlight>)と同様の動作をする。
 
 
 
== 標準化 ==
 
CODASYLによって標準化が行われてきて、また、[[ANSI]]や[[ISO/IEC JTC 1]] SC22/WG4などによっても標準化されていた。
 
1992年1月にCODASYLのCOBOL委員会とANSIのCOBOL委員会は一本化された。
 
{| class="wikitable"
 
|-
 
!
 
!米国規格
 
!国際規格
 
!日本規格
 
!主な改正点など
 
|-
 
!第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年制定
 
|オブジェクト指向、マルチバイト文字<ref>[http://www.cobol.gr.jp/knowledge/next_standard/standard002.html 第4次COBOL規格 COBOL2002のご紹介]</ref>
 
|-
 
!第5次規格
 
|
 
|2014年制定
 
|
 
|TRIM組込関数、動的長基本項目
 
|-
 
|}
 
なお、国際規格は ISO/IEC 1989<ref>[https://www.iso.org/standard/51416.html ISO/IEC 1989:2014 - Information technology -- Programming languages, their environments and system software interfaces -- Programming language COBOL]</ref>、日本規格は JIS X3002<ref>[http://www.jisc.go.jp/app/jis/general/GnrJISSearch.html 日本工業標準調査会:データベース検索-JIS検索]</ref>(旧JIS C 6205)である。
 
 
 
== 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機能
 
** (追加)定数の連結
 
** (追加)画面制御機能
 
** (追加)いくつかの組み込み関数
 
** (廃止)区分化機能
 
** (変更)語の長さを60字以下までとする。
 
* COBOL-93(最終版)
 
** (追加)マルチオクテット処理
 
** (追加)ファイルの排他共用制御
 
** (追加)いくつかの組み込み関数
 
** (変更)語の長さを30字以下までにもどす。
 
 
 
== 関連項目 ==
 
* [[グレース・ホッパー]] - COBOLの開発者。俗に「COBOLの母」と呼ばれる。
 
* [[FORTRAN]]
 
* [[COBOL/S]] - [[NEC]]の汎用機([[ACOS]])用COBOL。
 
 
 
== 脚注 ==
 
{{脚注ヘルプ}}
 
{{Reflist|2}}
 
 
 
== 外部リンク ==
 
*[http://www.cobol.gr.jp/ COBOLコンソーシアム]
 
*[http://itpro.nikkeibp.co.jp/article/COLUMN/20100319/345985/ 社会を支えるCOBOL、50年の歩み - 日経コンピュータ]
 
 
 
{{プログラミング言語一覧}}
 
  
 +
{{テンプレート:20180815sk}}
 
[[Category:プログラミング言語]]
 
[[Category:プログラミング言語]]
 
[[Category:グレース・ホッパー]]
 
[[Category:グレース・ホッパー]]

2019/5/10/ (金) 10:06時点における最新版

COBOLコボル

コンピューターのプログラミング言語の一。事務用のデータ処理に用いられる。英文に近い命令や構文規則を備え、最初期の高級言語として知られる。



楽天市場検索: