If you are anything like me, you've probably never even heard of JCL before. Most people haven't, and to most people it isn't relevant to what they're doing. It's a language used by IBM mainframes for running batch jobs - aptly, it stands for Job Control Language. It is composed of a jobcard(usually the first one or two lines) which defines options for the job, and a series of steps to execute. Some very simple JCL:
//FOO JOB ZZZZZ,'PAUL ANDERSON',CLASS=A,
//STEP1 EXEC PGM=IEFBR14
The first line is our jobcard. Immediately following the two slashes we have the name of the job, FOO. You'll notice it's all uppercase, in my very limited experience, JES2 gets super angry when you have lower-case characters. After the jobname, we have the JOB statement, whitespace, and first the accounting number. Historically, this was used for billing purposes. Today it is substantially deprecated. Next, we find the name of the jobs author(moi). CLASS defines an execution class for the job. This controls the priority of the job, how long it is permitted to run, etc. MSGCLASS tells JES2 what to do with the output of the job. Both CLASS and MSGCLASS are defined in the configuration for JES2, often located in SYS1.PARMLIB IIRC. MSGLEVEL tells it what sort of messages we want to see in the output. There are other parameters supported in the jobcard, I will have to get into those later.
//* is a comment. Our next line, is the first(and only) step in this job. It begins with a stepname, STEP1. EXEC tells JES2 to run the program specified by PGM. In this case, we're running IEFBR14. IEFBR14 does nothing. It just exits cleanly with a return code of 0. This is more useful than it may at first appear, I assure you.
There it is, a very perfunctory intro to JCL. More details shall be forthcoming.