はじめてのCOBOL 学習の手引き

COBOLの記述方法

 ここでは、コボルの表記方法・定数・変数などについて説明します。定数や変数は色々なパターンがあり、全て網羅し使いこなすのは困難です。私も基本的なものしか憶えていません。実際にプログラムを作成するにあたり、最低限憶えなければいけないことのみ重点的に説明します。しっかり身につけて下さい。

  1. 記述できる範囲
  2. 記述可能な文字と記号
  3. 利用者定義語と予約語について
  4. 部分参照の表記方法


記述できる範囲

 では早速お手元のコーディング用紙を見て下さい。えっ持ってない?じゃあ無くても構いません。COBOLでは1行に80桁まで記述ができます。(桁のことをカラムと言います。以後の表記はカラムで記述します。)

まず大きく分けて一連番号領域・標識領域・A領域・B領域・プログラム識別領域という5つに分類できます。では順に説明します。

  • 一連番号領域(1~6カラム)
    プログラム行を識別するために使用されます。コーディング上は書く必要はありません。プログラム翻訳時にこの領域は無視され、番号は自動的に振られます。憶えなくて構いません。また、市販されているエディターでは、この部分自体を省いた形式で利用するソフトが大半を占めています。
  • 標識領域(7カラム目)
    通常のコーディング時は空白のままで使用しません。コメントをつける場合や前の行からの文字列が続いている場合にはココに特定の文字を記述します。
     
    • *(アスタリスク)
      コメント行とし、以下のカラムをコメントとして使用できます。
    • -(ハイフン)
      文字列のつなぎとみなし、以下のカラム記述を前行からの続きだとみなします。
    • /(スラッシュ)
      翻訳リスト時にここで改頁されます。また以下のカラムはコメントとして使用できます。
  • A領域(8~11カラム)
    各部や節の見出し(○△ DIVISION や □△ SECTION)、段落の見出し等を記述します。またDATA部のFD句やレコード記述の01、作業領域節の01,77,88なんかも同様にここから記述を始めます。
  • B領域(12~72カラム)
    各段落を構成する文(命令文も含む)を記述する場所です。ピリオドも必ずこの中で収まるようにしなければなりません。いわばメインの領域と言っても過言ではないでしょう。いや少し大袈裟ですね。
  • プログラム識別領域(73~80カラム)
    ここは全てコメントとして扱われ、プログラム翻訳時には無視されます。書く必要はありません。たまに間違えて73カラム目にピリオドつけるバカがいます。コンパイルエラーを見て「どこがエラーだゴルァァ」なんてゴリラみたいな顔で叫んでます。ええ私ですとも。


記述可能な文字と記号

 COBOLでは特定の文字と記号以外は受け付けてくれません。年寄りなんで仕方ありません。じゃあ使える文字と数字、記号を一気に紹介します。暗記パンとか画面に押し付けて無理矢理記憶しましょう。

  • 数字         0 1 2 ・・・ 9
  • 英大文字      A B C ・・・ Z
  • 英小文字      a b c ・・・ z
  • カナ文字(半角)  。「」・・・アイウ・・・ワン゛
  • 漢字         ※使用可能な漢字の範囲は機種にも依存します
  • 空白
  • 特殊文字      + - * / = \ , ; . " ( ) > < :

 なお、英小文字は対応する英大文字と同じとみなされます。但し英大文字と英小文字を合わせの文字定数、コメントなんかには任意の文字を使っても構いません。

利用者定義語と予約語について

 COBOLで使用可能な文字列の紹介をします。これは大きく利用者定義語予約語に分類できます。利用者定義語とは利用者、つまりアナタが勝手に名前をつけられる文字(文字列)のことを差しています。予約語とはFILEやSECTION、MOVEやWRITE、HIGH-VALUE、ZEROなどなど、予めCOBOL言語上で利用する定義をされている文字列や数値を差しています。以下に簡単な解説を掲載します。

利用者定義語

  • 英字・数字・ハイフンの文字の任意の組合せ
  • 30文字以内(プログラム名は8文字以内)
  • 先頭・最後にハイフン使用不可
  • システム名、予約語と同じ文字列を定義してはならない

 利用者定義語には以下のものがある

  • データ名・ファイル名・レベル番号・段落名・プログラム名・レコード名・節名
  • システム名
  • コンパイラによって定義される語で、コンピュータ名・作成者名などがある

予約語

必要語・補助語・表意定数・特殊文字などがある

  • 必要語
    プログラムの構文を規定するための幹になる語
  • 補助語
    プログラムの構文を規定するための幹になる語であるが、文章を整えるために記述するもので、記述しなくても翻訳結果に変わりはない。
  • 表意定数
    プログラムでよく使われる値には、固有のデータ名がつけられている
    1. ZERO,ZEROS,ZEROES:何桁かの0
    2. SPACE,SPACES:1つ以上の空白が連続する文字列を意味する
    3. QUOTE,QUOTES:1つ以上の引用符が連続する文字列を意味する
    4. HIGH-VALUE,HIGH-VALUES:最高の値を有する文字列
    5. LOW-VALUE,LOW-VALUES:最小の値を有する文字列
    6. ALL定数:指定した文字定数を1回以上反復し連続させた文字列を意味する

部分参照について

 部分参照とは、データ項目に対して最左端の文字と長さを指定する事によってデータ項目を定義することが可能になります。例えば、こんな感じで…


01 text  pic x(10) value "ABCDEFGHIJ".

 textという10桁の文字項目にA~Jまでのアルファベットが入っています。この3桁目から7桁目までの5文字を表示してみると、以下のようになります。


        Display text ( 3 : 5 )

表示結果 ==> CDEFG

構文は以下の通りです。


形式
 

  データ名1(最左端文字位置:[長さ]) 


構文規則

 

  1. データ名1は、その用途が表示用であるデータ項目を参照しなければならない
  2. 最左端文字位置及び長さは算術式を指定できる。ただしこの場合算術式中に添字は使用できない。また、埋めこみSQL文中のホスト変数に部分参照の指定はできない
  3. 特に指定がない限り、部分参照は、字類が英数字データ項目を参照する一意名が許されるところならどこでも許される
  4. データ名1は、修飾や添字付けする事ができる

一般規則

  1. データ名1のデータ項目の各文字は、最左端位置から最右端位置に向かって1ずつ増やす順序番号を割当てる。最左端位置には、順序番号1を割当てる。データ名1に対するデータ記述項がSIGN IS SEPARATE句を含むときは、その符号位置にもそのデータ項目中の順序番号を割当てる。
  2. データ名1のデータ項目が数字、数字編集、英字又は英字編集項目として記述されている場合、データ名1のデータ項目と同じ大きさの英数字項目として再定義されたように部分参照がなされる
  3. 作用対象に対する部分参照は、次のとおりに評価される
    • (a)作用対象に対して添字が指定されていれば、部分参照は添字の評価の直後に評価される
      (b)作用対象に対して添字が指定されていなければ、部分参照は、添字が指定されているとしたらその添字が評価されたはずの時点で評価される
  4. 部分参照は、データ名1のデータ項目の部分集合である一意なデータ項目を新たに定義する。この一意なデータ項目は、次のとおりに定義される
    • (a)最左端位置の値は、データ名1のデータ項目の最左端文字に対して一意なデータ項目の最左端文字の順序位置を示す。この最左端文字位置の値はデータ名1のデータ項目中の文字位置の個数より小さいか等しい、ゼロでない正の整数でなければならない
      (b)長さの値は、その操作で用いるデータ項目の大きさを示す。この値はゼロでない正の整数でなければならない最左端文字位置と長さの合計から1を引いたものは、データ名1のデータ項目中の文字位置の個数より小さいか、等しくなければならない長さが指定されなければ、一意なデータ項目は最左端文字位置によって識別される文字から、データ名1のデータ項目の最右端の文字までとする

       
  5. 部分参照によって新たに定義された一意なデータ項目は、JUSTIFIED句なしの基本データ項目みなす。それは、データ名1のデータ項目に対して定義したのと同じ字類と項類をもつ。ただし、この項目類が、英字、数字、数字編集、又は英数字編集ならば、その字類及び項類は英数字とみなす

 

