In this series we'll look at PL/I, or Programming Language 1, an ambitious multi-purpose language developed by IBM.

PL/I overview

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:

  • *PL1F was 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 *PL1 but this name is not available; use *PL1F.

  • *PL1OPT was 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.

  • *PLC was 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.

Prerequisites

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

Using *PLIF

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

Hello world

Here's a transcript of a session where we run a Hello world program. This assumes the source code is contained in the file hello.pl1.

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

Further information

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.