In this series we'll look at PL/I, or Programming Language 1, an ambitious multi-purpose language developed by IBM.
PL/I was intended to be a programming language for all users - scientific, business and systems. It was originally developed by IBM in the mid '60s and spread to other mainframes, Multics and DEC systems. A subset of the language was used to create CP/M and IBM produced a version for OS/2 on PCs that was competitive with C. A standardised specification was produced by ECMA and ANSI from the early '70s. Although it gained some popularity (it was even used as a teaching language at some universities) it never really took off in any of the fields it was intended for.
Language-wise, it is a procedural imperative language drawing inspiration from FORTRAN, COBOL and ALGOL. Due to its intended wide coverage, it is a very large language with a number of interesting features, some of which were incorporated into later languages such as C.
PL/I on MTS
There were three PL/I environments originally available on MTS:
*PL1Fwas derived from the IBM OS/360 F version 5 compiler with modifications for MTS. This is the only version available on the D6.0 tapes today and the one we will look at here. The MTS docuimentation refers to this as
*PL1but this name is not available; use
*PL1OPTwas the IBM optimising compiler for PL/I and is not available due to copyright reasons. It took many of the compiler optimisation techniques developed for the FORTRAN H compiler and also offered a checkout facility for improved debugging.
*PLCwas a load-and-go processor developer at Cornell; according to the MTS Archive the source and object code for this has been lost. It had the unique feature that any input would compile (but maybe not produce the desired results) due to automatic substitution of syntax errors.
There are also a number of utility programs for PL/I
*PL1SCAN does a quick syntax check of a program and
*PL1TIDY formats a PL/I source file.
No special installation instructions to get PL/I running - just do the standard D6.0 setup as described in this guide and then sign on as a regular user such as
*PLIF will read source from
scards (by default
*source* ie standard input) and will write object files to
spunch. Unlike some other MTS compilers you need to provide a filename for
spunch as there is no default. You should destroy or empty the contents of the object file before recompiling.
Other compilation parameters are listed in MTS Volume 7.
To run PL/I programs you need to concatenate the runtime library
*PL1LIB with the object file.
Here's a transcript of a session where we run a Hello world program. This assumes the source code is contained in the file
# $list hello.pl1 1 /* Hello world program in PL/I */ 2 HELLO: PROCEDURE OPTIONS(MAIN); 3 DECLARE I FIXED BINARY(16); 4 DO I = 1 TO 5; 5 PUT FILE (SCARDS) LIST('Hello, world!'); 6 PUT FILE (SCARDS) SKIP; 7 END HELLO; # $destroy -load File "-LOAD" has been destroyed. # $run *pl1f scards=hello.pl1 spunch=-load # Execution begins 12:18:31 PROCEDURE HELLO: SYNTAX CHECK COMPLETED. COMPILATION CONTINUES. NO ERRORS OR WARNINGS DETECTED. # Execution terminated 12:18:31 T=0.087 # $run -load+*pl1lib # Execution begins 12:18:34 'Hello, world!' 'Hello, world!' 'Hello, world!' 'Hello, world!' 'Hello, world!' # Execution terminated 12:18:34 T=0.002
MTS Volume 7 describes the PL/I compilers available on MTS.
The original IBM documentation for the PL/I language and PL/I F compiler can be found at bitsavers.
A good introduction to PL/I is the PL/I Primer.
The Wikipedia article gives an extensive history and list of implementations.