#author("2018-02-28T11:57:43+09:00","","") #author("2018-02-28T13:25:05+09:00","","") [[COBOLプログラミング入門]] #contents COBOLプログラミングについてはじめての方でもわかるように図解を取り入れわかりやすく解説しているCOBOL入門サイトです。 * 第1章 COBOL概要 [#zf776563] ** COBOLとは [#l28ee588] * 第1章 COBOL概要 [#f5d6e628] ** COBOLとは [#q8c3bed9] COBOL(COmmon Business Oriented Language)はアメリカで生まれた事務処理のための高級言語です。 COBOLが開発されたのが1959年9月。 誕生したのがもう半世紀以上も前のことです。 その当時、COBOL以外にもさまざまなプログラミング言語が存在しています。 高級言語としてはFORTRANやLIPSが代表例と言えるでしょう。 現在のように音楽や動画などのマルチメディアをコンピュータで楽しむことなんてまったくない時代。 インターネットもまだ生まれていません。 そんな時代にどんなシステムが開発されていたのかというと、弾道計算に代表される科学技術計算などの研究者向けのシステムと給与計算に代表される事務処理系システムが主だったそうです。 FORTRANは科学技術計算用、LIPSは人工知能の研究・開発に主に使われていたプログラミング言語でしたが、それらの言語はその特性上、事務処理系のプログラム開発には向いていません。 しかし、事務処理系のプログラムのニーズも高く、効率良く開発できるプログラミング言語が求められるようになりました。 そのような背景のもと、事務処理系のプログラム開発に最適化されたCOBOLが開発されました。 高級言語の誕生年表[図1] * 第2章 COBOLプログラムの構成 [#e9232156] ** COBOLプログラムの全体構成 [#u36c7957] * 第2章 COBOLプログラムの構成 [#j4360a1a] ** COBOLプログラムの全体構成 [#v60bb3f9] COBOLプログラムは、全体が4つの部に分かれて構成されます。 さらに各部にはいくつかの節や段落に分けられています。 それぞれの部で、それぞれの役割が明確になっているのがCOBOLのひとつの特徴であり、COBOLソースは可読性が高いと言われるひとつの要因と言えます。 しかしその点が、他言語プログラマがはじめてCOBOLを用いるときにつまづきやすいところでもあります。 例えば、VBでは変数をソース上のどこででも宣言することができますが、COBOLではデータ部でしかできません。 ささいなことのようですが、VBプログラマにとって意外と不便に感じられる点と言えるでしょう。 下図はCOBOLプログラムの全体構成になります。 まずは見出し部(IDENTIFICATION DIVISION)からはじまり、環境部(ENVIRONMENT DIVISION)、データ部(DATA DIVISION)、手続き部(PROCEDURE DIVISION)と続きます。 見出し部(IDENTIFICATION DIVISION) - プログラム名 - 作成者名 - 作成日時 etc... 環境部(ENVIRONMENT DIVISION) - 作成する環境変数 - 使用するファイル名 etc... データ部(DATA DIVISION) - データ項目(変数)の定義 - ファイルのレイアウト etc... 手続き部(PROCEDURE DIVISION) - 処理内容 ** 見出し部(IDENTIFICATION DIVISION) [#x013f5c4] ** 見出し部(IDENTIFICATION DIVISION) [#i3059d91] 見出し部(IDENTIFICATION DIVISION)はCOBOLプログラムで最初に記述する部になります。 見出し部には、プログラム名やその作成者、作成日などのプログラムのメンテナンス情報を記述します。 それらを見出し部内の段落として記述していくことになります。 見出しに含まれる段落 |見出し部|段落|h |IDENTIFICATION DIVISION--|--PROGRAM-ID プログラム名| | |L--AUTHOR プログラムの作成者| | |L--DATE-WRITTEN プログラム作成日| | |L--DATE-COMPILED コンパイル日| | |L--INSTALLATION インストール先| | |L--SECURITY 機密事項| なお、見出し部には節(SECTION)は存在しません。 下記は実際の記述例です。 000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. SAMPLE001. 000030 AUTHOR. T-KATO. 000040 DATE-WRITTEN. 2012/3/16. 000050 DATE-COMPILED. 2012/3/16. ** 環境部(ENVIRONMENT DIVISION) [#y792c156] ** 環境部(ENVIRONMENT DIVISION) [#j13844fb] 環境部(ENVIRONMENT DIVISION)はCOBOLプログラムで2番目に記述する部になります。 環境部には、作成しようとしているプログラムを翻訳(コンパイル)するコンピュータ名や実行するコンピュータ名、さらに使用する環境変数の受け渡し情報やプログラムから読み書きするファイルの名前や種類などを定義します。 通信部に含まれる節と段落 |環境部|節|段落|h |ENVIRONMENT DIVISION--- |--- CONFIGURATION SECTION 構成節| | | | |L-- SOURCE-COMPUTER 翻訳するコンピュータ名| | | |L-- OBJECT-COMPUTER 実行するコンピュータ名| | |L-- INPUT-OUTPUT SECTION 入出力節| | | | |L-- FILE-CONTROL ファイル管理| 下記は実際の記述例です。 000070 ENVIRONMENT DIVISION. 000080 CONFIGURATION SECTION. 000090 SOURCE-COMPUTER. MYCOMPUTER. 000100 OBJECT-COMPUTER. MYCOMPUTER. 000110 INPUT-OUTPUT SECTION. 000120 FILE-CONTROL. 000130 SELECT IN-FILE ASSIGN TO ID01 000140 ORGANIZATION IS LINE SEQUENTIAL. 000150 SELECT OUT-FILE ASSIGN TO OD01 000160 ORGANIZATION IS LINE SEQUENTIAL. 翻訳するコンピュータ名(SOURCE-COMPUTER)や実行するコンピュータ名(OBJECT-COMPUTER)段落はプログラムの動作に影響することはない段落であるため、省略されることが多いです。 しかし、ファイル管理(FILE-CONTROL)段落などは影響があるのでファイルの入出力を行うのであれば、しっかりと記述する必要があります。 具体的な記述方法に関しては後の記事で紹介します。 ** データ部(DATA DIVISION) [#t2f55e46] ** データ部(DATA DIVISION) [#w2ab2229] データ部はCOBOLプログラムで3番目に記述する部になります。 これまでの部がCOBOLプログラムを作り上げていく上での事前準備のようなものと言え、ここからの部がプログラムを実際に作り上げていく箇所になります。 データ部では、入出力ファイルのレイアウト、データ項目(変数)、外部プログラムとのインターフェイス(引数)などプログラム上で取り扱う全てのデータを定義します。 通信部に含まれる節 |データ部|節|h |DATA DIVISION ---|--- FILE SECTION ファイル| | |L-- WORKING-STORAGE SECTION 作業場所| | |L-- LINKAGE SECTION 連絡| | |L-- COMMUNICATION SECTION 通信| | |L-- REPORT SECTION レポート| 作業場所節(WORKING-STORAGE SECTION)ではプログラム上で使用する全ての変数定義を行います。 連絡節(LINKAGE SECTION)は外部プログラムとのデータのやり取りに関する情報を定義します。 (C言語でいう、main()関数の引数にあたります。) また、COBOLでは入出力ファイルのレイアウトをファイル節(FILE SECTION)で明確に定義します。 他にも通信節とレポート節があります。 下記は実際の記述例です。 000180 DATA DIVISION. 000190 FILE SECTION. 000200 FD IN-FILE. 000210 01 IN-RECORD. 000220 03 IN-SYOHIN-CODE PIC X(6). 000230 03 IN-SYOHIN-NAME PIC X(30). 000240 03 IN-SYOHIN-TANKA PIC 9(8). 000250 WORKING-STORAGE SECTION. 000260 77 WRK-COUNT PIC 9(2). 000270 LINKAGE SECTION. 000280 REPORT SECTION. 000290 SCREEN SECTION. 各節にはそれぞれ段落があります。 具体的な記述方法に関しては後の記事で紹介します。 ** 手続き部(PROCEDURE DIVISION) [#cfc3ec8b] ** 手続き部(PROCEDURE DIVISION) [#s61c1155] 手続き部(PROCEDURE DIVISION)はCOBOLプログラムで最後に記述する部になります。 手続き部では、プログラムが行う処理内容を記述していきます。 これまでの部と違い、手続き部には規定の節や段落は存在しません。 それらはプログラム作成者が必要に応じて作成していくことになります。 節がC言語で言うところの、関数にあたります。 段落は節の中をさらに小さく括った処理のまとまりになります。 下記は実際の記述例です。 000310 PROCEDURE DIVISION. 000320 PERFORM INIT-PROC. 000330* 000340 PERFORM MAIN-PROC. 000350* 000360 STOP RUN. 000370* 000380 INIT-PROC SECTION. 000390* 000400 MOVE ZERO TO WRK-COUNT. 000410* 000420 OPEN INPUT IN-FILE. 000430 PERFORM INFILE-READ-PROC. 000440* 000450 INIT-PROC-EXIT. 000460* 000470 EXIT. 行番「000320」から「000360」までが、このプログラムのメイン処理となります。 (C言語で言う、main()関数にあたります。) 行番「000380」(INIT-PROC)から「000450」(INIT-PROC-EXIT)までがひとつの節となります。 (C言語で言う、関数にあたります。) * 第3章 COBOLコーディングルール [#md98de04] ** コーディングフォーマット [#nb4d558a] * 第3章 COBOLコーディングルール [#a570c94c] ** コーディングフォーマット [#nabcdb7a] COBOLでは、プログラムをコーディング(記述)していく上でのコーディングルールが定められています。 プログラム作成者はそのコーディングルールに従ってコーディングを行っていく必要があります。 1行は80文字以内、その80文字の中で、5つの領域に分けてコーディングをしなければなりません。 それぞれの領域には何を記述するのかが定められています。 コーディングフォーマット [図2] 上図のように、1行80文字以内にし、行内では「一連番号領域」「標識領域」「A領域」「B領域」「見出し領域」という5つの領域に分けられます。 *** 一連番号領域 [#c541c594] *** 一連番号領域 [#t22acf47] 先頭から6文字分を「一連番号領域」と言います。 一連番号領域にはプログラムの行番号を6桁の数字で記述します。 記述する行番号は「000010」や「000100」からスタートし、一行ごとに10、もしくは100ずつ加算していくのが一般的な書き方となっています。 ただし、最近のコンパイラはこの一連番号領域を無視するので、番号が正しく昇順に並んでなくても問題とはなりません。 そのため全行「000000」としたり、何も書かずにスペースで埋めてしまう書き方もよく見られます。 *** 標識領域 [#c93808a9] *** 標識領域 [#e3b59e9e] 先頭から7文字目を「標識領域」と言います。 標識領域には、その名のとおり、8文字目以降に何が書かれているのかを空白または記号で示します。 |記号|内容|h |空白|この行がCOBOLプログラムのコードであることを示す。 | |*|この行がコメント行(翻訳しない行)であることを示す。 | |/|COBOLソースコード印刷時における改ページ行であることを示す。(この行は翻訳されない)| |–|前行からの継続であることを示す。 | *** A領域 [#qfcea2e2] *** A領域 [#e8d03087] 先頭から8~11文字目までを「A領域」と言います。 各部の開始宣言(IDENTIFICATION DIVISIONなど)、節や段落の宣言、データ項目のレベル番号をこの領域の先頭から書き始めます。 *** B領域 [#ne5a71f2] *** B領域 [#sf2fd3c2] 先頭から12~72文字目までを「B領域」と言います。 手続き部の命令文や作業領域のレベル番号などを記述します。 *** 見出し領域 [#paa7f801] *** 見出し領域 [#vd5c0626] 先頭から73~80文字目までを「見出し領域」と言います。 見出し領域は、翻訳対象外の領域であり、プログラムの修正日や修正者名などのコメント的な記述を行います。 ** コーディングルール [#w0865e75] ** コーディングルール [#jfc01ccc] COBOLでは、コーディングするにあたり、1行は80文字以内で書き、その80文字の中で5つの領域に分けられるということを前回の記事で紹介しましたが、他にも細かいルールがいくつかあります。 *** ピリオド(終止符) [#gdca201d] *** ピリオド(終止符) [#k7c9d110] COBOLでは、部、節、段落の宣言部、1つの命令文、命令ブロック(IF~END-IFなど)の終了をピリオドで示します。 [図3] *** ハイフンによる行継続 [#bcaf3ecd] *** ハイフンによる行継続 [#w1e8c5c1] COBOLでは、宣言文や命令文を記述できる範囲はA領域とB領域に限られています。 この制限があるため、計算式や文字列などが長くなってしまうような場合、桁数が足りなくなってしまいます。 そのような場合は、1つの文を複数行にまたがって記述することになりますが、上の行から継続していることをコンパイラに示さなければなりません。 その方法は、下図のように標識領域にハイフン(-)を記述し、A領域から前行からの続きを書いていきます。 *** 改行による行継続 [#p6cf2a6d] *** 改行による行継続 [#s3adce79] 1つの文を複数行にまたがって記述する方法には、標識領域にハイフンを記述する以外に、下図のように命令文の区切りで改行するという方法もあります。 *** コメント行 [#t00dec79] *** コメント行 [#u7a1c99f] 先頭から73~80文字目までは「見出し領域」となっており、その領域にコメントを記述することができますが、たったの8文字では記述できる内容は限られてしまいます。 プログラムの処理内容など、長いコメントを書きたい場合は多いでしょう。 そのような場合には、行全体をコメント行にしてしまう方法が使われます。 行をコメント行にするには標識領域にアスタリスク(*)を記述します。 * 第4章 入出力 [#bf8e94d6] ** COBOLでHello world! [#ta63f120] ** DISPLAY文 [#td6fc7da] ** ACCEPT文 [#ab19d8f9] * 第4章 入出力 [#j0912077] ** COBOLでHello world! [#c8c5f20d] ** DISPLAY文 [#cee4e341] ** ACCEPT文 [#e1c6b5dd] * 第5章 制御文 [#t09baa76] ** IF~THEN文による条件分岐 [#ra58a8c5] ** IF~THEN文による多岐選択 [#b42190e1] ** EVALUATE文による多岐選択 [#h037f050] ** PERFORM UNTILによる繰り返し [#wf131899] ** PERFORM VARYING UNTILによる繰り返し [#q2945d09] ** PERFORM TIMESによる繰り返し [#l9f6069e] * 第5章 制御文 [#q85be69a] ** IF~THEN文による条件分岐 [#m1c96e5c] ** IF~THEN文による多岐選択 [#ra9cf977] ** EVALUATE文による多岐選択 [#h1e6b6dd] ** PERFORM UNTILによる繰り返し [#oa4f8f8e] ** PERFORM VARYING UNTILによる繰り返し [#f9a86ef6] ** PERFORM TIMESによる繰り返し [#v983102d] * 第6章 データ定義(変数) [#b466beb8] ** COBOLのデータ定義 [#i5c5b492] ** 命名規則と特殊なデータ定義 [#ecfb52ae] ** データ型の種類 [#j0b48345] ** データ項目の定義方法(PICTURE句) [#o7769cc7] ** 定数の種類 [#jc628ea6] * 第6章 データ定義(変数) [#n7323698] ** COBOLのデータ定義 [#l17f8d0d] ** 命名規則と特殊なデータ定義 [#r36134ee] ** データ型の種類 [#gfd4e10b] ** データ項目の定義方法(PICTURE句) [#u50d47cd] ** 定数の種類 [#m55b1c81] http://tallercolibri.com/