# 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.
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

* 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

* 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

* 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

* 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

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.