Job Control Language
Job Control Language (beter bekend onder de afkorting JCL) is een scripttaal die op IBM-mainframes wordt gebruikt om opdrachten te geven aan het Job Entry Subsystem (JES2 of JES3) waarmee een batchprogramma of subsysteem kan worden gestart.

Met JCL kan (dure) CPU-tijd op mainframes verdeeld worden tussen verschillende bedrijven, en gespreid worden over de tijd, aan de hand van prioriteitscodes.

Syntaxis
Om compatibel te zijn met bestaande programmatuur is de basissyntaxis van JCL, dat ook in het huidige z/OS wordt gebruikt, niet gewijzigd sinds de jaren 1960.

JCL wordt gekenmerkt door het tweetal schuine strepen ('slashes') die het begin aangeven van elke statement. Dit gebruik van schuine strepen als beginmarkering komt uit de tijd dat ponskaarten gebruikt werden om JCL-code in te voeren. Als de stapel ponskaarten per ongeluk achterstevoren in de kaartlezer werd geplaatst, stonden de schuine strepen niet aan het begin van de regel en werd de stapel ponskaarten afgekeurd.
//USER0001 JOB REKNR01,JORIS,CLASS=7,MSGCLASS=X FACTUREN MAKEN
//VRAAGOP EXEC PGM=REKINF,TIME=(,50)
//INVOER DD DSN=SYSUSR1.SYSTEM.INPUT,DISP=SHR OPENEN
//OPSLAAN DD SYSOUT=*
Een JCL-regel moet voldoen aan volgende voorwaarden:
 Elke regel begint met "//", met uitzondering van in-stream data
 Er staan maximaal 80 tekens op een regel.
 JCL-commando's staan altijd in hoofdletters.
 Commando's staan enkel tussen posities 3 en 71; alles vanaf positie 72 wordt als niet-uitvoerbare commentaar (bijvoorbeeld regelnummers) gezien. Om de commandolijn te vervolgen op de volgende regel, moet de voorgaande regel eindigen op een komma.
 JCL-commando's bestaan uit drie blokken die binnen het blok geen spaties hebben:
 een vrij te kiezen naam van het commando (maximaal 8 tekens), zodat ernaar verwezen kan worden
 de bewerking (JOB, EXEC, DD, OUTPUT, ...)
 de parameters
 de positionals: vaste parameters die altijd in die volgorde dienen voor te komen (bij weglating moet nog steeds een komma geschreven worden)
 de keywords: parameterbepalingen zonder vaste plaats die steeds bestaan uit twee leden: het sleutelwoord en de waarde, met daartussen een gelijkheidsteken.
 Alles wat erna komt, wordt als commentaar beschouwd.

JOB
//USR007 JOB ACCN099,JODY,CLASS=6,MSGCLASS=X
 gebruikersnaam
 JOB
 accountnummer, jobnaam en sleutelwoorden:
 CLASS, PRTY: priority; prioriteitscodes
 MSGCLASS
 TYPRUN: proeflezen met SCAN, wachten met HOLD
 TIME=(mm,ss): in minuten en seconden
 REGION: schijfruimte (in k of M (bytes))
 NOTIFY: te verwittigen user-id
 COND: condition; stopvoorwaarde

EXEC
//STAP1 EXEC PGM=INLEZEN,COND=(0,NE),PARM=(ZIN=OPLOPEND,AANTAL=100)
 naam
 EXEC: executable
 PGM, PROC: program, procedure; programma- of procedurenaam en sleutelwoorden:
 TIME=(mm,ss): in minuten en seconden
 REGION: schijfruimte (in k of M (bytes))
 PARM: parameters om mee te geven aan het uit te voeren programma
 COND: condition; stopvoorwaarde
 IF (voorwaarde) THEN//ELSE//ENDIF: voorwaarde-constructie

DD
//INVOER DD DSN=ISUSR.USR007.INPUT,DISP=SHR
//UITVOER DD DSN=ISUSR.USR007.OUTPUT,DISP=(NEW,KEEP,DELETE),
//           DCB=(RECFM=FB,LRECL=80),SDORG=PO,
//           SPACE=(TRK,(5,3,10))
//UITVOER2 DD DSN=ISUSR.USR007.OUTPUT,DISP=(NEW,KEEP,DELETE),
//            REFDD=*.STEP1.UITVOER
//MANUEEL DD *
04/01/1980
13/09/1979
10/12/1982
15/03/1986
/*
 naam
 DD: data definition
 DSN: data set name
 DCB: data control block
 RECFM: record format
 LRECL: local record length
 DSORG: data set organisation; sequentieel (PS) of gepartitioneerd (PO)
Er bestaan ook vooraf gespecifieerde namen voor bepaalde datasets:
 JOBLIB, STEPLIB: library voor betreffende job of stap
 SYSIN: in-stream gegevens
 SYSABEND, SYSMDUMP, SYSUDUMP, CEEDUMP: dumps
 SYSCHK, SYSCKEOV: checkpoints

INCLUDE
//USR009 JOB ACCN099,APRILIA,CLASS=8,MSGCLASS=X
//VERWYZING JCLLIB ORDER=(ISUSR.USR007.SOURCE,ISUSR.USR009.SOURCE)
//GO EXEC PGM=P3OEF4
//STEPLIB DD DSN=ISUSR.COBOL.LINKLIB,DISP=SHR
//TOEVOEGEN INCLUDE MEMBER=OEF3
//
 INCLUDE laat toe om programmacode te hergebruiken: de code van een ander script kan hiermee opgevraagd worden. Het script moet zich in het zoekpad van JCLLIB bevinden.

PROC
//DEMOJCL PROC
//STAPA EXEC PGM=OEF7,TIME=(,08),REGION=&GROOTTE
//STEPLIB DD DSN=&PREFIX..COBOL.LINKLIB,DISP=SHR
//INVOER DD DSN=&PREFIX..LIST,DISP=SHR
// PEND
//PROC12 EXEC DEMOJCL,GROOTTE=256K,PREFIX=ISUSR
Procedures laten toe om modulair te werken; ze kan op verschillende plaatsen opgeroepen worden. Bovendien kunnen variabele parameters gebruikt worden: de ampersand & en het punt (indien noodzakelijk) begrenzen de parameternaam

JCL-output
In de SPOOL (Simultaneous Peripheral Operations On-Line) komt de informatie over het proeflezen en uitvoeren van het script terecht. Het script zelf wordt hier ook in opgenomen. Opgeroepen procedures uit het script zelf worden voorafgegaan door ++ in plaats van //; de procedures die met INCLUDE ingevoegd worden vanuit een ander bestand, worden voorafgegaan door XX.

Voorbeeldskelet
//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
//

Externe links
 z/OS V1R6.0-V1R8.0 MVS JCL User's Guide
 z/OS V1R7.0-V1R8.0 MVS JCL Reference
 OS390/libraryserver (ibm.com)

Mainframe
Programmeertaal