Monthly Archives: July 2025

NPLIHK: JCL

I posted this on my personal blog last week, and just realized I forgot to cross-post here.

So this is going to be a twist on my series on Programming Languages I Have Known. I’m going to talk about something that is often called a programming language but isn‘t one: the Job Control Language (JCL) of OS/360 and its successors.

Before talking about JCL, though, let’s start here. I assume everyone reading this (both of you!) is using a desktop or laptop computer, or a smart phone;.(I wonder how much longer we’ll say “smart phone” instead of just “phone”.) When you decide what program (or “app” as we tend to say these days) we want to use, if we’re on a desktop or laptop we’ll find the icon that represents it and double click with our mouse or trackpad or trackball. This is made possible by graphical terminals and pointing devices. If we’re on a phone, we again find the app icon, but now we just press on it, because the screens on our phones have special hardware that can sense touches. My point here is how we interact with our devices and signal what program we want to run depends on the available technologies for input and output.

The original Macintosh was revolutionary for the time because it had a graphical display and a mouse. Before that the computers most people used had text-based terminals, that could only display letters, numbers, and punctuation. You told it which program to run by typing in the program’s name and perhaps some additional information and then pressing “Enter”. This is now called a Command Line Interface (CLI) while the what Macintosh does is called a Graphical User Interface (GUI). (CLIs still exist. I use one almost every day. They are harder to learn than GUIs, but if you have learned them they can be faster and more flexible than a GUI.)

In the early 1960s, when IBM was developing System/360, the principle technology for inputing data into computers was Hollerith or “punch” cards. So when they needed a way for people to tell these computers what program to run, they designed it for that interface. The result was JCL. So, for example, JCL has an EXEC statement that you use to tell the computer which program to use. It has DD (Data Definition) statements to tell which files to use for input or output, somewhat analogous to the “Save” or “Open” dialogues in the Mac or Windows interface.

This is not to say that JCL is particularly well designed. My understanding is that IBM was getting close to releasing OS/360 when someone realized they were going to need something like JCL, and so it was thrown together somewhat haphazardly. Also, more recent operating systems abstract many of the lower-level details about the physical nature of I/O devices that JCL still exposes.

So there you have it: JCL is not a programming language. It’s the friendliest punch-card-based Human Interface language the IBM engineers could throw together at the last minute in 1964 or ’65.