April 19, 2018
batch, COBOL, dependencies, EBCDIC, editors, ftp, git, loadmodule, LzLabs, mainframe, make, PDS, PL/I, t3270
Once upon a time, in a land far from any modern developers, were languages named COBOL and PL/I, which generated programs that were consumed by a beast known as Mainframe. Developers for those languages compiled and linked their applications huddled around strange luminous green screens and piles of hole filled papers while chanting vaguely latin sounding incantations like “Om-padre-JCL-beget-loadmodule-pee-dee-ess.”
In these ancient times, version control tools like git were not available. There was no notion of makefiles, so compilation and link was a batch process, with no dependency tracking, and no parallelism. Developers used printf-style debugging, logging trace information to files. In order to keep the uninitiated from talking to the Mainframe, files were called datasets. In order to use graphical editors, developers had to repeatedly feed their source to the Mainframe using a slave named ftp, while praying that the evil demon EBCDIC-conversion didn’t mangle their work. The next day, they could go back and see if Mainframe accepted their offering.
[TO BE CONTINUED.]
Incidentally, as of a couple days ago, I’ve now been working for LzLabs for 2 years. My work is not yet released, nor announced, so I can’t discuss it here yet, but it can be summarized as really awesome. I’m still having lots of fun with my development work, even if I have to talk in languages that the beast understands.
I found a PDS container walking about my neighbourhood this morning:
Just like the mainframe version, you can put all sorts of stuff in this one.
A mainframe PDS (partitioned data set) is technically a different sort of container, as you can only put DATASETs (mainframe’ze for a file) in them. An example would be if you have two programs (loadmodules in mainframe’ze) both named PEETERJO, then you can create a two PDS datasets, each having a PEETERJO member, say:
From these you could then choose which one you want your JCL script to execute with a STEPLIB statement like:
//A EXEC PGM=PEETERJO
//STEPLIB DD DSN=PEETER.JOOT.IS.THE.BEST,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTERM DD SYSOUT=*
//SYSABEND DD SYSOUT=*
This works around the global name space issue that you’d have with storing two different datasets, both with the name PEETERJO.
You can also put any file into a PDS, provided you are willing to have the PDS member name for that file be a 1-8 character string. The PDS is sort of the mainframe equivalent of a directory (the long strings of A.B.C.D.E DATASET names can also be viewed as a directory of sorts).
I’m not sure if you can put a PDS in a PDS. If that is possible, I also don’t know if a PDS member can be accessed as a PDS without first copying it out.