COBOL記述時の注意点(初心者の陥りやすい罠)

 時々COBOL熟練者様からもお便りを戴きます。その中で自分が初めてCOBOL言語に触れたとき、クセがあるなと気づいた点を指摘していただきました。この場を借りてお礼申し上げます。私もCOBOLに慣れ過ぎ、すっかり忘れていました。言われてみればナルホドと頷くものばかりです。例題を挙げながら解説します。現時点で命令語や文法は理解しなくて構いません。必ず後々この頁を見直す時が訪れます。

  1. 予約語が完結する前に余計なピリオドを入れてはいけない
  2. 予約語の完了時には必ずピリオド
  3. 予約語と予約語の間には1文字以上の空白をいれる
  4. そもそも予約語のスペルが誤まっている
  5. <PROGRAM-ID> 英字で始まっていない
  6. <PROGRAM-ID> 8文字を超えている
  7. <WORKING-STORAGE> 空文字は使用できない(命令語も同様)
  8. <WORKING-STORAGE> 桁数と初期値が合ってない
  9. <WORKING-STORAGE> これはエラーにならない
  10. <LINKAGE> 01レベル指定時は全て記述すること
  11. <LINKAGE> 下位レベル指定の記述はできない
  12. <命令文> IF~END-IFの記述中にピリオドは使用禁止
  13. <命令文> 各命令文での省略系(ピリオドで終了させる場合)
  14. <共通> 一行は必ず80カラム(桁)で収める(有効桁は72カラムまで)
  15. <共通> 各SECTIONの最後には必ずピリオドが必要
  16. <命令文> IF文ではTHENの記載を省略できる

※他にも何か気づいた点がございましたらメールでお知らせ下さると助かります。
 





 IDENTIFICATION.     DIVISION.
*
 ENVIRON.MENT        DIVISION.
*
 CONFIGURATION.      SECTION.

こういう簡単なエラーはわかり易いのでいいんですけどね




 IDENTIFICATION      DIVISION
*
 FILE-CONTROL

これも簡単ですね。どの予約語にピリオドが必須なのか、よく覚えましょう。




 IDENTIFICATIONDIVISION.

 PROGRAM-ID.12345678.

当たり前のことですが、予約語(命令語)の直後に連続して英数字を書いていたら、
誰だって意味がわかりません。それは機械でも同じことです。ピリオドがあってもダメ
なものはダメですよ!




 DATE DIVISION.
*
      WRITO A FROM B.
*
      DISPLEY "ABC".

えっと、話になりません。以上です。必死に覚えましょう。




 PROGRAM-ID. 12345678.
*
 PROGRAM-ID. @1234567.

プログラム名は必ず英字で始まる必要があります。




 PROGRAM-ID. ABC123456.

プログラム名は8文字以内で収まらなければなりません。最低3文字以上の名前にしましょう。




 01  W-TEXT PIC X(4) VALUE "".

   *> 正解は以下の通り ↓

 01  W-TEXT PIC X(4) VALUE SPACE.  *>もしくは↓
 01  W-TEXT PIC X(4) VALUE "    ".

これも他言語ではよく利用されますが、COBOLでは禁止になっています。注意して下さい。




 01  IN-CNT PIC 9(2) VALUE 100.
 01  W-TEXT PIC X(4) VALUE "ABCDE".

桁数以上の初期値は設定できません。結構頻繁に見かけるエラーです。




 01  IN-CNT PIC 9(4) VALUE 100.      *>データは"0100"になる
 01  W-TEXT PIC X(6) VALUE "ABCDE".  *>データは"ABCDE "になる

桁数以内であれば必ずしも桁数に達している必要はありません。
空いた列には数字であればゼロ、文字であれば空白が入ります。




 LINKAGE SECTION.
 01  L-PARA1  PIC X(1).
 01  L-PARA2  PIC X(5).
 PROCEDURE DIVISION USING L-PARA1.

   *> 正解は以下の通り ↓

 PROCEDURE DIVISION USING L-PARA1 L-PARA2.

外部パラメータを利用する場合、独立項目(01レベル)は全て記述する必要があります。




 LINKAGE SECTION.
 01  L-PARA.
     03  L-P1  PIC X(1).
     03  L-P2  PIC X(5).
 PROCEDURE DIVISION USING L-P1 L-P2.

   *> 正解は以下の通り ↓

 PROCEDURE DIVISION USING L-PARA.

集団項目の場合、LINKAGE SECTIONの指定は、必ずトップ項目を記述しなければなりません。




         IF  A = ZERO
            MOVE  1  TO  B.
            MOVE  2  TO  C.
         END-IF.

