COBOLもやってみた。はぁはぁ。

COBOLもやってみた。はぁはぁ。今でもたまに話題に上がるCOBOL。でも、「へー」という感想しか抱けなく、そもそも言語の事が全然わからないのでドットインストールでやってみることにしました。今は、GNU COBOLってのを使ったほうが良いようなんだけど、とりあえず環境だけ用意できれば良いやとHomebrewで検索して出てきたOpen COBOLでレッスン始めてます。最後までコマンド エラーなければよいのですが(-> 出ませんでした)。ドットインストールではいまのところまだ52人しかレッスン完了していない様子!

インストール(Open COBOLだけど)

$ brew install open-cobol

基本知識

  • 正書法: 昔、コードをコーディングシートに手書きしていた。一行一行をパンチカードに転写して利用していた。
  • 自由書式: 手書きのコーディングシートが利用されなくなって、桁数、行番号など関係ない自由書式が使われるようになった。
  • 拡張子は、.cobが一般的。
  • 昔は大文字だけだった。最近のGNU COBOLなどは小文字もOK
  • 行の最後には必ず.がつく。
  • DIVISION > SECTION という構造がある。
    • 4つのDIVISIONがある
      -> IDENTIFICATION DIVISION. : 見出し部。必ず書く。
      -> ENVIRONMENT DIVISION. : 環境部。実行環境などを書く。
      -> DATA DIVISION. : データ部。入出力ファイルの情報など。
      -> PROCEFURE DIVISION. : 手続き部
  • *> : コメント

HELLO WORLD

hello.cob

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
    MAIN SECTION.
        DISPLAY 'HELLO WORLD'.
        STOP RUN.

コンパイル

cobc -x --free hello.cob
  • cobc : COBOL compile
  • -x : 実行ファイルを作る
  • –free : 自由書式

実行

$ ./hello

変数

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.                              # 変数を書くところ
    WORKING-STORAGE SECTION.                # 場所を指定?
        01 MY-DATA1 PIC X(20).              # 01は変数のレベル番号。変数名。PIC=領域指定。X=文字列 (数字)=桁数
        01 MY-DATA2 PIC 9(5).               # 9=数字
        01 MY-DATA3 PIC 999V99.             # 整数3桁、小数2桁
        01 MY-DATA4 PIC 99999 VALUE 130.    # 宣言時に初期値を登録
PROCEDURE DIVISION.
    MAIN SECTION.
        MOVE 'HELLO WORLD' TO MY-DATA1.     # 変数へ代入
        MOVE 120 TO MY-DATA2.
        MOVE 120.55 TO MY-DATA3.
        DISPLAY MY-DATA1.                   # Displayで表示
        DISPLAY MY-DATA2.
        DISPLAY MY-DATA3.
        DISPLAY MY-DATA4.
        STOP RUN.

集合

変数の左側の数字(01等)はレベル番号。これを上げていくと親子関係ができる。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-PRODUCT.
            03 PRODUCT-ID PIC X(5).
            03 FILLER PIC X(20).
            03 PRODUCT-PRICE PIC 9(5).
PROCEDURE DIVISION.
    MAIN SECTION.
        MOVE "ID-12" TO PRODUCT-ID.
        MOVE 2980 TO PRODUCT-PRICE.
        DISPLAY PRODUCT-PRICE.
        DISPLAY MY-PRODUCT.
        STOP RUN.

FILLERは領域を確保するためのもの。この例では20文字分確保している。

配列

COBOLは1から始まる。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-COLORS.
            03 MY-COLOR OCCURS 3 PIC X(10).
PROCEDURE DIVISION.
    MAIN SECTION.
        MOVE "red" TO MY-COLOR(1).
        MOVE "blue" TO MY-COLOR(2).
        MOVE "yellow" TO MY-COLOR(3).
        DISPLAY MY-COLORS.
        DISPLAY MY-COLOR(2).
        STOP RUN.

計算

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-DATA.
        03 D1 PIC 99999 VALUE 0.
        03 D2 PIC 99999 VALUE 0.
        03 D3 PIC 99999 VALUE 0.
        03 D4 PIC 99999 VALUE 0.
