導入
第1章で「COBOLはメインフレームで動いている」と説明しました。ここでは、そのメインフレームでCOBOLプログラムが実際にどう起動されるのか、JCL という仕組みに軽く触れておきます。
説明
JCL(Job Control Language) は、IBMのメインフレーム(z/OSなど)で、「どのプログラムを、どんな入出力ファイルで、どんな順序で実行するか」を指定するための言語です。COBOLプログラム自体とは別の、「実行の段取り」を記述する言語だと考えてください。
//BATCHJOB JOB (ACCT),'DAILY BATCH',CLASS=A
//STEP1 EXEC PGM=CALCINT
//SALESIN DD DSN=PROD.SALES.MASTER,DISP=SHR
//SALESOUT DD DSN=PROD.SALES.UPDATED,DISP=(NEW,CATLG)
//STEP2 EXEC PGM=PRTRPT
//RPTIN DD DSN=PROD.SALES.UPDATED,DISP=SHR
//RPTOUT DD SYSOUT=*
//BATCHJOB JOB ...… 「これはジョブ(1つのまとまった実行単位)である」という宣言。ジョブ名や実行に使う課金アカウントなどを指定。//STEP1 EXEC PGM=CALCINT… 1つ目の実行ステップとして、CALCINTというプログラム(第9章で学んだような、コンパイル済みのCOBOLプログラム)を実行する。//SALESIN DD DSN=...…DD(Data Definition)文で、プログラムが使うファイルを実際のデータセット(メインフレーム上のファイル)と結び付ける。第7章で学んだSELECT ... ASSIGN TOに対応する概念です。//STEP2 EXEC PGM=PRTRPT… 1つ目のステップの出力を受けて、2つ目のプログラムを実行する(複数のステップを順番につなげられる)。
flowchart LR
J["ジョブ投入<br/>(JCLを実行)"] --> S1["STEP1<br/>PGM=CALCINT<br/>(利息計算のCOBOLプログラム)"]
S1 --> S2["STEP2<br/>PGM=PRTRPT<br/>(帳票印刷のCOBOLプログラム)"]
S2 --> DONE["ジョブ完了<br/>結果をログ・帳票として出力"]
夜間バッチでは、こうしたJCLで定義された何十・何百ものジョブが、スケジューラによって決まった時刻に自動的に投入され、順番に実行されていきます。第7章で学んだ「マスターファイルの更新」のような処理も、実際の現場ではこのJCLの1ステップとして起動されるCOBOLプログラムです。
COBOLのコード自体を書く技術者と、JCLでジョブの流れを設計・運用する技術者は、役割が分かれていることも多いですが、保守エンジニアとして基幹システムに関わる以上、「自分の書いたCOBOLプログラムが、どんなJCLから、どんな入出力ファイルを与えられて起動されるのか」という全体の文脈を理解しておくことは、とても重要です。
試すには
上のJCLの例を読み、「STEP1でどのプログラムが動き、STEP2でどのプログラムが動くか」「STEP1の出力ファイルが、STEP2の入力ファイルとしてどう使われているか」を自分の言葉で説明してみましょう。