IBM PL/I F and D compilers PL/I was first implemented by IBM, at its
Hursley Laboratories in the United Kingdom, as part of the development of
System/360. The first production PL/I
compiler was the PL/I F compiler for the
OS/360 Operating System, built by John Nash's team at Hursley in the UK: the
runtime library team was managed by I.M. (Nobby) Clarke. The PL/I F compiler was written entirely in System/360
assembly language. Release 1 shipped in 1966. OS/360 is a real-memory environment and the compiler was designed for systems with as little as 64 kilobytes of real storage – F being 64 kB in S/360 parlance. To fit a large compiler into the 44 kilobytes of memory available on a 64-kilobyte machine, the compiler consists of a control phase and a large number of compiler phases (approaching 100). The phases are brought into memory from disk, one at a time, to handle particular language features and aspects of compilation. Each phase makes a single pass over the partially-compiled program, usually held in memory. Aspects of the language were still being designed as PL/I F was implemented, so some were omitted until later releases. PL/I RECORD I/O was shipped with PL/I F Release 2. The
list processing functions Based Variables, Pointers, Areas and Offsets and
LOCATE-mode I/O were first shipped in Release 4. In a major attempt to speed up PL/I code to compete with Fortran object code, PL/I F Release 5 does substantial
program optimization of DO-loops facilitated by the REORDER option on procedures. A version of PL/I F was released on the
TSS/360 timesharing operating system for the
System/360 Model 67, adapted at the IBM Mohansic Lab. The IBM La Gaude Lab in France developed "Language Conversion Programs" to convert Fortran, Cobol, and Algol programs to the PL/I F level of PL/I. The PL/I D compiler, using 16 kilobytes of memory, was developed by IBM Germany for the
DOS/360 low end operating system. It implements a subset of the PL/I language requiring all strings and arrays to have fixed extents, thus simplifying the run-time environment. Reflecting the underlying operating system, it lacks dynamic storage allocation and the
controlled storage class. It was shipped within a year of PL/I F.
Multics PL/I and derivatives Compilers were implemented by several groups in the early 1960s. The
Multics project at
MIT, one of the first to develop an operating system in a
high-level language, used Early PL/I (EPL), a subset dialect of PL/I, as their implementation language in 1964. EPL was developed at
Bell Labs and MIT by
Douglas McIlroy,
Robert Morris, and others. The influential Multics PL/I compiler [sic "PL/1"] was the source of compiler technology used by a number of manufacturers and software groups. EPL was a system programming language and a dialect of PL/I that had some capabilities absent in the original PL/I. The Honeywell PL/I compiler (for Series 60) is an implementation of the full ANSI X3J1 standard.
IBM PL/I optimizing and checkout compilers The PL/I Optimizer and Checkout compilers produced in Hursley support a common level of PL/I language and aimed to replace the PL/I F compiler. The checkout compiler is a rewrite of PL/I F in BSL, IBM's PL/I-like proprietary implementation language (later
PL/S). (colloquially "The Checker") announced in August 1970 was designed to speed and improve the debugging of PL/I programs. The team was led by Brian Marks. The three-pass design cut the time to compile a program to 25% of that taken by the F Compiler. It can be run from an interactive terminal, converting PL/I programs into an internal format, "H-text". This format is interpreted by the Checkout compiler at run-time, detecting virtually all types of errors. Pointers are represented in 16 bytes, containing the target address and a description of the referenced item, thus permitting "bad" pointer use to be diagnosed. In a conversational environment when an error is detected, control is passed to the user who can inspect any variables, introduce debugging statements and edit the source program. Over time the debugging capability of mainframe programming environments developed most of the functions offered by this compiler and it was withdrawn (in the 1990s?)
DEC PL/I Perhaps the most commercially successful implementation aside from IBM's was Digital Equipment Corporation's VAX-11 PL/I, later known as VAX PL/I, then DEC PL/I. The implementation is "a strict superset of the ANSI X3.4-1981 PL/I General Purpose Subset and provides most of the features of the new ANSI X3.74-1987 PL/I General Purpose Subset", and was first released in 1980. It originally used a compiler backend named the VAX Code Generator (VCG) created by a team led by
Dave Cutler. The front end was designed by Robert Freiburghouse, and was ported to
VAX/VMS from
Multics. It runs on VMS on
VAX and
Alpha, and on
Tru64. During the 1990s, Digital sold the compiler to
UniPrise Systems, who later sold it to a company named Kednos. Kednos marketed the compiler as Kednos PL/I until October 2016 when the company ceased trading.
Teaching subset compilers In the late 1960s and early 1970s, many US and Canadian universities were establishing time-sharing services on campus and needed conversational compiler/interpreters for use in teaching science, mathematics, engineering, and computer science.
Dartmouth was developing
BASIC, but PL/I was a popular choice, as it was concise and easy to teach. As the IBM offerings were unsuitable, a number of schools built their own subsets of PL/I and their own interactive support. Examples are: In the 1960s and early 1970s,
Allen-Babcock implemented the Remote Users of Shared Hardware (RUSH) time sharing system for an
IBM System/360 Model 50 with custom
microcode and subsequently implemented IBM's
CPS, an interactive time-sharing system for
OS/360 aimed at teaching computer science basics, offered a limited subset of the PL/I language in addition to BASIC and a remote job entry facility.
PL/C, a dialect for teaching, a compiler developed at
Cornell University, had the unusual capability of never failing to compile any program through the use of extensive automatic correction of many syntax errors and by converting any remaining syntax errors to output statements. The language was almost all of PL/I as implemented by IBM. PL/C was a very fast compiler. '''''' (Student Language/1, Student Language/One or Subset Language/1) and focused on good diagnostic error messages and fast compilation times. The Computer Systems Research Group of the University of Toronto produced the
SP/k compilers which supported a sequence of subsets of PL/I called SP/1, SP/2, SP/3, ..., SP/8 for teaching programming. Programs that ran without errors under the SP/k compilers produced the same results under other contemporary PL/I compilers such as IBM's PL/I F compiler, IBM's checkout compiler or Cornell University's PL/C compiler. Other examples are
PL0 by P. Grouse at the University of New South Wales,
PLUM by
Marvin Victor Zelkowitz at the University of Maryland., and
PLUTO from the University of Toronto.
IBM PL/I for OS/2, AIX, Linux, z/OS In a major revamp of PL/I, IBM Santa Teresa in California launched an entirely new compiler in 1992. The initial shipment was for OS/2 and included most ANSI-G features and many new PL/I features. Subsequent releases provided additional platforms (
MVS,
VM,
OS/390,
AIX and
Windows), but as of 2021, the only supported platforms are
z/OS and AIX. IBM continued to add functions to make PL/I fully competitive with other languages (particularly C and C++) in areas where it had been overtaken. The corresponding "IBM Language Environment" supports inter-operation of PL/I programs with Database and Transaction systems, and with programs written in C, C++, and COBOL, the compiler supports all the data types needed for intercommunication with these languages. The PL/I design principles were retained and withstood this major extension, comprising several new data types, new statements and statement options, new exception conditions, and new organisations of program source. The resulting language is a compatible super-set of the PL/I Standard and of the earlier IBM compilers. Major topics added to PL/I were: • New attributes for better support of user-defined data types – the DEFINE ALIAS, ORDINAL, and DEFINE STRUCTURE statement to introduce user-defined types, the HANDLE locator data type, the TYPE data type itself, the UNION data type, and built-in functions for manipulating the new types. • Type functions, roughly analogous to builtin class methods. • Additional data types and attributes corresponding to common PC data types (e.g., UNSIGNED, VARYINGZ). • Improvements in readability of programs – often rendering implied usages explicit (e.g., BYVALUE attribute for parameters) • Additional structured programming constructs. • Interrupt handling additions. • Compile time preprocessor extended to offer almost all PL/I string handling features and to interface with the Application Development Environment The latest series of PL/I compilers for z/OS, called Enterprise PL/I for z/OS, leverage code generation for the latest z/Architecture processors (z14, z13, zEC12, zBC12, z196, z114) via the use of ARCHLVL parm control passed during compilation, and was the second high-level language supported by z/OS Language Environment to do so (XL C/C++ being the first, and Enterprise COBOL v5 the last.)
Data types is a new computational data type. The ordinal facilities are like those in
Pascal, e.g., but in addition the name and internal values are accessible via built-in functions. Built-in functions provide access to an ordinal value's predecessor and successor. The FIRST and LAST type functions provide access to an ordinal set's range. The -statement (see below) allows additional s to be declared composed from PL/I's built-in attributes. The HANDLE(data structure) locator data type is similar to the data type, but strongly typed to bind only to a particular data structure. The => operator is used to select a data structure using a handle. The attribute (equivalent to in early PL/I specifications) permits several scalar variables, arrays, or structures to share the same storage in a unit that occupies the amount of storage needed for the largest alternative.
Competitiveness on PC and with C These attributes were added: • The string attributes VARYINGZ (for zero-terminated character strings), HEXADEC, WIDECHAR, and GRAPHIC. • The optional arithmetic attributes UNSIGNED and SIGNED, BIGENDIAN and LITTLEENDIAN. UNSIGNED necessitated the UPTHRU and DOWNTHRU option on iterative groups enabling a counter-controlled loop to be executed without exceeding the limit value (also essential for ORDINALs and good for documenting loops). • The DATE(pattern) attribute for controlling date representations and additions to bring time and date to best current practice. New functions for manipulating dates include DAYS and DAYSTODATE for converting between dates and number of days, and a general DATETIME function for changing date formats. New string-handling functions were added to centre text, to edit using a picture format, and to trim blanks or selected characters from the head or tail of text, VERIFYR to VERIFY from the right. and SEARCH and TALLY functions. Compound assignment operators a la C e.g., +=, &=, -=, ||= were added. A+=1 is equivalent to A=A+1. Additional parameter
descriptors and attributes were added for omitted arguments and variable length argument lists.
Program readability – making intentions explicit The attribute declares an identifier as a constant (derived from a specific literal value or restricted expression). Parameters can have the (pass by address) or (pass by value) attributes. The and attributes prevent unintended assignments. DO FOREVER; obviates the need for the contrived construct . The -statement introduces user-specified names (e.g., ) for combinations of built-in attributes (e.g., FIXED BINARY(31,0)). Thus DEFINE ALIAS INTEGER FIXED BINARY(31.0) creates the name as an alias for the set of built-in attributes FIXED BINARY(31.0). DEFINE STRUCTURE applies to structures and their members; it provides a name for a set of structure attributes and corresponding substructure member declarations for use in a structure declaration (a generalisation of the attribute).
Structured programming additions A statement to exit a loop, and an to continue with the next iteration of a loop. and options on iterative groups. The package construct consisting of a set of procedures and declarations for use as a unit. Variables declared outside of the procedures are local to the package, and can use , or storage. Procedure names used in the package also are local, but can be made external by means of the option of the -statement.
Interrupt handling The -statement executed in an ON-unit terminates execution of the ON-unit, and raises the condition again in the procedure that called the current one (thus passing control to the corresponding ON-unit for that procedure). The condition handles invalid operation codes detected by the PC processor, as well as illegal arithmetic operations such as subtraction of two infinite values. The condition is provided to intercept conditions for which no specific ON-unit has been provided in the current procedure. The condition is raised when an statement is unable to obtain sufficient storage.
Other mainframe and minicomputer compilers A number of vendors produced compilers to compete with IBM PL/I F or Optimizing compiler on mainframes and minicomputers in the 1970s. In the 1980s the target was usually the emerging ANSI-G subset. • In 1974
Burroughs Corporation announced PL/I for the B6700 and B7700. •
UNIVAC released a UNIVAC PL/I, and in the 1970s also used a variant of PL/I, PL/I PLUS, for system programming. • From 1978
Data General provided PL/I on its
Eclipse and
Eclipse MV platforms running the
AOS,
AOS/VS &
AOS/VS II operating systems. A number of operating system utility programs were written in the language. • Paul Abrahams of NYU's Courant Institute of Mathematical Sciences wrote CIMS PL/I in 1972 in PL/I, bootstrapping via PL/I F. It supported "about 70%" of PL/I compiling to the CDC 6600 •
CDC delivered an optimizing subset PL/I compiler for Cyber 70, 170 and 6000 series. • Fujitsu delivered a PL/I compiler equivalent to the PL/I Optimizer. • Stratus Technologies PL/I is an ANSI G implementation for the
VOS operating system. •
IBM Series/1 PL/I is an extended subset of ANSI Programming Language PL/I (ANSI X3.53-1976) for the IBM Series/1 Realtime Programming System.
PL/I compilers for Microsoft .NET • In 2011, Raincode designed a full legacy compiler for the
Microsoft .NET and
.NET Core platforms, named The Raincode PL/I compiler.
PL/I compilers for personal computers and Unix • In the 1970s and 1980s
Digital Research sold a PL/I compiler for
CP/M (PL/I-80),
CP/M-86 (PL/I-86) and
IBM PC compatibles with
MS-DOS or
IBM PC DOS.. It was based on Subset G of PL/I and UNIX/Linux systems, which they acquired from Liant. • IBM delivered PL/I for
OS/2 • Iron Spring PL/I for
OS/2 and later
Linux was introduced in 2007. •
GCC (pl1gcc) front end; the project's last release was in September 2007. ==PL/I dialects==