PROCEDURE DIVISION.
    MAIN SECTION.
        *> ADD 5 TO D1 D2 D3.
        *> SUBTRACT 2 FROM D1.
        MOVE 10 TO D1.
        MOVE 3 TO D2.
        *> DIVIDE D1 BY D2 GIVING D3 REMAINDER D4.
        *> MULTIPLY D1 BY D2 GIVING D3.
        COMPUTE D3 = D1 * D2.
        DISPLAY MY-DATA.
        STOP RUN.

はぁはぁ。

ユーザからの入力を受け付ける

PROCEDURE DIVISION.
    MAIN SECTION.
        DISPLAY "What's your name?".
        ACCEPT MY-DATA.
        DISPLAY "Hello! " MY-DATA.
        STOP RUN.

ACCEPTで受け付ける。入力された情報はMY-DATAに格納される。DISPLAYのところでは文字列を連結してコンソールに出力するようにしている。

IF文

PROCEDURE DIVISION.
    MAIN SECTION.
        MOVE 60 TO MY-SCORE.
        IF MY-SCORE > 60 THEN
            DISPLAY "OK!"
        ELSE
            DISPLAY "NG!"
        END-IF.
        STOP RUN.

Switch文的な条件分岐

MOVE "black" TO MY-SIGNAL.
EVALUATE MY-SIGNAL
    WHEN "red"
        DISPLAY "Stop"
    WHEN "blue"
        DISPLAY "Go"
    WHEN "yellow"
        DISPLAY "Caution"
    WHEN OTHER
        DISPLAY "Wrong"
    END-EVALUATE.
STOP RUN.

繰り返し

TIMESを利用した場合。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
    WORKING-STORAGE SECTION.
        01 MY-COUNTER PIC 9(3) VALUE 1.
PROCEDURE DIVISION.
    MAIN SECTION.
        PERFORM 10 TIMES
            DISPLAY "counter = " MY-COUNTER
            ADD 1 TO MY-COUNTER
        END-PERFORM.
        STOP RUN.

UNTILを利用した場合。Rubyみたい。

        PERFORM UNTIL My-COUNTER > 10
            DISPLAY "counter = " MY-COUNTER
            ADD 1 TO MY-COUNTER
        END-PERFORM.

ファイルに書き込む

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
        FILE-CONTROL.
            SELECT OUT-FILE ASSIGN TO 'out.txt'
                ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
    FILE SECTION.
        FD OUT-FILE.
            01 OUT-FILE-REC PIC 99.
    WORKING-STORAGE SECTION.
        01 LINE-COUNT PIC 99 VALUE 0.
PROCEDURE DIVISION.
    MAIN SECTION.

        OPEN OUTPUT OUT-FILE.

        PERFORM 10 TIMES
            ADD 1 TO LINE-COUNT
            MOVE LINE-COUNT TO OUT-FILE-REC
            WRITE OUT-FILE-REC
            DISPLAY OUT-FILE-REC
        END-PERFORM.

        CLOSE OUT-FILE.
        
        STOP RUN.

区切りはORGANIZATION IS LINE SEQUENTIALで指定している。今回は改行。FDはFile Description.

ファイルから読み込む

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
        FILE-CONTROL.
            SELECT IN-FILE ASSIGN TO 'in.txt'
                ORGANIZATION IS LINE SEQUENTIAL
                STATUS IN-FILE-STATUS.
DATA DIVISION.
    FILE SECTION.
        FD IN-FILE.
            01 IN-FILE-REC PIC X(20).
    WORKING-STORAGE SECTION.
        01 IN-FILE-STATUS PIC XX.
PROCEDURE DIVISION.
    MAIN SECTION.

        OPEN INPUT IN-FILE.

        PERFORM UNTIL IN-FILE-STATUS NOT = "00"
            READ IN-FILE
                AT END
                    DISPLAY "-- END --"
                NOT AT END
                    DISPLAY "Content: " IN-FILE-REC
            END-READ
        END-PERFORM.

        CLOSE IN-FILE.

        STOP RUN.

ファイルのステータスが正常な場合は00となる。

レッスンを終えてみて

まだほんとにさわりの部分しかやっていないんだろうけど、COBOLちょっとおもしろいなと思えた。変数を宣言するためにたくさん書かなきゃいけないのとか面倒だけど、全部英数字の大文字で書く(最新のバージョな小文字も可)といつものコーディング環境と一味違って面白かった。また、TIMESなどRubyの式と似たような表げが出てきて面白い発見ができた。

参考

Pocket
LINEで送る

You may also like...