7/2(月)よりスマホまたはPCでアクセスした場合、各デバイス向けのサイトへ自動で転送致します
COBOLとは、事務処理用のプログラミング言語である。Common Business Oriented Language(汎商業目的言語)の略。高級言語。
アメリカ国防総省によって統一事務処理言語の開発が提案され、1959年にアメリカのデータシステムズ言語協議会(CODASYL)が開発された。もともとは、世界最初に“バグ”を発見した、最初期のプログラマでもありコンピュータ開発者でもあった“アメイジング・グレース”こと、グレース・ホッパー女史が開発したコンパイラ言語である「FLOW-MATIC」がベース。このため、グレース・ホッパーは「COBOLの母」とも呼ばれている(ちなみに女性にして初の海軍将官(提督)でもある)。日本のごく一部のおっさんからは「COBOLのおばちゃま」とか呼ばれることもある。
アメリカ政府が主導で開発を行ったこともあり、COBOL誕生以降、アメリカ政府の事務システムは全てCOBOLによって製作された。現在でも事務処理用ホストコンピュータではCOBOLプログラムが主流として活躍している。
▲他のプログラミング言語と異なり、英語に近い構文になっているのが最大の特徴である。これは開発者であるグレース・ホッパーの理念によるもの、らしい。当時は機械語主体だったので、プログラミングする言語は標準化された英語をベースに作りやすい、可読性の高い(高水準)言語であるべきだという考えのもと作られている。無論、その反面、プログラム言語としては冗長になり過ぎるきらいもあり、その点についての批判もある。
▲COBOLは、「IDENTIFICATION DIVISION.」(見出し部)、「ENVIRONMENT DIVISION.」(環境部)、「DATA DIVISION.」(データ部)、「PROCEDURE DIVISION.」(手続き部)の4つのDIVISIONから成り立ち、これらを順番に記述しなければならない。
プログラムの見出しとなる部。
「PROGRAM-ID.」(プログラム番号)、「AUTHOR.」(プログラム作成者名)、「DATE-WRITTEN.」(作成日)などのプログラムの実行に関係しない文を記述する。更新履歴などを記述することもある。なお、「AUTHOR.」「DATE-WRITTEN.」は廃要素のため、最新規格のCOBOLでは使わないようにしよう。
「CONFIGURATION SECTION.」(環境節)と「INPUT-OUTPUT SECTION.」(I/O節)があり、環境節ではホストコンピューター名など、I/O節では入出力ファイルの情報を記述する。なお、環境節の「SOURCE-COMPUTER.」「OBJECT-COMPUTER.」等の記載は、コンパイル時に影響を与えることは無く、実質覚書のようなものである。そのため、省略されることも多い。
「FILE SECTION.」(ファイル節)と「WORKING-STORAGE SECTION.」(作業領域節)、「LINKAGE SECTION.」(引数節)がある。変数、定数の宣言は、PICTURE(PIC)句によって行う。
処理コードを記述する部。ここで定義された処理が実行される。
COBOLでは、1行に80桁(カラム)まで記述できるが、実際にソースコードを記述できる領域が指定されている。一部例外もあるが、行の終端には必ずピリオド(.)を付けなければならない。
また、英字は大文字・小文字のどちらで記述しても良い(区別されない)が、かつて小文字に対応していないパンチカードや文字コードが存在していた頃の名残もあってか、大文字で記述することが一般的になっている。
一連番号領域。
プログラムの行を識別するための領域。コンパイル時にこの領域は無視されるため、必ずしもコーディング上記述する必要はない。
識別領域。
「*」を付けることで、その行をコメント行として認識される。通常は空白。
A領域。
DIVISIONやSECTION等の見出しや作業領域節の「01」などを記述する。
B領域。
命令文や各DIVISION、SECTIONを構成する文を記述する。ピリオドも含めて、全てこの領域に記述する必要がある。
プログラム識別領域。
コメントとして扱われる領域。コンパイル時にこの領域は無視されるため、必ずしもコーディング上記述する必要はない。
プログラムを終了させる際には「STOP RUN」と記述しなければならない。
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLOWORLD.
000300 PROCEDURE DIVISION.
000400 DISPLAY 'HELLO, WORLD!'.
000500 STOP RUN.
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.
COBOLの数字項目は定義された桁数よりも少ない桁数の値が格納された場合、ゼロパディングした状態で扱うため、このまま表示させると001、002、…、098と先頭に0が補われて表示されてしまう。N 桁で定義された数字項目に、正の整数 n が格納された場合、その最上位桁の位置は左から N - [log10n] カラム目である[ ] はガウス記号であり、[x] は x 以下の最大の整数を表す。いわゆる「小数点以下切り捨て」である。から、上記のように「DISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)」と記述することで、パディングされた0を除いた部分だけを表示させることが出来る。
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. EUCLID.
000300 ENVIRONMENT DIVISION.
000400 INPUT-OUTPUT SECTION.
000500 FILE-CONTROL.
000600 SELECT INDATA ASSIGN TO 'INDATA.TXT'
000700 ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS INDATA-STS.
000800 SELECT OTDATA ASSIGN TO 'OTDATA.TXT'
000900 ORGANIZATION IS LINE SEQUENTIAL.
001000 DATA DIVISION.
001100 FILE SECTION.
001200 FD INDATA.
001300 01 INDATA-REC.
001400 03 M PIC 9(18).
001500 03 FILLER PIC X(01).
001600 03 N PIC 9(18).
001700 FD OTDATA.
001800 01 OTDATA-REC.
001900 03 FILLER PIC X(38).
002000 03 GCD PIC 9(18).
002100 03 FILLER PIC X(01).
002200 03 ERR-FLG PIC X(01).
002300 WORKING-STORAGE SECTION.
002400 01 INDATA-STS PIC X(02).
002500 01 R PIC 9(18).
002600 PROCEDURE DIVISION.
002700 OPEN INPUT INDATA OUTPUT OTDATA.
002800 PERFORM UNTIL INDATA-STS NOT = ZERO
002900 READ INDATA
003000 NOT AT END
003100 MOVE INDATA-REC TO OTDATA-REC
003200 EVALUATE TRUE
003300 WHEN M IS NOT NUMERIC
003400 WHEN N IS NOT NUMERIC
003500 WHEN M = N AND ZERO
003600 MOVE '1' TO ERR-FLG
003700 WHEN OTHER
003800 MOVE ZERO TO ERR-FLG
003900 PERFORM UNTIL N = ZERO
004000 COMPUTE R = FUNCTION MOD(M N)
004100 COMPUTE M = N
004200 COMPUTE N = R
004300 END-PERFORM
004400 COMPUTE GCD = M
004500 END-EVALUATE
004600 WRITE OTDATA-REC
004700 END-READ
004800 END-PERFORM.
004900 CLOSE INDATA OTDATA.
005000 STOP RUN.
テキストファイルを入出力データとしている関係上、入力データとして不適切なものが渡された場合(具体的には、入力値M、Nの少なくとも一方に数字以外の文字が含まれている場合や、M、Nが両方とも0である場合数値を格納する変数を「PIC 9(n)」で定義しているため、負の数の場合を考慮する必要は無い。もし「PIC S9(n)」で定義した場合は、負の数の場合も考慮する必要がある。)も考慮している。