スタートページ> (主張・講演Web教材歴史ソフトウェアの歴史

JCL/CLISTの例

残念なことに、私は汎用コンピュータOSが動作する環境をもっていません。文法書を見ながら「昔とった杵柄」で記述したので、厳密には誤りを含んでいるかもしれません。例示のものを実務で用いるのはご遠慮ください。


汎用コンピュータOSの前提知識

一般にデータの集まりをファイルというが、MVSでは、それが物理的に格納されているものをデータセットといい、プログラムで記述するときは論理的なファイルをファイルという。
 例えば、ディレクトリ「KEIRI」に存在するデータセット「D201005」をアクセスする場合、プログラムでその名称を指示したのでは、別のデータセット「D201005」をアクセスするときには、プログラムを修正しなければならない。それを回避するために、プログラムでは論理的な名称(ファイル名)、例えば「OLDFILE」としておき、実行時にJCLで、OUTFILE と KEIRI.D201005 を関係づけるのである。
 このような方法を採用することにより、データセットが磁気ディスクにあるのか磁気テープにあるのか、順編成ファイルなのか索引付ファイルなのかなどを、プログラマは知る必要がなくなるし、プログラムに影響を与えずに、運用の都合でデータセットの格納場所を変更することができる。

汎用コンピュータでは、データのもち方が標準化されていた。データが単純に入っていて、先頭から順にアクセスする順編成ファイル、データに格納場所のインデクスがついていて、直接にアクセスできる乱編成ファイル、その中間的な索引付順編成ファイルなどがあり、そして、そのアクセス方法をOSが管理していたのである(オープン系では、EXCELで作成したファイルを WORD で読むのは困難だが、汎用コンピュータでは、同じOSであれば言語間でのファイル互換は容易だった)。
 区分編成ファイルとは、一つのファイルのなかに、いくつものファイルが入っているような編成法である。その個々のファイルをメンバーという。一般にプログラムは区分編成ファイルのメンバとするのが一般的だった。特に本番用の実行形式プログラムは重要であり、LOADLIB というような名称を付けて管理されていた。


JCL

先月までのデータを累積したファイルに、今月のデータをカードから与えて更新し、今月までの累積ファイルを作り、それからレポートを作成する処理を例とする(これは説明のためのものであり、現実的には適切とはいえない)。
 左上は「処理の流れ」を示す。JCLは黄色の部分を右のように記述する。これは紙カードにパンチされ、左下のような構成でコンピュータに入力される。


ジョブ「GETSUJI」の流れ図 (拡大図)


JCLの構成

//GETSUJI JOB KEIRI,CLASS=J,MSGCLASS=J,MSGLEVEL(1,0) [A]
//**************************************************
//*   STEP01                  *
//**************************************************
//STEP01 EXEC PGM=UPDATE              [B]
//STEPLIB DD DSN=HONBAN.LOADLIB,DISP=SHR      [C]
//SYSOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//OLDFILE DD DSNAME=KEIRI.D201005,DISP=SHR     [D]
//NEWFILE DD DSNAME=KEIRI.D201006,DISP=(NEW,CATLG),[E]
//       UNIT=SYSDA,SPACE=(TRK,(1500,450),RLSE),
//       DCB=(RECFM=FB,LRECL=120,BLKSIZE=0)
//INDATA  DD DATA                 [F]
 :
 :
 カードからの入力データ
 :
 :
/*                          [G]
//**************************************************
//*   STEP02                  *
//**************************************************
//STEP02 EXEC PGM=REPORT,COND=(4,LE,STEP01)     [H]
//STEPLIB DD DSN=HONBAN.LOADLIB,DISP=SHR
//SYSOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//INFILE  DD DSNAME=KEIRI.D201005,DISP=SHR
//OUTFILE DD SYSOUT=*
//                          [I]

参照:IBM「MVS JCL 解説書」
    http://publibfp.dhe.ibm.com/epubs/pdf/c8865789.pdf


CLIST

CLISTは、TSS環境におけるJCLだといえる。コンピュータへの指示コマンドをあらかじめCLISTファイルに記述しておき実行させるので、現在のパソコンでのマクロのようなものでもある。TSS環境でユーザが定型的なアプリケーションを実行するときに、広く活用されていた。

例1:単純なプログラムの実行

COBOLなどで作成した既存のプログラムを実行する例。このとき、対象となるデータセットの指定、プログラムへ単純なパラメータを渡すことができる。
 あらかじめ、次のCLISTが作成されており、それが呼び出されたとする。

HAJIME: WHITENR 対象年月は(YYYYMM、打切りなら0)? [A]
READ &YM                      [B]
IF &YM=0 THEN EXIT                 [C]
ALLOCATE FILE(INFILE) DATASET('KEIRI.D&YM') SHR   [D]
ALLOCATE FILE(SYSIN) DUMMY REUSE
ALLOCATE FILE(SYSOUT) DUMMY REUSE
WHITENR 選択する府県名は(例:東京)?
READ &FUKEN
CALL 'USERLIB(URIAGE)' '&FUKEN'           [E]
GOTO HAJIME                     [F]

例2:簡易言語としてのCLIST

CLISTは、計算命令、制御命令などをもっているので、CLISTだけで簡単な処理を行うことができる。次のCLISTは、関数をユーザが与えて、計算結果を表示するものである。

WRITENR 変数を&Xとする計算式(例:2*(&X+1)-3)?
READ &SHIKI
READX:WHITENR Xの値?
READ &X
SET Y=&SHIKI
WHITE &Y
GOTO READX

式を「2*(&X+1)-3」とし、Xの値を5とすれば、「SET Y=&SHIKI」は「SET Y=2*(&X+1)-3」であり、&X=5であるから、Y=2*(5+1)-3=9 となり、「9」が出力される。
 このように、CLISTでは実行中に命令の一部を変更できるのが特徴である。

例3:CLISTでファイルを入出力する

入力ファイル「INFILE」のレコードは、次の項目を含んでいる。
   年月:1桁目から6桁目まで
   商品コード:7桁目から13桁目まで
   府県コード:14桁目から15桁目まで
このうち1つの項目[KOUMOKU」を指定して、その値[ATAI」を指定する。
 「INFILE」のその項目の値「DATAVAL」が「ATAI」と一致するレコードを選択して、出力ファイル「OUTFILE」を作成する。例えば、
   選択条件の項目(1:年月 2:商品 3:府県)? 1
   選択科目の値? 201006
とすれば、年月(7桁目から13桁目まで)が 201006 のレコードだけが選択される。

WHITENR 選択条件の項目(1:年月 2:商品 3:府県)?
READ &KOUMOKU
WHITENR 選択科目の値?
READ &ATAI
ALLOCATE FILE(INFILE) DATASET(KEIRI.D2001006) INPUT
ALLOCATE FILE(OUTFILE) DATASET(USER.WORKFILE) OUTPUT
OPENFILE INFILE INPUT
OPENFILE OUTFILE OUTPUT
GETFILE INFILE
SET RTNCODE = &LASTCC /* データがなくなると LASTCC=400 になる。*/
DO WHILE RTNCODE < 400
  IF KOUMOKU=1 SET DATAVAL=&SUBSTR(1:6,&INFILE)
  IF KOUMOKU=2 SET DATAVAL=&SUBSTR(7:13,&INFILE)
  IF KOUMOKU=3 SET DATAVAL=&SUBSTR(14:15,&INFILE)
  IF ATAI = DATAVAL +
  DO
    SET OUTFILE = &INFILE
    PUT OUTFILE
  END
  GETFILE INFILE
  SET RTNCODE = &LASTCC
END
CLOSEFILE INFILE
CLOSEFILE OUTFILE

このような機能を適切に組み合わせれば「テンプレートとなるプログラムを読み込み、対話的に修正して新規のプログラムを作成して、コンパイルして実行する」CLISTを作成することは容易である。そのCLISTをユーザに公開すれば、ユーザは多様な情報を入手できるようになる。
 このように、汎用コンピュータでもユーザが使いやすい環境を実現することができるし、実際に活用していたのである。

参照:IBM[TSO/E CLIST」(CLISTの解説書)
    http://publibfp.dhe.ibm.com/epubs/pdf/a8886275.pdf