Job Control Language

Job Control Language (zkratka JCL) je v informatice skriptovací programovací jazyk používaný na sálových počítačích firmy IBM. Slouží pro instruování systému, jak spustit dávkové úlohy nebo subsystém. JCL umožňuje efektivní rozdělení drahého strojového času sálového počítače mezi různé úlohy (účtované různým zákazníkům) a rozložení jednotlivých činností v čase v souladu s prioritami jednotlivých úloh.

Termín Job Control Language se používá i jako obecné označení pro různé jazyky, které slouží k podobným účelům, jako například WFL od Burroughs Corporation a OCL od ICL. Tento článek se zabývá specificky jazykem JCL od IBM.

Existují dvě varianty jazyka JCL firmy IBM: jedna pro řadu systémů od DOS/360 po z/VSE a druhá pro řadu od OS/360 po z/OS. Obě sdílejí některá základní syntaktická pravidla a koncepty, avšak jinak jsou značně odlišné.

Syntaxe

Kvůli zachování kompatibility s existujícími programy se základní syntaxe JCL nezměnila od 60. let 20. století a používá se i v posledním operačním systému z/OS firmy IBM.

JCL se vyznačuje dvojicí lomítek, kterými začíná každý příkaz. Jejich používání pochází z doby, kdy se k zadávání úloh používaly balíky děrných štítků. Pokud by byl do snímače děrných štítků omylem vložen balíček štítků neobsahujících úlohu v JCL, štítky nezačínající dvěma lomítky by byly okamžitě odmítnuty a nemohly by způsobit chybnou akci.

//USER0001 JOB UCTO01,JORIS,CLASS=7,MSGCLASS=X ZPRACOVANI FAKTUR
//SPLATNE EXEC PGM=FAKTINF,TIME=(,50)
//INPUT DD DSN=SYSUSR1.SYSTEM.INPUT,DISP=SHR OPEN
//OUTPUT DD SYSOUT=*

Řádky v jazyce JCL musí splňovat následující podmínky:

  • Délka řádku je maximálně 80 znaků.
  • JCL příkazy se vždy píší velkými písmeny.
  • Každý řádek začíná dvojicí lomítek //, kromě dat vložených do příkazového proudu
  • Vlastní příkazy lze psát na pozice 3 až 71; vše od pozice 72 se považuje za komentář (tyto pozice lze použít pro číslování řádků; balík štítků se snadno rozsype a očíslované štítku umožňují jeho správné složení; existovaly stroje realizující přihrádkové řazení schopné štítky podle těchto čísel seřadit). Pokud příkaz pokračuje na dalším řádku, musí řádek končit čárkou.
  • JCL příkazy se skládají ze tří částí oddělených mezerami, uvnitř žádné z částí nesmí být žádná mezera:
    • uživatelem zvolené jméno příkazu (maximálně 8 znaků), na toto jméno se lze odkazovat v jiných krocích
    • příkaz (JOB, EXEC, DD, OUTPUT, ...)
    • parametry
      • poziční: pevné parametry musí být uvedeny vždy ve správném pořadí (při vynechání parametru musí být použita čárka)
      • klíčové: parametry bez pevného místa, které se skládají ze jména parametru a hodnoty, mezi nimiž je znak rovná se.
    • Všechno za těmito 3 částmi se považuje za komentář (např. ZPRACOVANI FAKTUR a OPEN v úvodním příkladu).

JOB

//USR007 JOB ACCN099,JODY,CLASS=6,MSGCLASS=X
  • jméno uživatele
  • JOB
  • účtovací číslo, jméno úlohy a klíčové parametry:
    • CLASS, PRTY: priority; kód priority
    • MSGCLASS
    • TYPRUN: SCAN pro pouhou kontrolu, HOLD čekat na pokyn ke spuštění od operátora
    • TIME=(mm,ss): v minutách a sekundách
    • REGION: velikost paměti (v k nebo M (bytech))
    • NOTIFY: pro upozornění uživatele user-id
    • COND: podmínka pro ukončení provádění úlohy

EXEC

//KROK1 EXEC PGM=READIN,COND=(0,NE),PARM=(ORDER=INCR,NUM=100)
  • jméno kroku
  • EXEC: spuštění programu executable
  • PGM, PROC: program, procedure; jméno programu nebo procedury a klíčové parametry:
    • TIME=(mm,ss): v minutách a sekundách
    • REGION: velikost paměti (v k nebo M (bytech))
    • PARM: parametry předávané programu
    • COND: condition; podmínka pro přeskočení kroku
    • IF (podmínka) THEN//ELSE//ENDIF: podmínková konstrukce

DD

//INPUT DD DSN=ISUSR.USR007.INPUT,DISP=SHR
//OUTPUT DD DSN=ISUSR.USR007.OUTPUT,DISP=(NEW,KEEP,DELETE),
//           DCB=(RECFM=FB,LRECL=80),SDORG=PO,
//           SPACE=(TRK,(5,3,10))
//OUTPUT2 DD DSN=ISUSR.USR007.OUTPUT,DISP=(NEW,KEEP,DELETE),
//            REFDD=*.STEP1.OUTPUT
//DATA DD *
04/01/1980
13/09/1979
10/12/1982
15/03/1986
/*
  • jméno
  • DD: definice dat (definice souboru) data definition
    • DSN: jméno souboru na disku data set name
    • DCB: data control block
      • RECFM: formát záznamu
      • LRECL: délka logického záznamu
    • DSORG: organizace souboru; sekvenční (PS) nebo členěný soubor (knihovna) (PO)

K dispozici jsou také předem specifikované názvy pro některé datové soubory:

  • JOBLIB, STEPLIB: knihovna pro příslušnou úlohu nebo krok
  • SYSIN: vstupní datový soubor
  • SYSABEND, SYSMDUMP, SYSUDUMP, CEEDUMP: dumps
  • SYSCHK, SYSCKEOV: kontrolní body checkpoints

INCLUDE

//USR009 JOB ACCN099,APRILIA,CLASS=8,MSGCLASS=X
//VERWYZING JCLLIB ORDER=(ISUSR.USR007.SOURCE,ISUSR.USR009.SOURCE)
//GO EXEC PGM=P3TST4
//STEPLIB DD DSN=ISUSR.COBOL.LINKLIB,DISP=SHR
//APPEND INCLUDE MEMBER=TST3
//
  • INCLUDE umožňuje znovupoužití kódu skriptu v jiném skriptu. Skript se musí nacházet v cestě uvedené v JCLLIB.

PROC

//DEMOJCL PROC
//KROKA EXEC PGM=TST7,TIME=(,08),REGION=&SIZE
//STEPLIB DD DSN=&PREFIX..COBOL.LINKLIB,DISP=SHR
//INPUT DD DSN=&PREFIX..LIST,DISP=SHR
// PEND
//PROC12 EXEC DEMOJCL,GROOTTE=256K,PREFIX=ISUSR

Procedury umožňují modulární práci; je možné je volat z různých míst úlohy. Navíc umožňují používání proměnných parametrů: jméno parametru začíná znakem ampersand & a končí tečkou (používanou pouze v případě potřeby).

Výstup JCL

Pro zpracování JCL úloh se používá spooling. Úlohy jsou načteny, zkontrolovány a prováděny. Jednotlivé JCL příkazy se vypisují do výstupu úlohy. V opisu příkazů procedur definovaných jinde ve skriptu se úvodní znaky // vypisují jako ++; u procedur vložených pomocí příkazu INCLUDE z jiného souboru se používají znaky XX.

Ukázka úlohy

//SU0003CL JOB (XXXX000),'TEST',CLASS=7,MSGCLASS=X
//**********************************************************************
//**                                                                ****
//*   PLEASE FILL IN THE COURSE DATASET PREFIX ON THE NEXT LINE
//**                                                                ****
//**********************************************************************
//JCLPROG  PROC PREFIX='.........'
//**********************************************************************
//*    COMPILE THE COBOL PROGRAM                                        
//**********************************************************************
//COB      EXEC PGM=IGYCRCTL                                            
//STEPLIB  DD  DSN=SYS3.IGY.V2R1M0.SIGYCOMP.LOCU,DISP=SHR
//SYSLIB   DD  DSN=TBISUSR.JCLCRS.SOURCE,DISP=SHR                       
//SYSLIN   DD  DSN=&&OBJECT,DISP=(MOD,PASS),SPACE=(CYL,(1,5))           
//SYSTERM  DD  SYSOUT=*                                                 
//SYSPRINT DD  SYSOUT=*                                                 
//SYSUDUMP DD  SYSOUT=*                                                 
//SYSUT1   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT2   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT3   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT4   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT5   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT6   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSUT7   DD  SPACE=(CYL,(2,5)),UNIT=SYSDA                             
//SYSIN    DD  DSN=&PREFIX..JCLCRS.SOURCE(&MEMBER),DISP=SHR             
//**********************************************************************
//*    LINK EDIT THE COBOL PROGRAM                                      
//**********************************************************************
//LKED   EXEC  PGM=IEWL,PARM='LIST,MAP,XREF',COND=(8,LE)                
//SYSUT1   DD  SPACE=(CYL,(1,1)),UNIT=SYSDA                             
//SYSPRINT DD  SYSOUT=*                                                 
//SYSLIB   DD  DSN=SYS2.COBOL2.LOAD,DISP=SHR                            
//         DD  DSN=SYS2.COBOL2.SUB.LOAD,DISP=SHR                        
//         DD  DSN=SYS2.COBOL2.SUB.LPA.LOAD,DISP=SHR                    
//         DD  DSN=&PREFIX..JCLCRS.LOAD,DISP=SHR
//SYSLMOD  DD  DSN=&PREFIX..JCLCRS.LOAD(&MEMBER),DISP=SHR
//SYSLIN   DD  DSN=&&OBJECT,DISP=(OLD,DELETE)
//        PEND
//**********************************************************************00010000
//CREATSUB EXEC JCLPROG,MEMBER=SUBRETCD
//CREATPGM EXEC JCLPROG,MEMBER=PGMRETCD
//

Odkazy

Reference

V tomto článku byl použit překlad textu z článku Job Control Language na nizozemské Wikipedii.

Externí odkazy