ピリオドは文の終わりを意味します。上記の場合ではEND-IFの記述と同じ扱いになります。
MOVE 2 TO C は無条件で処理、最後の END-IF はエラーとなります。




         IF  A = ZERO
            MOVE  1  TO  B.

         IF  A = ZERO
           MOVE  1  TO  B
           MOVE  2  TO  C.

         PERFORM UNTIL IN-REC = HIGHVALUE
            PERFORM  READ-R.

         READ  IN-FILE
            AT END
               MOVE  HIGH-VALUE TO IN-REC.

        START  IN-FILE
            INVALID  "1" TO FLAG.

       SEARCH  WK-TABLE
           AT END  MOVE  1 TO FLAG
           WHEN  WK-AAA(IDX) = ZZ-AAA
               MOVE  99  TO  FLAG.

このように、命令の終了である"END"は、ピリオドをつける事で省略可能になります。
(END-IF,END-READ,END-PERFORM,END-START,END-STRING、などなど)
私個人の意見としては、命令文はIF~END-IF,PERFORM~END-PERFORMのように、
必ずEND-XXXXで終わるのが基本だと思います。また省略することで混乱の原因にもな
りお薦めできません。必ず"END"の記述するように心掛けましょう。




...1.T..*....2....*....3....*....4....*....5....*....6....*....7.

     MOVE   1    TO   B   C   D   E   F   G   H   I   J   K   L   M  N  O  P.

このMOVE命令はLまでで、以降のM~Pまでは無視されます。
また80カラムを超える行は翻訳ソフトによって扱えません。
折り返す場合には7カラム目に"-"を記述しましょう。

記述するなら以下のようになります。

...1.T..*....2....*....3....*....4....*....5....*....6....*....7.

     MOVE   1    TO   B   C   D   E   F   G   H   I   J   K   L
-                     M   N   O   P.




 LOOP  SECTION.
     PERFORM   OPEN-R
     EVALUATE  TRUE
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-M
         WHEN MST-KEY < TRN-KEY
                PERFORM WRITE-R
                PERFORM   READ-T
                PERFORM   READ-M
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-T
     END-EVALUATE
     PERFORM CLOSE-R
 LOOP-E. EXIT.

このようにPROCEDURE内で独自に作成した処理別のSECTIONを利用
する場合には、SECTIONの最後の行には必ずピリオドが必要です。
上記の例では最後の命令である、「PERFORM CLOSE-R」にピリオドを
つけ、「PERFORM CLOSE-R.」としなくてはなりません。

勿論、各命令の最後に全てピリオドをつけても構いません。
以下の2つの例はどちらでもOKになります。

 LOOP  SECTION.
     PERFORM   OPEN-R
     EVALUATE  TRUE
         WHEN MST-KEY < TRN-KEY
                PERFORM   READ-M
         WHEN MST-KEY = TRN-KEY
                PERFORM   WRITE-R
                PERFORM   READ-T
                PERFORM   READ-M
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-T
     END-EVALUATE
     PERFORM CLOSE-R.
 LOOP-E. EXIT.

 LOOP  SECTION.
     PERFORM   OPEN-R.
     EVALUATE  TRUE
         WHEN MST-KEY < TRN-KEY
                PERFORM   READ-M
         WHEN MST-KEY = TRN-KEY
                PERFORM   WRITE-R
                PERFORM   READ-T
                PERFORM   READ-M
         WHEN MST-KEY > TRN-KEY
                PERFORM   READ-T
     END-EVALUATE.
     PERFORM CLOSE-R.
 LOOP-E. EXIT.

上記の2パターンは全く同じ動作をします。全ての文の最後にピリオドをつけてもいいし、
最後の一行にだけピリオドをつけても動作は変わらない、ということを理解して下さい。




         IF  A = ZERO
           THEN
               MOVE  1  TO  B
         END-IF

IF文はIF  THEN  ELSE  END-IFというのが一連の流れなんですが、COBOLの場合、
THENの記述は省略が可能になっています。別に書いても構いません。エラーにもなりま
せん。ですが、現状ではほとんど記述を省略されています。

 

COBOL入門 Mission1-1 画面に1行表示する

処 理 内 容 PROGRAM-ID 難易度 言語
名前を画面に表示する DSP001 1 COBOL
1:処理図
 
