2020-12-03に更新

COBOLってなぁに?その2

この記事は COBOL アドベントカレンダー2020 2日目の記事です。

当分は COBOL についての基本的な話をする予定なので、
多くの部分で wikipedia などの記述とカブると思います。

TL;DR

COBOL プログラムの前提となる思想

でも触れましたが、
COBOL は「理系ではない事務員や役人でも扱えるように作られ」ました。
これは、COBOLの言語仕様の根本として考えられたものなので、
これからCOBOLの言語仕様や構造について触れていく時にたびたび登場する思想です。

Ruby on Rails の精神として "Convention over configuration" = 設定より規約 というものがありますが
設定などによって柔軟な記述ができるようにしておくよりも、
規約を定義しその規約に則って記述することで開発者の考えることの負担を少なくすることができます。

COBOL も「理系ではない事務員や役人でも扱えるように作られ」ているため、
現在のプログラミング言語では柔軟に記述できる部分も
見方によっては不便とも取れるほど書き方が決まっている部分があり、
そのことにより理系の知識や詳しい言語仕様の把握をせずともCOBOLプログラムが書けるように
考えられているのです。

例えば C# コードの Hello World として

using System;

public class Hello{
  public static void Main(){
    Console.WriteLine("hello world!");
  }
}

このようなコードがある時、

public static void Main(){
  Console.WriteLine("hello world!");
}

は Hello クラスの1行目で定義されていようが
様々なプロパティやメソッドなどの後に定義されていようが
どこで定義されてあっても(どこに書いてあっても)デフォルトのエントリポイントとして機能しますが、
COBOL では後述の基本構造として定義された順で記述する必要があります。
これにより、「定義されている基本構造」に則った書き方で書くことで
COBOLプログラミングを行う上で考えることを少なくしているのです。

COBOL プログラムの1行ごとの書き方

では早速 COBOL プログラムの構文定義に触れていきましょう。

まず、今回は COBOL プログラムで定義されている1行ごとのルールについてお話します。
多くのプログラミング言語ではタブの数や予約語について書き順は柔軟であることが多いですが、
COBOL では1行ごとの書き方についても定義があります。
(Python などではインデントでブロックを定義するので似たような考え方とも言えますね)

また、COBOLプログラムの1行ごとのルールが決まっている理由は
COBOLプログラムは昔パンチカードという紙に記述していたところにも起因しています。
コンピュータに直接テキストファイルとしてプログラミングを行う現在のプログラミング言語と異なり、
パンチカードという紙にコードを記述していたがために
行ごとのルールが存在しないと簡単に記述量超過(ホールドオーバー)が起きてしまったんですね。

なお、以下に出てくる「n列目」という記載は
COBOL プログラムにおける領域の単位となりますが、
少なくとも7列目までは「7文字目」までと同一と考えてもらって問題ありません。

1列目〜6列目 シーケンシャル番号

COBOL プログラムにおける
各行の識別を行うためのシーケンシャル番号を6桁で記述します。
現代のプログラミング言語ではエラーが発生した時に
プログラムファイルの何行目でエラーですよ、などというエラー出力があるのが一般的ですが、
COBOL が考えられた当時はそのような親切なものはなく、自前で用意していました。
そのため、途中でプログラムが停止した時などにどの位置かを理解しやすくなるために
各行の頭にシーケンシャル番号を記述したのです。
シーケンシャル番号自体の記述ルールはありません。

例:

000001
000002
000003
000004
000005

ただし、1ずつ加算するシーケンシャル番号の場合は
プログラムの修正などで途中行に追記が発生した場合、上や下の行と同じ番号を振るなど
破綻したシーケンシャル番号の記述が発生してしまうので、
最初にプログラムを書くときは慣例として10桁や100桁ごとのシーケンシャル番号を振ることが多いようです。

例:

000100
000200
000300
000400
000500
000600

なお、この記述は大変冗長であるため
昨今のCOBOLコンパイラでは不要とされています。
いきなり最初から今は不要、みたいな定義になってしまいましたね……。

7列目 標識

COBOL プログラムの7文字目はコードの標識を記述する部分となります。
多くの場合はスペースを記述しますが、* を記述することでその行はコメント行となります。
また、- を記述すると前の行の単語またはリテラルが継続という扱いになります。

例:

000100****************************
000200* ここはコメント
000300****************************
000400
000500
000600

8列目〜11列目、12列目〜72列目 コード記述領域

COBOL プログラムを記述します。

例:

000100****************************
000200* ここはコメント
000300****************************
000400 IDENTIFICATION                DIVISION. 
000500 PROGRAM-ID.                   COBOL_SAMPLE01.
000600

まとめ

今回は COBOL の1行ごとの記述方法についてお話しました。
サンプルの最後にはいよいよ COBOL プログラムが出て来ましたね。
明日は、最後のサンプルに書いた IDENTIFICATION DIVISION など
COBOL の基本構文について触れていきましょう。

ツイッターでシェア
みんなに共有、忘れないようにメモ

北山淳也

アプリケーションエンジニアをやっています。専門はバックエンドです。リモートワーク歴2年目。 C#, TypeScript, Java, C++, Flutter, COBOL, SQLServer, AWS, Azure

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント