魔王の憂鬱 -6ページ目

魔王の憂鬱

情報通信っぽいことを、分かりやすく述べているつもりです。

例)

//* JCL SAMPLE001
// JOBNAME JOB MSGCLASS=H
// STEP001 EXEC PGM=PGMNAME
// INPUT DD DSN=INPUT.FILE.DATASET, DISP=SHR
// OUTPUT DD SYSOUT=*



続いて3行目


// STEP001 EXEC PGM=PGMNAME


これは「EXECステートメント」といい、ジョブステップの始まりを示します。
一つのJOBに対して複数のEXECステートメントを記述することができます。
実行するプログラムや呼び出すカタログプロシージャ、ストリーム内プロシージャを指定します。



// ステップ名 EXEC PGM = 実行するPGM等


ステップ
1~8文字の英数字または各国用文字など


・PGM = プログラム名
プログラム名を指定します。

※「PGM = 」の記述に関しては、別の書き方もあります。

・[PROC = ] プロシージャ名
こう書くと、カタログ式プロシージャないしストリーム内プロシージャを指定します。
なにそれ?と思われた方もいるかと思いますが、
C言語での関数のような、別のところで予め記述されている処理を指定するということです。

EXECステートメントも、色々なパラメータを指定できます。


・COND [.proc-stepname] = (code,演算子) or (code,演算子,ステップ名)
or (code,演算子,,ステップ名.プロシージャ名)
これは、先ほどのCONDと同じ意味です。ステップ名やプロシージャ名の戻りコードを
条件にすることができます。JOBステートメントと両方で指定した場合は、JOBの方が優先です。


・COND = EVEN
先行のジョブが異常終了した場合でも、当ジョブステップを実行する。

・COND = ONLY
先行のジョブが異常終了した場合のみ、当ジョブステップを実行する。


・PARM [.proc-stepname] = 値
実行中のプログラムに、可変情報を渡します。要するに、引数ですね。


・REGION = 値
ジョブステップに割り当てられる記憶スペースの量を指定する。


・TIME = ([分 or 1440][,秒])
ステップにCPU時間を割り当てます。
1440っていうのは、、60で割れば分かりますね。



4行目以降は「DDステートメント」なのですが、長くなりそうなので今回はここまで。
少しだけ、さわりとして記述します。


// DD名 DD データセットの定義


DDステートメントでは、各種ファイルや装置について記述します。
データセットの定義としては、アドレスやら後処理やら装置の指定やら、
こちらも多くの指定が可能です。
また、DD名として特定の単語を指定することで、その用途を明示することができます。

前回の続きです。あと数回分は、このJCLとかいう言語の基本的な解説を続けます。


○JCLについて


例)

//* JCL SAMPLE001
// JOBNAME JOB MSGCLASS=H
// STEP001 EXEC PGM=PGMNAME
// INPUT DD DSN=INPUT.FILE.DATASET, DISP=SHR
// OUTPUT DD SYSOUT=*


2行目に入ります。


// JOBNAME JOB MSGCLASS=H


これは「ジョブステートメント(JOB文)」と呼び、OSにJOBの開始を知らせます。
ここではJOBを実行するために必要なパラメータを記述します。

「JOB」は固定ネームです。


// JOB名 JOB オペランド


JOB名
英数字または各国文字1~8文字。先頭は数字不可。
オペランド
システムに種々の情報を与える。

オペランドに記述するパラメータは、以下の通りです。



1、定位置パラメータ:任意で記述します。ようするに、後から見た人への

  情報として、あるいは、運用のために残しておくようなものです。
・会計情報
業務識別名などの情報
・プログラマ名
会計情報の直後に指定。20文字以内。

例)
// JCL001 JOB SIKIBETUNAME, 'maou', ...



2、キーワードパラメータ:定位置パラメータの後ろに、任意の順序で記述します。
・MSGLEVEL = (JCL,割り振り)
これは、JOBの出力の形式を指定しています。
 ・JCL
0:JOB文のみを出力
1:全てのJCL文とカタログ式プロシージャを出力
2:呼び出されたプロシージャを含まないJCL文のみを出力
 ・割り振り
0:ジョブが異常終了しない限り、メッセージは出力しない
1:全ての割り振りメッセージを出力する

つまりは、実際のJCLでは、2つの数字が( )の中に記述されることになります。

 「割り振り」項目に登場した「メッセージ」というのは、
 ・割り振りメッセージ
OSがジョブの制御のために確保したデータセット資源をユーザに知らせるために出力
 ・終了メッセージ
ジョブの終了時に行われるデータセットの後始末処理について知らせるために出力

 ・・されるそうです。へー


・MSGCLASS = CLASS
JCLステートメント、割り振りメッセージ、終了メッセージの出力クラスを指定します。
出力クラスには「A~Z」と「0~9」の一桁の文字を指定します。
一般的には、処理内容や処理時間、緊急度などによってグループ化を行うみたいです。
で、ちゃんと指定すると、効率よく出力処理が行われるそうです。


・CLASS = CLASS
上記はメッセージに関しての指定。
これは、ジョブそのものに関しての指定だそうです。


・COND = (コード,演算子)
これは、条件によって「実行しない」という指定を行う記述です。
IF文のように、条件が満たされたときに実行するのではなく、
条件が満たされた時には「実行されない」ことに気を付けましょう。
 ・コード
プログラムが終了したときの戻りコード。0~4095の10進数で指定。
 ・演算子
GT:コードが戻りコードより大きい(>)
GE:コードが戻りコードより大きいか等しい(>=)
EQ:コードが戻りコードに等しい(=)
NE:コードが戻りコードに等しくない(!=)
LT:コードが戻りコードより小さい(<)
LE:コードが戻りコードより小さいか等しい(<=)

・TIME = (分,秒)
ジョブがCPUを使用できる最大の時間を指定。
これは、無限ループに陥った際に、途中で処理を終えるのにも使えます。
まぁ当時は、CPUの使用時間ですら極力少なくしたかったみたいですね。

・REGION = n[K or M]
ジョブに割り振られる記憶域の大きさを指定します。
nは数値で、KやMは単位(K:キロ,M:メガ)を示します。

・PRTY = n
ジョブクラス内での選択優先順位を指定します。

・TYPRUN = [HOLD or SCAN]
ジョブの特殊処理を指定します。

 ・HOLD
オペレーターがジョブを解放するまでそのジョブは実行されないで、
待ち行列に保留されるように指示します。
 ・SCAN
構文の誤りを見つけるために、JCLステートメントを操作するだけで、
実行はしないことを指示します。

・NOTIFY = ユーザ識別名
ジョブの完了時に、完了メッセージをユーザのTSO端末に送るように指示します。


あーつかれた。
上記のように、色々と指定することができますが、
実際のソースでよく見るのは、
MSGLEVELと、、たまにCONDを見るくらいだったかと思います。

JCLについて、ノートを頼りに少しだけまとめてみました。

参考文献は私のノートなのですが、

このノートの記述に関する参考文献だと・・

以前にも出しました、メインフレームのサイトと本ですかね。


それでは、下のJCLの例を用いまして、

少しずつですが知っている限りの解説を始めましょう。



○JCLについて


例)

//* JCL SAMPLE001
// JOBNAME JOB MSGCLASS=H
// STEP001 EXEC PGM=PGMNAME
// INPUT DD DSN=INPUT.FILE.DATASET, DISP=SHR
// OUTPUT DD SYSOUT=*


JCLでは、起動するプログラム名や、入出力先などを指定できます。
処理の単位をJOBといい、一つのJCLに対して複数のJOBを記述することができます。
上の例ですと、「JOBNAME」というJOBの中では、
・「PGMNAME」というPGMが実行され、
・入力データは「INPUT.FILE.DATASET」のアドレスにあるデータセットであり、
・出力は標準出力、初期設定によりますがコンソール画面やプリンタなどに出力される
ことを意味しています。

上記例ではもっと細かい指定も記述されてはいますが、
とりあえず、大ざっぱな解説だけしておきました。


各行の先頭は//で始まります。
これは、元々JCLの記述がパンチカード式であったことに由来します。
今はテキストエディタなどにプログラムのソースを記述していけばいいのですが、
昔はパンチカードというカードに対してソースにあたる文字をパンチし、
一斉に機械に通す作業を行っていました。

このとき、パンチカードの向きが間違っていては大変です。
そこで、プログラムの先頭を//で始めることにより、
こちら側からソースを記述していることを示しているのです。

さて、この半角2~3桁の部分には、別の記述もできます。

・//
//以降を空白にします。
これは「空白ステートメント」と呼び、一まとまりの処理の終了を意味します。

・/*
これは「区切りステートメント」と呼び、JCLにおいてデータを記述する際、
データはここで終わりですと示すためのものです。

・//*
上記2つとは微妙に異なりますね。この記述から始まると、
その行は「コメント」扱いになり、4~80桁目にコメントを入れることができます。