l_dsp001.jpg
2:処理概要

自分の名前を画面に表示する


まずは下記サンプルのソースを見ながら自分の名前が表示されるプログラムを作成してみましょう
3:その他
 

★画面に表示する命令 [ DISPLAY ]

    DISPLAY "任意の文字列"
     ” ”で囲まれた文字列がそのまま画面に表示される

★プログラムの終了命令 [ STOP ]

    STOP RUN
      プログラムは、必ずこの命令で終わります

 

色々と憶えることはありますが、実際のプログラムのソースコードを見ながら解説したほうがわかり易いと思います。

まずBasic言語の場合の記述から。


PRINT "*** HIYOKO-GUMI ***";

続いてC言語の場合。


#include <stdio.h>
main()
{
  printf("*** HIYOKO-GUMI ***\n");
}

最後にCOBOL言語の記述です。


 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                DSP001.
 PROCEDURE                  DIVISION.
    DISPLAY  "*** HIYOKO GUMI ***"
    STOP RUN.

どうですか?同じ一行を表示するだけなのに、言語によって記述がこんなにも違うのです。明かにCOBOLのソースコードは書くのが面倒ですよね。COBOLというのは、記述式の言語なので、必ず書かなければならないキーワードが沢山あります。その点、Basicは命令文だけで済んでいます。これこそが言語の特徴であり違いと言えます。
 

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

4つのDIVISION

COBOLには必ず『●● DIVISION.』という文が書かれています。COBOLは、この文節を1つの区切りとしプログラムを記述します。このDIVISIONは全部で4つあり、書く場所も、順序も、利用目的も最初から決まっています。

  1. IDENTIFICATION DIVISION. (見出し部)
    プログラムの名前などを記述します
  2. ENVIRONMENT DIVISION. (環境部)
    ファイルを利用する場合など、実行環境を記述します
  3. DATA DIVISION. (データ部)
    プログラムで使用するデータ項目について記述します
  4. PROCEDURE DIVISION. (手続き部)
    実際のプログラム(命令語)を記述します

COBOLは必ずこの4つの段落で構成されています。順序もこの通りでなければいけません。COBOLプログラムに慣れないうちは難解に感じますが、あまり難しく考えないで下さい。COBOL言語の決まり事です。そういうものなんだと思って下さい。逆に考えれば記述場所が決められているお陰で、他人が作成したプログラムであってもある程度の事は瞬時に理解できます。現段階では、4つの部に分けて記述しなきゃいけないってコトが理解できればOK!
 

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

IDENTIFICATION DIVISION 見出し部

まず最初に登場する見出し部について簡単に説明します。




 PROCEDURE          DIVISION.
    DISPLAY "*** HIYOKO GUMI ***"
    STOP RUN.

色つきの行が見出し部になります。特に赤色で表示している箇所は、COBOLプログラムでは必ず書く必要があります。
 

見出し部には、プログラムを識別するための情報を記述します。注意点として、プログラム名が挙げられます。他プログラムからコピーした場合には、プログラム名の変更を必ず行ないましょう。同じプログラム名のままコンパイルを行なうと、大事なオブジェクトが上書きされる危険があります。プログラム名の約束として、必ず英字から始まる8桁以内の英数字で表記します。

その他のDIVISIONに関しては、登場する都度に説明します。
 

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

PROCEDURE DIVISION 手続き部

最後に書く部がこの「手続き部」になります。


 IDENTIFICATION   DIVISION.
 PROGRAM-ID.      DSP001.


PROCEDURE DIVISION以降が実際のプログラムになります。
必ず各部、各節の最後にピリオドをつけること!

色つきの行が手続き部です。ここがCOBOLの心臓になる命令語の記述場所です。結局、この部がないとCOBOLプログラムは成り立ちません。「ファイルを読んで下さい」、「ファイルに書いて下さい」、「今日の日付は?」、「表の中に同じ名前はあるか探して」などなど、コンピュータにやってほしい事を上から順番に記述します。こう考えると、BASIC言語などは、いきなり手続き部から書くことができますね。プログラムは、他人がみてもわかりやすいプログラムを作るよう努めましょう。

その他のDIVISIONに関しては、登場する都度に説明します。

タグ:

+ タグ編集
  • タグ:
最終更新:2025年09月21日 13:41