fbpx
Wikipedia

PL/I

PL/I (Programming Language One, pronounced /p ɛl wʌn/ and sometimes written PL/1)[1] is a procedural, imperative computer programming language initially developed by IBM. It is designed for scientific, engineering, business and system programming. It has been in continuous use by academic, commercial and industrial organizations since it was introduced in the 1960s.[2]

PL/I
ParadigmProcedural, imperative, structured
Designed byIBM, the SHARE Language Development Committee, and ISO
First appeared1964; 60 years ago (1964)
Websitewww.ibm.com/products/pli-compiler-zos
Dialects
See dialects
Influenced by
COBOL, Fortran, ALGOL 60
Influenced
Control Language, PL/M, PL/S, PL-6, PL.8, REXX, SAS
  • PL/I at Wikibooks

The PL/1 ANSI standard, X3.53-1976, was published in 1976.

PL/I's main domains are data processing, numerical computation, scientific computing, and system programming. It supports recursion, structured programming, linked data structure handling, fixed-point, floating-point, complex, character string handling, and bit string handling. The language syntax is English-like and suited for describing complex data formats with a wide set of functions available to verify and manipulate them.

Early history edit

In the 1950s and early 1960s, business and scientific users programmed for different computer hardware using different programming languages. Business users were moving from Autocoders via COMTRAN to COBOL, while scientific users programmed in Fortran, ALGOL, GEORGE, and others. The IBM System/360[3] (announced in 1964 and delivered in 1966) was designed as a common machine architecture for both groups of users, superseding all existing IBM architectures. Similarly, IBM wanted a single programming language for all users. It hoped that Fortran could be extended to include the features needed by commercial programmers. In October 1963 a committee was formed[4] composed originally of three IBMers from New York and three members of SHARE, the IBM scientific users group, to propose these extensions to Fortran. Given the constraints of Fortran, they were unable to do this and embarked on the design of a new programming language based loosely on ALGOL labeled NPL. This acronym conflicted with that of the UK's National Physical Laboratory and was replaced[5] briefly by MPPL (MultiPurpose Programming Language) and, in 1965, with[6] PL/I (with a Roman numeral "I"). The first definition appeared in April 1964.[7][8]

IBM took NPL as a starting point and completed the design to a level that the first compiler could be written: the NPL definition was incomplete in scope and in detail.[9] Control of the PL/I language[10] was vested initially in the New York Programming Center and later at the IBM UK Laboratory at Hursley. The SHARE and GUIDE user groups were involved in extending the language and had a role in IBM's process for controlling the language through their PL/I Projects. The experience of defining such a large language showed the need for a formal definition of PL/I. A project was set up in 1967 in IBM Laboratory Vienna to make an unambiguous and complete specification.[11] This led in turn to one of the first large scale Formal Methods for development, VDM.

Fred Brooks is credited with ensuring PL/I had the CHARACTER data type.[12]

The language was first specified in detail in the manual "PL/I Language Specifications. C28-6571", written in New York in 1965, and superseded by "PL/I Language Specifications. GY33-6003", written by Hursley in 1967. IBM continued to develop PL/I in the late sixties and early seventies, publishing it in the GY33-6003 manual. These manuals were used by the Multics group and other early implementers.

The first compiler was delivered in 1966. The Standard for PL/I was approved in 1976.

Goals and principles edit

The goals for PL/I evolved during the early development of the language. Competitiveness with COBOL's record handling and report writing was required. The language's scope of usefulness grew to include system programming and event-driven programming.[13] Additional goals for PL/I were:[3]

  • Performance of compiled code competitive with that of Fortran (but this was not achieved)[citation needed]
  • Extensibility for new hardware and new application areas
  • Improved productivity of the programming process, transferring effort from the programmer to the compiler
  • Machine independence to operate effectively on the main computer hardware and operating systems

To achieve these goals, PL/I borrowed ideas from contemporary languages while adding substantial new capabilities and casting it with a distinctive concise and readable syntax. Many principles and capabilities combined to give the language its character and were important in meeting the language's goals:

  • Block structure, with underlying semantics (including recursion), similar to Algol 60. Arguments are passed using call by reference, using dummy variables for values where needed (call by value).
  • A wide range of computational data types, program control data types, and forms of data structure (strong typing).
  • Dynamic extents for arrays and strings with inheritance of extents by procedure parameters.
  • Concise syntax for expressions, declarations, and statements with permitted abbreviations. Suitable for a character set of 60 glyphs and sub-settable to 48.
  • An extensive structure of defaults in statements, options, and declarations to hide some complexities and facilitate extending the language while minimizing keystrokes.
  • Powerful iterative processing with good support for structured programming.
  • There were to be no reserved words (although the function names DATE and TIME initially proved to be impossible[citation needed] to meet this goal). New attributes, statements and statement options could be added to PL/I without invalidating existing programs. Not even IF, THEN, ELSE, and DO were reserved.[14]
  • Orthogonality: each capability to be independent of other capabilities and freely combined with other capabilities wherever meaningful. Each capability to be available in all contexts where meaningful, to exploit it as widely as possible and to avoid "arbitrary restrictions". Orthogonality helps make the language "large".[clarification needed]
  • Exception handling capabilities for controlling and intercepting exceptional conditions at run time.
  • Programs divided into separately compilable sections, with extensive compile-time facilities (a.k.a. macros), not part of the standard, for tailoring and combining sections of source code into complete programs. External names to bind separately compiled procedures into a single program.
  • Debugging facilities integrated into the language.

Language summary edit

The language is designed to be all things to all programmers.[vague][15] The summary is extracted from the ANSI PL/I Standard[16] and the ANSI PL/I General-Purpose Subset Standard.[17]

A PL/I program consists of a set of procedures, each of which is written as a sequence of statements. The %INCLUDE construct is used to include text from other sources during program translation. All of the statement types are summarized here in groupings which give an overview of the language (the Standard uses this organization).

Category Statement
Structural PROCEDURE (or PROC)
ENTRY
BEGIN
DO
END
Declarative DECLARE (or DCL)
DEFAULT (or DFT)
FORMAT
Flow of control CALL
IF
SELECT
GO TO
RETURN
STOP
Null statement
Category Statement
Interrupt handling ON
SIGNAL
REVERT
Storage ALLOCATE (or ALLOC)
FREE
Assignment statement
Input/Output OPEN
CLOSE
Stream input/output GET
PUT
Record input/output READ
WRITE
REWRITE
LOCATE
DELETE

(Features such as multi-tasking and the PL/I preprocessor are not in the Standard but are supported in the PL/I F compiler and some other implementations are discussed in the Language evolution section.)

Names may be declared to represent data of the following types, either as single values, or as aggregates in the form of arrays, with a lower-bound and upper-bound per dimension, or structures (comprising nested structure, array and scalar variables):

  • Arithmetic (expanded below)
  • CHARACTER
  • PICTURE for Arithmetic data
  • PICTURE for Character data
  • AREA
  • BIT
  • ENTRY
  • FILE
  • FORMAT
  • LABEL
  • OFFSET
  • POINTER

The arithmetic type comprises these attributes:

  • a base (BINARY or DECIMAL), and
  • a scale (FIXED or FLOAT), and
  • a mode (REAL or COMPLEX), and
  • a PRECISION (number of digits, and for fixed point numbers, a scale factor)

The base, scale, precision and scale factor of the Picture-for-arithmetic type is encoded within the picture-specification. The mode is specified separately, with the picture specification applied to both the real and the imaginary parts.

Values are computed by expressions written using a specific set of operations and builtin functions, most of which may be applied to aggregates as well as to single values, together with user-defined procedures which, likewise, may operate on and return aggregate as well as single values. The assignment statement assigns values to one or more variables.

There are no reserved words in PL/I. A statement is terminated by a semi-colon. The maximum length of a statement is implementation defined. A comment may appear anywhere in a program where a space is permitted and is preceded by the characters forward slash, asterisk and is terminated by the characters asterisk, forward slash (i.e. /* This is a comment. */). Statements may have a label-prefix introducing an entry name (ENTRY and PROCEDURE statements) or label name, and a condition prefix enabling or disabling a computational condition – e.g. (NOSIZE)). Entry and label names may be single identifiers or identifiers followed by a subscript list of constants (as in L(12,2):A=0;).

A sequence of statements becomes a group when preceded by a DO statement and followed by an END statement. Groups may include nested groups and begin blocks. The IF statement specifies a group or a single statement as the THEN part and the ELSE part (see the sample program). The group is the unit of iteration. The begin block (BEGIN; stmt-list END;) may contain declarations for names and internal procedures local to the block. A procedure starts with a PROCEDURE statement and is terminated syntactically by an END statement. The body of a procedure is a sequence of blocks, groups, and statements and contains declarations for names and procedures local to the procedure or EXTERNAL to the procedure.

An ON-unit is a single statement or block of statements written to be executed when one or more of these conditions occur:

a computational condition,

  • CONVERSION (CONV)
  • FIXEDOVERFLOW (FOFL)
  • OVERFLOW (OFL)
  • SIZE
  • STRINGRANGE (STRG)
  • STRINGSIZE (STRZ)
  • SUBSCRIPTRANGE (SUBRG)
  • UNDERFLOW (UFL)
  • ZERODIVIDE (ZDIV)

or an Input/Output condition,

  • ENDFILE(file)
  • ENDPAGE(file)
  • KEY(file)
  • NAME(file)
  • RECORD(file)
  • TRANSMIT(file)
  • UNDEFINEDFILE(file) (UNDF)

or one of the conditions:

  • AREA, CONDITION (identifier), ERROR, FINISH

A declaration of an identifier may contain one or more of the following attributes (but they need to be mutually consistent):

Data attributes Input/output attributes Other attributes
ALIGNED DIRECT AUTOMATIC or AUTO
AREA[(area-size)] ENVIRONMENT(options) or ENV... BASED[(reference)]
BINARY [(precision)] or BIN... INPUT BUILTIN
BIT [(maximum-length)] KEYED CONDITION or COND
CHARACTER[(maximum-length)] or CHAR... OUTPUT CONSTANT
COMPLEX [(precision)] or CPLX... PRINT CONTROLLED or CTL
DECIMAL [(precision)] or DEC... SEQUENTIAL or SEQL DEFINED[(reference)] or DEF...
(dimension-attribute) STREAM EXTERNAL or EXT
ENTRY[(parameter descriptor list] UPDATE GENERIC(criteria list)
FILE RECORD INITIAL(value-list) or INIT...
FIXED [(precision)] INTERNAL or INT
FLOAT [(number of digits)] LIKE unsubscripted reference
FORMAT LOCAL
LABEL OPTIONS(options)
MEMBER PARAMETER or PARM
NONVARYING or NONVAR POSITION [(expression)] or POS...
OFFSET[(reference)] STATIC
PICTURE picture-specification or PIC... VARIABLE
POINTER or PTR
STRUCTURE
UNALIGNED or UNAL
VARYING or VAR

Current compilers from Micro Focus, and particularly that from IBM implement many extensions over the standardized version of the language. The IBM extensions are summarised in the Implementation sub-section for the compiler later. Although there are some extensions common to these compilers the lack of a current standard means that compatibility is not guaranteed.

Standardization edit

Language standardization began in April 1966 in Europe with ECMA TC10. In 1969 ANSI established a "Composite Language Development Committee", nicknamed "Kludge", later renamed X3J1 PL/I.[18] Standardization became a joint effort of ECMA TC/10 and ANSI X3J1. A subset of the GY33-6003[19] document was offered to the joint effort by IBM and became the base document for standardization. The major features omitted from the base document were multitasking and the attributes for program optimization (e.g. NORMAL and ABNORMAL).

Proposals to change the base document were voted upon by both committees. In the event that the committees disagreed, the chairs, initially Michael Marcotty of General Motors and C.A.R. Hoare representing ICL had to resolve the disagreement. In addition to IBM, Honeywell, CDC, Data General, Digital Equipment Corporation, Prime Computer, Burroughs, RCA, and Univac served on X3J1 along with major users Eastman Kodak, MITRE, Union Carbide, Bell Laboratories, and various government and university representatives. Further development of the language occurred in the standards bodies, with continuing improvements in structured programming and internal consistency, and with the omission of the more obscure or contentious features.

As language development neared an end, X3J1/TC10 realized that there were a number of problems with a document written in English text. Discussion of a single item might appear in multiple places which might or might not agree. It was difficult to determine if there were omissions as well as inconsistencies. Consequently, David Beech (IBM), Robert Freiburghouse (Honeywell), Milton Barber (CDC), M. Donald MacLaren (Argonne National Laboratory), Craig Franklin (Data General), Lois Frampton (Digital Equipment Corporation), and editor, D.J. Andrews of IBM undertook to rewrite the entire document, each producing one or more complete chapters. The standard is couched as a formal definition[16] using a "PL/I Machine"[20] to specify the semantics. It was the first programming language standard to be written as a semi-formal definition.

A "PL/I General-Purpose Subset" ("Subset-G") standard was issued by ANSI in 1981[17] and a revision published in 1987.[21] The General Purpose subset was widely adopted as the kernel for PL/I implementations.

Implementations edit

IBM PL/I F and D compilers edit

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.[22] 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.[23]

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[24] – 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"[25] 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.[26] It was shipped within a year of PL/I F.

Multics PL/I and derivatives edit

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.[27] Initially, it was developed using the TMG compiler-compiler.[28] The influential Multics PL/I compiler[27] 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.[29]

IBM PL/I optimizing and checkout compilers edit

The PL/I Optimizer and Checkout compilers produced in Hursley support a common level of PL/I language[30] 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).[22] The performance objectives set for the compilers are shown in an IBM presentation to the BCS.[22] The compilers had to produce identical results – the Checkout Compiler is used to debug programs that would then be submitted to the Optimizer. Given that the compilers had entirely different designs and were handling the full PL/I language this goal was challenging: it was achieved.

IBM introduced new attributes and syntax including BUILTIN, case statements (SELECT/WHEN/OTHERWISE), loop controls (ITERATE and LEAVE) and null argument lists to disambiguate, e.g., DATE().

The PL/I optimizing compiler took over from the PL/I F compiler and was IBM's workhorse compiler from the 1970s to the 1990s. Like PL/I F, it is a multiple pass compiler with a 44 kilobyte design point, but it is an entirely new design. Unlike the F compiler, it has to perform compile time evaluation of constant expressions using the run-time library, reducing the maximum memory for a compiler phase to 28 kilobytes. A second-time around design, it succeeded in eliminating the annoyances of PL/I F such as cascading diagnostics.[31] It was written in S/360 Macro Assembler by a team, led by Tony Burbridge, most of whom had worked on PL/I F. Macros were defined to automate common compiler services and to shield the compiler writers from the task of managing real-mode storage, allowing the compiler to be moved easily to other memory models. The gamut of program optimization techniques developed for the contemporary IBM Fortran H compiler were deployed: the Optimizer equaled Fortran execution speeds in the hands of good programmers. Announced with IBM S/370 in 1970, it shipped first for the DOS/360 operating system in August 1971, and shortly afterward for OS/360,[32] and the first virtual memory IBM operating systems OS/VS1, MVS, and VM/CMS. (The developers were unaware that while they were shoehorning the code into 28 kb sections, IBM Poughkeepsie was finally ready to ship virtual memory support in OS/360). It supported the batch programming environments and, under TSO and CMS, it could be run interactively. This compiler went through many versions covering all mainframe operating systems including the operating systems of the Japanese plug-compatible machines (PCMs).

The compiler has been superseded by "IBM PL/I for OS/2, AIX, Linux, z/OS" below.

The PL/I checkout compiler,[33][34] (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 edit

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.[35][36] It originally used a compiler backend named the VAX Code Generator (VCG) created by a team led by Dave Cutler.[37] The front end was designed by Robert Freiburghouse, and was ported to VAX/VMS from Multics.[38] 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.[39] Kednos marketed the compiler as Kednos PL/I until October 2016 when the company ceased trading.[40]

Teaching subset compilers edit

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,[41] 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.[42] PL/C was a very fast compiler.

SL/1 (Student Language/1, Student Language/One or Subset Language/1)[43][44] was a PL/I subset, initially available late 1960s, that ran interpretively on the IBM 1130; instructional use was its strong point.

PLAGO, created at the Polytechnic Institute of Brooklyn, used a simplified subset of the PL/I language[45] 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.[46]

Other examples are PL0 by P. Grouse at the University of New South Wales, PLUM by Marvin Victor Zelkowitz at the University of Maryland.,[47] and PLUTO from the University of Toronto.

IBM PL/I for OS/2, AIX, Linux, z/OS edit

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.[48] 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.[49] 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.
  • 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 edit

ORDINAL is a new computational data type. The ordinal facilities are like those in Pascal, e.g. DEFINE ORDINAL Colour (red, yellow, green, blue, violet); 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 DEFINE-statement (see below) allows additional TYPEs to be declared composed from PL/I's built-in attributes.

The HANDLE(data structure) locator data type is similar to the POINTER 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 UNION attribute (equivalent to CELL 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 edit

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 edit

The VALUE attribute declares an identifier as a constant (derived from a specific literal value or restricted expression).

Parameters can have the BYADDR (pass by address) or BYVALUE (pass by value) attributes.

The ASSIGNABLE and NONASSIGNABLE attributes prevent unintended assignments.

DO FOREVER; obviates the need for the contrived construct DO WHILE ( '1'B );.

The DEFINE-statement introduces user-specified names (e.g. INTEGER) for combinations of built-in attributes (e.g. FIXED BINARY(31,0)). Thus DEFINE ALIAS INTEGER FIXED BINARY(31.0) creates the TYPE name INTEGER 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 TYPE name for a set of structure attributes and corresponding substructure member declarations for use in a structure declaration (a generalisation of the LIKE attribute).

Structured programming additions edit

A LEAVE statement to exit a loop, and an ITERATE to continue with the next iteration of a loop.

UPTHRU and DOWNTHRU 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 STATIC, BASED or CONTROLLED storage. Procedure names used in the package also are local, but can be made external by means of the EXPORTS option of the PACKAGE-statement.

Interrupt handling edit

The RESIGNAL-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 INVALIDOP condition handles invalid operation codes detected by the PC processor, as well as illegal arithmetic operations such as subtraction of two infinite values.

The ANYCONDITION condition is provided to intercept conditions for which no specific ON-unit has been provided in the current procedure.

The STORAGE condition is raised when an ALLOCATE statement is unable to obtain sufficient storage.

Other mainframe and minicomputer compilers edit

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.[50]
  • UNIVAC released a UNIVAC PL/I,[51] 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.[52] 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[53]
  • CDC delivered an optimizing subset PL/I compiler for Cyber 70, 170 and 6000 series.[54]
  • 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.[55]
  • IBM Series/1 PL/I[56][57] 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 edit

  • 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 edit

  • 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 Personal Computers with DOS.[58] It was based on Subset G of PL/I[58] and was written in PL/M.
  • Micro Focus implemented Open PL/I for Windows[59] and UNIX/Linux systems,[60] which they acquired from Liant.
  • IBM delivered PL/I for OS/2[48] in 1994, and PL/I for AIX in 1995.[61]
  • Iron Spring PL/I for OS/2 and later Linux was introduced in 2007.[62]

PL/I dialects edit

  • PL/S, a dialect of PL/I, initially called BSL was developed in the late 1960s and became the system programming language for IBM mainframes. Almost all IBM mainframe system software in the 1970s and 1980s was written in PL/S. It differed from PL/I in that there were no data type conversions, no run-time environment, structures were mapped differently, and assignment was a byte by byte copy. All strings and arrays had fixed extents, or used the REFER option. PL/S was succeeded by PL/AS, and then by PL/X, which is the language currently used for internal work on current operating systems, OS/390 and now z/OS. It is also used for some z/VSE and z/VM components. IBM Db2 for z/OS is also written in PL/X.
  • PL/C, is an instructional dialect of the PL/I computer programming language, developed at Cornell University in the 1970s.
  • Two dialects of PL/I named PL/MP (Machine Product) and PL/MI (Machine Interface) were used by IBM in the system software of the System/38 and AS/400 platforms.[63][64][65] PL/MP was used to implement the so-called Vertical Microcode of these platforms, and targeted the IMPI instruction set. PL/MI targets the Machine Interface of those platforms, and is used in the System/38 Control Program Facility, and the XPF layer of OS/400.[66] The PL/MP code was mostly replaced with C++ when OS/400 was ported to the IBM RS64 processor family, although some was retained and retargeted for the PowerPC/Power ISA architecture.[67] The PL/MI code was not replaced, and remains in use in IBM i.[68]
  • PL.8, so-called because it was about 80% of PL/I,[69] was originally developed by IBM Research in the 1970s for the IBM 801 architecture.[70] It later gained support for the Motorola 68000 and System/370 architectures.[71] It continues to be used for several IBM internal systems development tasks (e.g. millicode and firmware for z/Architecture systems) and has been re-engineered to use a 64-bit gcc-based backend.[70][72]
  • Honeywell, Inc. developed PL-6 for use in creating the CP-6 operating system.
  • Prime Computer used two different PL/I dialects as the system programming language of the PRIMOS operating system: PL/P, starting from version 18, and then SPL, starting from version 19.
  • XPL is a dialect of PL/I used to write other compilers using the XPL compiler techniques. XPL added a heap string datatype to its small subset of PL/I.
  • HAL/S is a real-time aerospace programming language, best known for its use in the Space Shuttle program. It was designed by Intermetrics in the 1970s for NASA. HAL/S was implemented in XPL.
  • IBM and various subcontractors also developed another PL/I variant in the early 1970s to support signal processing for the Navy called SPL/I.
  • SabreTalk, a real-time dialect of PL/I used to program the Sabre airline reservation system.

Usage edit

PL/I implementations were developed for mainframes from the late 1960s, mini computers in the 1970s, and personal computers[58] in the 1980s and 1990s. Although its main use has been on mainframes, there are PL/I versions for DOS, Microsoft Windows, OS/2, AIX, OpenVMS, and Unix.

It has been widely used in business data processing[73] and for system use for writing operating systems on certain platforms. Very complex and powerful systems have been built with PL/I:

  • The SAS System was initially written in PL/I; the SAS data step is still modeled on PL/I syntax.
  • The pioneering online airline reservation system Sabre was originally written for the IBM 7090 in assembler. The S/360 version was largely written using SabreTalk, a purpose-built subset PL/I compiler for a dedicated control program.
  • The Multics operating system was largely written in PL/I.
  • PL/I was used to write an executable formal definition[74] to interpret IBM's System Network Architecture.
  • Some components of the OpenVMS operating system were originally written in PL/I, but were later rewritten in C during the port of VMS to the IA64 architecture.[75]

PL/I did not fulfill its supporters' hopes that it would displace Fortran and COBOL and become the major player on mainframes. It remained a minority but significant player. There cannot be a definitive explanation for this, but some trends in the 1970s and 1980s militated against its success by progressively reducing the territory on which PL/I enjoyed a competitive advantage.

First, the nature of the mainframe software environment changed. Application subsystems for database and transaction processing (CICS and IMS and Oracle on System 370) and application generators became the focus of mainframe users' application development. Significant parts of the language became irrelevant because of the need to use the corresponding native features of the subsystems (such as tasking and much of input/output). Fortran was not used in these application areas, confining PL/I to COBOL's territory; most users stayed with COBOL. But as the PC became the dominant environment for program development, Fortran, COBOL and PL/I all became minority languages overtaken by C++, Java and the like.

Second, PL/I was overtaken in the system programming field. The IBM system programming community was not ready to use PL/I; instead, IBM developed and adopted a proprietary dialect of PL/I for system programming. – PL/S.[76] With the success of PL/S inside IBM, and of C outside IBM, the unique PL/I strengths for system programming became less valuable.

Third, the development environments grew capabilities for interactive software development that, again, made the unique PL/I interactive and debugging strengths less valuable.

Fourth, features such as structured programming, character string operations, and object orientation were added to COBOL and Fortran, which further reduced PL/I's relative advantages.

On mainframes there were substantial business issues at stake too. IBM's hardware competitors had little to gain and much to lose from success of PL/I. Compiler development was expensive, and the IBM compiler groups had an in-built competitive advantage. Many IBM users wished to avoid being locked into proprietary solutions. With no early support for PL/I by other vendors it was best to avoid PL/I.

Evolution of the PL/I language edit

This article uses the PL/I standard as the reference point for language features. But a number of features of significance in the early implementations were not in the Standard; and some were offered by non-IBM compilers. And the de facto language continued to grow after the standard, ultimately driven by developments on the Personal Computer.

Significant features omitted from the standard edit

Multithreading edit

Multithreading, under the name "multitasking", was implemented by PL/I F,[77] the PL/I Checkout and Optimizing compilers,[78] and the newer AIX and Z/OS compilers. It comprised the data types EVENT and TASK, the TASK-option on the CALL-statement (Fork), the WAIT-statement (Join), the DELAY(delay-time), EVENT-options on the record I/O statements and the UNLOCK statement to unlock locked records on EXCLUSIVE files. Event data identify a particular event and indicate whether it is complete ('1'B) or incomplete ('0'B): task data items identify a particular task (or process) and indicate its priority relative to other tasks.

Preprocessor edit

The first IBM Compile time preprocessor was built by the IBM Boston Advanced Programming Center located in Cambridge, Mass, and shipped with the PL/I F compiler. The %INCLUDE statement was in the Standard, but the rest of the features were not. The DEC and Kednos[40] PL/I compilers implemented much the same set of features as IBM, with some additions of their own. IBM has continued to add preprocessor features to its compilers. The preprocessor treats the written source program as a sequence of tokens, copying them to an output source file or acting on them. When a % token is encountered the following compile time statement is executed: when an identifier token is encountered and the identifier has been DECLAREd, ACTIVATEd, and assigned a compile time value, the identifier is replaced by this value. Tokens are added to the output stream if they do not require action (e.g. +), as are the values of ACTIVATEd compile time expressions. Thus a compile time variable PI could be declared, activated, and assigned using %PI='3.14159265'. Subsequent occurrences of PI would be replaced by 3.14159265.

The data type supported are FIXED DECIMAL integers and CHARACTER strings of varying length with no maximum length. The structure statements are:

  • %[label-list:]DO iteration: statements; %[label-list:]END;
  • %procedure-name: PROCEDURE (parameter list) RETURNS (type); statements...;
  • %[label-list:]END;
  • %[label-list:]IF...%THEN...%ELSE..

and the simple statements, which also may have a [label-list:]

  • %ACTIVATE(identifier-list) and %DEACTIVATE
  • assignment statement
  • %DECLARE identifier-attribute-list
  • %GO TO label
  • %INCLUDE
  • null statement

The feature allowed programmers to use identifiers for constants – e.g. product part numbers or mathematical constants – and was superseded in the standard by named constants for computational data. Conditional compiling and iterative generation of source code, possible with compile-time facilities, was not supported by the standard. Several manufacturers implemented these facilities.

Structured programming additions edit

Structured programming additions were made to PL/I during standardization but were not accepted into the standard. These features were the LEAVE-statement to exit from an iterative DO, the UNTIL-option and REPEAT-option added to DO, and a case statement of the general form: SELECT (expression) {WHEN (expression) group}... OTHERWISE group
These features were all included in IBM's PL/I Checkout and Optimizing compilers[30] and in DEC PL/I.[79]

Debug facilities edit

PL/I F had offered some debug facilities that were not put forward for the standard but were implemented by others – notably the CHECK(variable-list) condition prefix, CHECK on-condition and the SNAP option. The IBM Optimizing and Checkout compilers added additional features appropriate to the conversational mainframe programming environment (e.g. an ATTENTION condition).

Significant features developed since the standard edit

Several attempts had been made to design a structure member type that could have one of several datatypes (CELL in early IBM). With the growth of classes in programming theory, approaches to this became possible on a PL/I base – UNION, TYPE etc. have been added by several compilers.

PL/I had been conceived in a single-byte character world. With support for Japanese and Chinese language becoming essential, and the developments on International Code Pages, the character string concept was expanded to accommodate wide non-ASCII/EBCDIC strings.

Time and date handling were overhauled to deal with the millennium problem, with the introduction of the DATETIME function that returned the date and time in one of about 35 different formats. Several other date functions deal with conversions to and from days and seconds.

Criticisms edit

Implementation issues edit

Though the language is easy to learn and use, implementing a PL/I compiler is difficult and time-consuming. A language as large as PL/I needed subsets that most vendors could produce and most users master. This was not resolved until "ANSI G" was published. The compile time facilities, unique to PL/I, took added implementation effort and additional compiler passes. A PL/I compiler was two to four times as large as comparable Fortran or COBOL compilers, and also that much slower—supposedly offset by gains in programmer productivity. This was anticipated in IBM before the first compilers were written.[9]

Some argue that PL/I is unusually hard to parse.[80] The PL/I keywords are not reserved so programmers can use them as variable or procedure names in programs. Because the original PL/I(F) compiler attempts auto-correction when it encounters a keyword used in an incorrect context, it often assumes it is a variable name. This leads to "cascading diagnostics",[31] a problem solved by later compilers.

The effort needed to produce good object code was perhaps underestimated during the initial design of the language. Program optimization (needed to compete with the excellent program optimization carried out by available Fortran compilers) is unusually complex owing to side effects and pervasive problems with aliasing of variables. Unpredictable modification can occur asynchronously in exception handlers, which may be provided by "ON statements" in (unseen) callers. Together, these make it difficult to reliably predict when a program's variables might be modified at runtime. In typical use, however, user-written error handlers (the ON-unit) often do not make assignments to variables. In spite of the aforementioned difficulties, IBM produced the PL/I Optimizing Compiler in 1971.[32]

PL/I contains many rarely used features, such as multitasking support (an IBM extension to the language) which add cost and complexity to the compiler, and its co-processing facilities require a multi-programming environment with support for non-blocking multiple threads for processes by the operating system. Compiler writers were free to select whether to implement these features.

An undeclared variable is, by default, declared by first occurrence—thus misspelling might lead to unpredictable results. This "implicit declaration" is no different from FORTRAN programs. For PL/I(F), however, an attribute listing enables the programmer to detect any misspelled or undeclared variable.

Programmer issues edit

Many programmers were slow to move from COBOL or Fortran due to a perceived complexity of the language and immaturity of the PL/I F compiler. Programmers were sharply divided into scientific programmers (who used Fortran) and business programmers (who used COBOL), with significant tension and even dislike between the groups. PL/I syntax borrowed from both COBOL and Fortran syntax. So instead of noticing features that would make their job easier, Fortran programmers of the time noticed COBOL syntax and had the opinion that it was a business language, while COBOL programmers noticed Fortran syntax and looked upon it as a scientific language.

Both COBOL and Fortran programmers viewed it as a "bigger" version of their own language, and both were somewhat intimidated by the language and disinclined to adopt it. Another factor was pseudo-similarities to COBOL, Fortran, and ALGOL. These were PL/I elements that looked similar to one of those languages, but worked differently in PL/I. Such frustrations left many experienced programmers with a jaundiced view of PL/I, and often an active dislike for the language. An early UNIX fortune file contained the following tongue-in-cheek description of the language:[citation needed]

Speaking as someone who has delved into the intricacies of PL/I, I am sure that only Real Men could have written such a machine-hogging, cycle-grabbing, all-encompassing monster. Allocate an array and free the middle third? Sure! Why not? Multiply a character string times a bit string and assign the result to a float decimal? Go ahead! Free a controlled variable procedure parameter and reallocate it before passing it back? Overlay three different types of variable on the same memory location? Anything you say! Write a recursive macro? Well, no, but Real Men use rescan. How could a language so obviously designed and written by Real Men not be intended for Real Man use?

On the positive side, full support for pointers to all data types (including pointers to structures), recursion, multitasking, string handling, and extensive built-in functions meant PL/I was indeed quite a leap forward compared to the programming languages of its time. However, these were not enough to persuade a majority of programmers or shops to switch to PL/I.

The PL/I F compiler's compile time preprocessor was unusual (outside the Lisp world[81]) in using its target language's syntax and semantics (e.g. as compared to the C preprocessor's "#" directives).

Special topics in PL/I edit

Storage classes edit

PL/I provides several 'storage classes' to indicate how the lifetime of variables' storage is to be managed – STATIC, AUTOMATIC, CONTROLLED, and BASED. The simplest to implement is STATIC, which indicates that memory is allocated and initialized at load-time, as is done in COBOL "working-storage" and early Fortran. This is the default for EXTERNAL variables. PL/I's default storage class for INTERNAL variables is AUTOMATIC, similar to that of other block-structured languages influenced by ALGOL, like the "auto" storage class in the C language, and default storage allocation in Pascal and "local-storage" in IBM COBOL. Storage for AUTOMATIC variables is allocated upon entry into the BEGIN-block, procedure, or ON-unit in which they are declared. The compiler and runtime system allocate memory for a stack frame to contain them and other housekeeping information. If a variable is declared with an INITIAL-attribute, code to set it to an initial value is executed at this time. Care is required to manage the use of initialization properly. Large amounts of code can be executed to initialize variables every time a scope is entered, especially if the variable is an array or structure. Storage for AUTOMATIC variables is freed at block exit: STATIC, CONTROLLED, or BASED variables are used to retain variables' contents between invocations of a procedure or block. CONTROLLED storage is also managed using a stack, but the pushing and popping of allocations on the stack is managed by the programmer, using ALLOCATE and FREE statements. Storage for BASED variables is managed using ALLOCATE/FREE, but instead of a stack these allocations have independent lifetimes and are addressed through OFFSET or POINTER variables.

The AREA attribute is used to declare programmer-defined heaps. Data can be allocated and freed within a specific area, and the area can be deleted, read, and written as a unit.[82]: pp.235–274 

Storage type sharing edit

There are several ways of accessing allocated storage through different data declarations. Some of these are well defined and safe, some can be used safely with careful programming, and some are inherently unsafe or machine dependent.[82]: pp.262–267, 178–180 

Passing a variable as an argument to a parameter by reference allows the argument's allocated storage to be referenced using the parameter. The DEFINED attribute (e.g. DCL A(10,10), B(2:9,2:9) DEFINED A) allows part or all of a variable's storage to be used with a different, but consistent, declaration. The language definition includes a CELL attribute (later renamed UNION) to allow different definitions of data to share the same storage. This was not supported by many early IBM compilers. These usages are safe and machine independent.

Record I/O and list processing produce situations where the programmer needs to fit a declaration to the storage of the next record or item, before knowing what type of data structure it has. Based variables and pointers are key to such programs. The data structures must be designed appropriately, typically using fields in a data structure to encode information about its type and size. The fields can be held in the preceding structure or, with some constraints, in the current one. Where the encoding is in the preceding structure, the program needs to allocate a based variable with a declaration that matches the current item (using expressions for extents where needed). Where the type and size information are to be kept in the current structure ("self defining structures") the type-defining fields must be ahead of the type dependent items and in the same place in every version of the data structure. The REFER-option is used for self-defining extents (e.g. string lengths as in DCL 1 A BASED, 2 N BINARY, 2 B CHAR(LENGTH REFER A.N.), etc  – where LENGTH is used to allocate instances of the data structure. For self-defining structures, any typing and REFERed fields are placed ahead of the "real" data. If the records in a data set, or the items in a list of data structures, are organised this way they can be handled safely in a machine independent way.

PL/I implementations do not (except for the PL/I Checkout compiler) keep track of the data structure used when storage is first allocated. Any BASED declaration can be used with a pointer into the storage to access the storage – inherently unsafe and machine dependent. However, this usage has become important for "pointer arithmetic" (typically adding a certain amount to a known address). This has been a contentious subject in computer science. In addition to the problem of wild references and buffer overruns, issues arise due to the alignment and length for data types used with particular machines and compilers. Many cases where pointer arithmetic might be needed involve finding a pointer to an element inside a larger data structure. The ADDR function computes such pointers, safely and machine independently.

Pointer arithmetic may be accomplished by aliasing a binary variable with a pointer as in
DCL P POINTER, N FIXED BINARY(31) BASED(ADDR(P)); N=N+255;
It relies on pointers being the same length as FIXED BINARY(31) integers and aligned on the same boundaries.

With the prevalence of C and its free and easy attitude to pointer arithmetic, recent IBM PL/I compilers allow pointers to be used with the addition and subtraction operators to giving the simplest syntax (but compiler options can disallow these practices where safety and machine independence are paramount).

ON-units and exception handling edit

When PL/I was designed, programs only ran in batch mode, with no possible intervention from the programmer at a terminal. An exceptional condition such as division by zero would abort the program yielding only a hexadecimal core dump. PL/I exception handling, via ON-units, allowed the program to stay in control in the face of hardware or operating system exceptions and to recover debugging information before closing down more gracefully. As a program became properly debugged, most of the exception handling could be removed or disabled: this level of control became less important when conversational execution became commonplace.

Computational exception handling is enabled and disabled by condition prefixes on statements, blocks (including ON-units) and procedures. – e.g. (SIZE, NOSUBSCRIPTRANGE): A(I)=B(I)*C; . Operating system exceptions for Input/Output and storage management are always enabled.

The ON-unit is a single statement or BEGIN-block introduced by an ON-statement. Executing the ON statement enables the condition specified, e.g., ON ZERODIVIDE ON-unit. When the exception for this condition occurs and the condition is enabled, the ON-unit for the condition is executed. ON-units are inherited down the call chain. When a block, procedure or ON-unit is activated, the ON-units established by the invoking activation are inherited by the new activation. They may be over-ridden by another ON-statement and can be reestablished by the REVERT-statement. The exception can be simulated using the SIGNAL-statement – e.g. to help debug the exception handlers. The dynamic inheritance principle for ON-units allows a routine to handle the exceptions occurring within the subroutines it uses.

If no ON-unit is in effect when a condition is raised a standard system action is taken (often this is to raise the ERROR condition). The system action can be reestablished using the SYSTEM option of the ON-statement. With some conditions it is possible to complete executing an ON-unit and return to the point of interrupt (e.g., the STRINGRANGE, UNDERFLOW, CONVERSION, OVERFLOW, AREA, and FILE conditions) and resume normal execution. With other conditions such as (SUBSCRIPTRANGE), the ERROR condition is raised when this is attempted. An ON-unit may be terminated with a GO TO preventing a return to the point of interrupt, but permitting the program to continue execution elsewhere as determined by the programmer.

An ON-unit needs to be designed to deal with exceptions that occur in the ON-unit itself. The ON ERROR SYSTEM; statement allows a nested error trap; if an error occurs within an ON-unit, control might pass to the operating system where a system dump might be produced, or, for some computational conditions, continue execution (as mentioned above).

The PL/I RECORD I/O statements have relatively simple syntax as they do not offer options for the many situations from end-of-file to record transmission errors that can occur when a record is read or written. Instead, these complexities are handled in the ON-units for the various file conditions. The same approach was adopted for AREA sub-allocation and the AREA condition.

The existence of exception handling ON-units can have an effect on optimization, because variables can be inspected or altered in ON-units. Values of variables that might otherwise be kept in registers between statements, may need to be returned to storage between statements. This is discussed in the section on Implementation Issues above.[82]: pp.249–376 

GO TO with a non-fixed target edit

PL/I has counterparts for COBOL and FORTRAN's specialized GO TO statements.

Syntax for both COBOL and FORTRAN exist for coding two special two types of GO TO, each of which has a target that is not always the same.

  • ALTER (COBOL), ASSIGN (FORTRAN):
    • ALTER paragraph_name_xxx TO PROCEED TO para_name_zzz.[83]
      There are other/helpful restrictions on these, especially "in programs ... RECURSIVE attribute, in methods, or .. THREAD option."[83]
    • ASSIGN 1860 TO IGOTTAGO[84]
      GO TO IGOTTAGO
      One enhancement, which adds built-in documentation, is
      GO TO IGOTTAGO (1860, 1914, 1939)
      (which restricts the variable's value to "one of the labels in the list.")[84]
  • GO TO ... based on a variable's subscript-like value.
    • GO TO (1914, 1939, 2140), MYCHOICE[85]
    • GO TO para_One para_Two para_Three DEPENDING ON IDECIDE.[86]

PL/I has statement label variables (with the LABEL attribute), which can store the value of a statement label, and later be used in a GOTO statement.[87][30]: 54 [30]: 23 

LABL1: .... . . LABL2: ... . . . MY_DEST = LABL1; . GO TO MY_DEST; GO TO HERE(LUCKY_NUMBER); /* minus 1, zero, or ... */ HERE(-1): PUT LIST ("I O U"); GO TO Lottery; HERE(0): PUT LIST ("No Cash"); GO TO Lottery; HERE(1): PUT LIST ("Dollar Bill"); GO TO Lottery; HERE(2): PUT LIST ("TWO DOLLARS"); GO TO Lottery; 

Statement label variables can be passed to called procedures, and used to return to a different statement in the calling routine.

Sample programs edit

Hello world program edit

Hello2: proc options(main);  put list ('Hello, World!'); end Hello2; 

Search for a string edit

/* Read in a line, which contains a string, /* and then print every subsequent line that contains that string. */ find_strings: procedure options (main);  declare pattern character (100) varying;  declare line character (100) varying;  declare line_no fixed binary;  on endfile (sysin) stop;  get edit (pattern) (L);  line_no = 1;  do forever;  get edit (line) (L);  if index(line, pattern) > 0 then  put skip list (line_no, line);  line_no = line_no + 1;  end; end find_strings; 

See also edit

Notes edit

  1. ^ "Changes at I.B.M." The New York Times. June 20, 1984.
  2. ^ Sturm, Eberhard (2009). The New PL/I. Vieweg+Teubner. ISBN 978-3-8348-0726-7.
  3. ^ a b Pugh, Emerson W.; Johnson, Lyle R.; Palmer, John H. (1991). IBM's 360 and early 370 systems. Cambridge, Mass.: MIT Press. ISBN 978-0-262-16123-7.
  4. ^ The committee actually had 8 members at the time the report was released. They were:[citation needed]
  5. ^ "Datamation in Business & Science MPPL IN FOR NPL" (PDF). Datamation. Vol. 11, no. 4. FRANK D. THOMPSON. April 1965. p. 17.
  6. ^ "Datamation in Business & Science ANOTHER NEW NAME, MORE COMPILERS FOR NPL" (PDF). Datamation. Vol. 11, no. 6. FRANK D. THOMPSON. June 1965. p. 17.
  7. ^ Report II of the SHARE Advanced Language Development Committee, June 25, 1964
  8. ^ Radin, G.; H. Paul Rogoway (January 1965). "Highlights of a New Programming Language". Communications of the ACM. 8 (1): 9–17. doi:10.1145/363707.363708. S2CID 17133703.
  9. ^ a b Radin, G. (August 1978). "The Early History and Characteristics of PL/I". ACM SIGPLAN Notices. 13 (8): 227–241. doi:10.1145/960118.808389. S2CID 13925251.
  10. ^ Control of the language was vested in a dedicated Language Control group and a Language Control Board that included representatives of the compiler groups (6 by 1973) in three countries. Daily communication was by telex. Changes and extensions were made through a Language Log that reached several thousand detailed points. A management level Language Review Board resolved issues escalated to it by the Control Board.
  11. ^ The Universal Language Document (ULD). Technical reports TR25.081, TR25.082, TR25.083, TR25.0S4, TR25.085, TR25.086 and TR25.087, IBM Corp Vienna Austria June 1968
  12. ^ "Frederick P. Brooks Jr. - IEEE Computer Society". IEEE Computer Society. 1989.
  13. ^ "Chapter 1: Introduction" (PDF). NPL Technical Report (PDF) (Report). IBM. December 1964. p. 11. Retrieved January 1, 2024. NPL is designed to serve the needs of an unusually large group of programmers,including scientific, business, real time, and systems programmers.
  14. ^ Some compilers chose to reserve these identifiers, or issue warnings if they found them used as identifiers. But the subsequent introduction of a case statement shows the value of the principle.
  15. ^ Vowels, Robin (2001). Introduction to PL/I. R.A. Vowels. p. x. ISBN 978-0-9596384-9-3. "PL/I is the first language to provide adequate facilities for scientific computations, business data processing and systems programming in a single language" - Jean Sammet, Some Approaches to, and Illustrations of, Programming Language History
  16. ^ a b ANS Programming Language PL/I. X3.53-1976
  17. ^ a b ANSI X3.74-1981 (R1998) Information Systems - Programming Language - PL/I General-Purpose Subset
  18. ^ Reacting to IBM's involvement, a number of manufacturers had been reluctant to endorse an effort on a Standard. The initial remit of CLDG/X3J1 was to investigate whether PL/I was a suitable candidate for standardization. The joint effort processed over 3500 proposals for language or textual changes.
  19. ^ "PL/I Language Specifications. GY33-6003"
  20. ^ The PL/I machine defined in the standard is covered in The Definition Mechanism for Standard PL/I. Michael Marcotty, Frederick G Sayward.
  21. ^ 1987 PL/I General-Purpose Subset (ANSI X3.74-1987)
  22. ^ a b c Krasun, Andy. "The first 35+ years of Hursley software 1958-1993 with some hardware asides, a personal account" (PDF). Retrieved May 5, 2020.
  23. ^ IBM System/360 Operating System PL/I (F) Compiler Program Logic Manual (PDF). IBM. December 1966. SECTION 2: COMPILER PHASES. Y28-6800-1.
  24. ^ These were designed in 1966 for an early Optimizing compiler, written in PL/I and to be bootstrapped starting with the PL/I F compiler
  25. ^ There were many delays in shipping these, so a common PL/I joke at the time was that Gen de Gaulle forbade La Gaude from shipping them until the Concorde had its first flight
  26. ^ IBM System/360 PL/I Subset Reference Manual (PDF). IBM. 1967. C28-8202-0.
  27. ^ a b R. A. Frieburghouse. "The Multics PL/1 Compiler". Multicians.org.
  28. ^ Tom Van Vleck (ed.). "The Choice of PL/I". Multicians.org.
  29. ^ Series 60 (Level 66)/6000 PL/I Reference Manual. Honeywell. 1976. Order No. DE05.
  30. ^ a b c d OS PL/I Checkout and Optimizing Compilers: Language Reference Manual (PDF). IBM. October 1976. GC33-0009-04.
  31. ^ a b "Microsoft.CodeAnalysis.CSharp A Binder converts names".[permanent dead link]
  32. ^ a b A. Endres (2013). "Early Language and Compiler Developments at IBM Europe".
  33. ^ R. N. Cuff (May 1972). "A Conversational Compiler for Full PL/I". The Computer Journal. 15 (2): 99–104. doi:10.1093/comjnl/15.2.99.
  34. ^ B. L. Marks (1973). "The design of a checkout compiler". IBM Systems Journal. 12 (3): 315–327. doi:10.1147/sj.123.0315.
  35. ^ "VAX-11 PL/I, Version 1.0" (PDF). Digital. October 1980. Retrieved 2023-10-31.
  36. ^ Uniprise PL/I for UNIX Reference Manual, Uniprise Systems, Inc., Irvine, California, 1995, p. xxi.
  37. ^ Tom Linden (2004-05-21). . Newsgroup: comp.os.vms. Archived from the original on June 14, 2021. Retrieved 2021-02-26.{{cite newsgroup}}: CS1 maint: unfit URL (link)
  38. ^ Cutler, Dave (2016-02-25). "Dave Cutler Oral History". youtube.com (Interview). Interviewed by Grant Saviers. Computer History Museum. Archived from the original on 2021-12-11. Retrieved 2021-02-26.
  39. ^ Robin Vowels (2010-04-01). "PL/I Frequently Asked Questions (FAQ)". Newsgroup: comp.answers.
  40. ^ a b . kednos.com. 2016-11-02. Archived from the original on 2021-03-14. Retrieved 2021-03-30.
  41. ^ Richard C. Holt (November 5, 1972). "Teaching the Fatal Disease (or) Introductory Computer Programming Using PL/I". from the original on April 15, 2011. Retrieved May 30, 2010.
  42. ^ Department of Computer Science, User's Guide to PL/C - The Cornell Compiler for PL/I, Cornell University, Ithaca, 1977.
  43. ^ "SL/1 (Student Language/One)".
  44. ^ "The IBM 1130". BobsPixels.com.
  45. ^ PLAGO/360 User's Manual, Polytechnic Institute of Brooklyn.
  46. ^ J. N. P. Hume and R. C. Holt, Structured Programming using PL/I and SP/k, Reston, Reston, 1975.
  47. ^ Marvin Victor Zelkowitz, PL/I Programming with PLUM, 2nd Ed., Paladin House, Geneva (Ill.), 1978.
  48. ^ a b Robin A. Vowels (March 1996). "PL/I for OS/2". ACM SIGPLAN Notices. 31 (3). Association for Computing Machinery: 22–27. doi:10.1145/227717.227724. S2CID 24441291.
  49. ^ "IBM PL/I Compiler Family". IBM. Retrieved 5 July 2021.
  50. ^ Burroughs Corporation, B 6700/B 7700: PL/I Language Reference Manual, Reference 5001530, Detroit, 1977.
  51. ^ Sperry-Univac Computer Systems, SPERRY UNIVAC 1100 Series PL/I Programmer Reference, Reference UP-8277, 1976.
  52. ^ Data General Corporation, AOS PL/I Reference Manual, Order No. 093-000204, c. 1978.
  53. ^ Paul W. Abrahams. The CIMS PL/I compiler. 1979 SIGPLAN symposium on Compiler construction. pp. 107–116. doi:10.1145/800229.806960. ISBN 0-89791-002-8.
  54. ^ Control Data Corporation, PL/I Reference Manual, 1978, Publication No. 60388100A.
  55. ^ OpenVOS PL/I Language Manual (R009). Marlboro, Massachusetts: Stratus Computer, Inc. 1995. OpenVOS PL/I.
  56. ^ IBM Series/1 PL/I Introduction Program Numbers 5719-PL1 5719-PL3 (PDF) (First ed.). IBM. February 1977. GC34-0084-0.
  57. ^ IBM Series/1 PL/I: Language Reference Manual. IBM. GC34-0085-0.
  58. ^ a b c Peter Norton (May 15, 1984). . PC Magazine. Archived from the original on July 6, 2011. Retrieved January 25, 2010.
  59. ^ (PDF). Micro Focus. p. 1. Archived from the original (PDF) on November 7, 2017.
  60. ^ . Micro Focus. Archived from the original on 2017-11-07. Retrieved 2017-11-05.
  61. ^ "IBM PL/I Set for AIX Version 1". 19 September 1995. Retrieved 13 May 2019.
  62. ^ "Iron Spring PL/I Compiler - Programming Guide". ironspring.com. 2020-09-15. Retrieved 2021-02-26.
  63. ^ Frank G. Soltis (1997). Inside the AS/400, Second Edition. Duke Press. ISBN 978-1-882419-66-1.
  64. ^ Berg, William; Cline, Marshall; Girou, Mike (October 1995). "Lessons learned from the OS/400 OO project". Communications of the ACM. 38 (10): 54–64. doi:10.1145/226239.226253. S2CID 7492851.
  65. ^ Pigott, Diarmuid. "PL/MP". Online Historical Encyclopaedia of Programming Languages. from the original on August 2, 2020. Retrieved Feb 24, 2021.
  66. ^ Leif Svalgaard (2003-10-08). "Re: Re: MI emulator". MI400 (Mailing list). Retrieved 2021-02-26.
  67. ^ Dave McKenzie (2004-09-01). "RE: Dave McKenzie's UNDELete utility - a LifeSaver!". Midrange Archive MI400. Retrieved 2021-05-24.
  68. ^ Dan Hicks (1998-08-21). "UNIX vs AS/400?". Newsgroup: comp.sys.ibm.as400.misc.
  69. ^ Cocke, John; Markstein, Victoria (January 1990). "The evolution of RISC technology at IBM" (PDF). IBM Journal of Research and Development. 34 (1): 4–11. doi:10.1147/rd.341.0004. Retrieved 2022-10-05. The result was the PL.8 language, the ".8" implying that it had about 80 percent of the richness of PL/I.
  70. ^ a b W. Gellerich; T. Hendel; R. Land; H. Lehmann; M. Mueller; P. H. Oden; H. Penner (May 2004). (PDF). IBM Journal of Research and Development. 48 (3.4). IBM: 543–556. doi:10.1147/rd.483.0543. S2CID 19020943. Archived from the original (PDF) on 2021-01-24. Retrieved 2021-02-26.
  71. ^ Marc Auslander; Martin Hopkins (June 1982). An overview of the PL.8 compiler (PDF). SIGPLAN '82 Proceedings of the 1982 SIGPLAN symposium on Compiler construction. ACM. pp. 22–31. doi:10.1145/872726.806977. Retrieved 2021-02-26.
  72. ^ J. von Buttlar; H. Bohm; R. Ernst; A. Horsch; A. Kohler; H. Schein; M. Stetter; K. Theurich (July 2002). (PDF). IBM Journal of Research and Development. 46 (4.5). IBM: 607–615. doi:10.1147/rd.464.0607. S2CID 12745372. Archived from the original (PDF) on 2020-02-11. Retrieved 2021-02-26.
  73. ^ Pearkins, Jon E. (December 1, 1995). . Enterprise Systems Journal. Archived from the original on November 3, 2012. Open PL/I estimated that in 1995 20% of mainframe legacy applications were in PL/I, with 60% in COBOL: there were 300,000 PL/I programmers worldwide
  74. ^ Schultz, G.; D.Rose; C.West; J.Gray (April 1980). "Executable description and validation of SNA". IEEE Transactions on Communications. 28 (4): 661–677. doi:10.1109/TCOM.1980.1094695.
  75. ^ Clair Grant (June 2005). "Porting OpenVMS to HP Integrity Servers" (PDF). OpenVMS Technical Journal. 6.
  76. ^ In his slides on IBM Operating System/360 Fred Brooks says OS/360 should have been written in PL/I not PL/S and Assembler. The article is a great summary of the OS/360 program. "The /360 Architecture and Its Operating System" 2020-07-28 at the Wayback Machine, 2001.
  77. ^ IBM System/360 Operating System PL/I (F) Language Reference Manual (PDF) (Fifth ed.). December 1972. Chapter 15: Multitasking. GC28-8201-4.
  78. ^ OS PL/I Checkout and Optimizing Compilers: Language Reference Manual (PDF) (Fifth ed.). October 1976. Chapter 17: Multitasking. GC33-0009-4.
  79. ^ . Kednos PL/I for OpenVMS Systems Reference Manual. January 2007. Archived from the original on 2016-08-18. Retrieved 2017-11-05.
  80. ^ The compiler cannot tell whether a statement is a declaration or a multiple assignment statement until encountering the "=" of the assignment or ";" of the DECLARE—which can be several lines later. The fact that DECLARE/DCL were not reserved is the proximate cause in this example – consider the fragment DECLARE(I,J,K),L= vs DECLARE(I,J,K),L;.
  81. ^ Hart, Timothy P. (October 1963). "MACRO Definitions for LISP". Artificial Intelligence Memos. No. 57. hdl:1721.1/6111.
  82. ^ a b c Enterprise PL/I for z/OS PL/I for AIX Rational Developer for System z PL/I for Windows: Language Reference (PDF) (Third ed.). IBM. September 2012. SC14-7285-02. Retrieved July 9, 2023.
  83. ^ a b "ALTER statement". IBM. 24 September 2021.
  84. ^ a b "GO TO (Assigned)".
  85. ^ "GO TO (Computed)".
  86. ^ "GO TO Statement in COBOL".
  87. ^ Digital Research PL/I Language Programmer's Guide. p. 103.

References edit

Textbooks edit

  • Neuhold, E.J. & Lawson, H.W. (1971). The PL/I Machine: An Introduction to Programming. Addison-wesley. ISBN 978-0-2010-5275-6.
  • Barnes, R.A. (1979). PL/I for Programmers. North-Holland.
  • Hughes, Joan K. (1973). PL/I Programming (1st ed.). Wiley. ISBN 0-471-42032-8.
  • Hughes, Joan K. (1986). PL/I Structured Programming (3rd ed.). Wiley. ISBN 0-471-83746-6.
  • Groner, G.F. (1971). PL/I Programming in Technological Applications. Books on Demand, Ann Arbor, MI.
  • Anderson, M.E. (1973). PL/I for Programmers. Prentice-Hall.
  • Stoutemyer, D.R. (1971). PL/I Programming for Engineering & Science. Prentice-Hall.
  • Ziegler, R.R. & C. (1986). PL/I: Structured Programming and Problem Solving (1st ed.). West. ISBN 978-0-314-93915-9.
  • Sturm, E. (2009). The New PL/I ... for PC, Workstation and Mainframe. Vieweg-Teubner, Wiesbaden, Germany. ISBN 978-3-8348-0726-7.
  • Vowels, R.A. (1997). Introduction to PL/I, Algorithms, and Structured Programming (3rd ed.). R.A. Vowels. ISBN 978-0-9596384-9-3.
  • Abrahams, Paul (1979). The PL/I Programming Language (PDF). Courant Mathematics and Computing Laboratory, New York University.

Standards edit

  • ANSI ANSI X3.53-1976 (R1998) Information Systems - Programming Language - PL/I
  • ANSI ANSI X3.74-1981 (R1998) Information Systems - Programming Language - PL/I General-Purpose Subset
  • ANSI ANSI X3.74-1987 (R1998) Information Systems - Programming Language - PL/I General-Purpose Subset
  • ECMA 50 Programming Language PL/I, 1st edition, December 1976
  • ISO 6160:1979 Programming languages—PL/I
  • ISO/IEC 6522:1992 Information technology—Programming languages—PL/I general purpose subset

Reference manuals edit

  • Burroughs Corporation, "B 6700 / B 7700 PL/I Language Reference", 5001530. Detroit, 1977.
  • CDC. R. A. Vowels, "PL/I for CDC Cyber". Optimizing compiler for the CDC Cyber 70 series.
  • Digital Equipment Corporation, "decsystem10 Conversational Programming Language User's Manual", DEC-10-LCPUA-A-D. Maynard, 1975.
  • Fujitsu Ltd, "Facom OS IV PL/I Reference Manual", 70SP5402E-1,1974. 579 pages. PL/I F subset.
  • Honeywell, Inc., "Multics PL/I Language Specification", AG94-02. 1981.
  • IBM, IBM Operating System/360 PL/I: Language Specifications, C28-6571. 1965.
  • IBM, OS PL/I Checkout and Optimizing Compilers: Language Reference Manual, GC33-0009. 1976.
  • IBM, IBM, "NPL Technical Report", December 1964.
  • IBM, Enterprise PL/I for z/OS Version 4 Release 1 Language Reference Manual 2020-07-28 at the Wayback Machine, SC14-7285-00. 2010.
  • IBM, OS/2 PL/I Version 2: Programming: Language Reference, 3rd Ed., Form SC26-4308, San Jose. 1994.
  • Kednos PL/I for OpenVMS Systems. Reference Manual 2004-03-04 at the Wayback Machine, AA-H952E-TM. Nov 2003.
  • Liant Software Corporation (1994), Open PL/I Language Reference Manual, Rev. Ed., Framingham (Mass.).
  • Nixdorf Computer, "Terminalsystem 8820 Systemtechnischer Teil PL/I-Subset",05001.17.8.93-01, 1976.
  • Ing. C. Olivetti, "Mini PL/I Reference Manual", 1975, No. 3970530 V
  • Q1 Corporation, "The Q1/LMC Systems Software Manual", Farmingdale, 1978.

External links edit

  • IBM PL/I Compilers for z/OS, AIX, MVS, VM and VSE
  • Iron Spring Software, PL/I for Linux and OS/2
  • Micro Focus' Mainframe PL/I Migration Solution
  • OS PL/I V2R3 grammar Version 0.1
  • Pliedit, PL/I editor for Eclipse
  • Power vs. Adventure - PL/I and C, a side-by-side comparison of PL/I and C.
  • Softpanorama PL/1 page
  • The PL/I Language
  • PL1GCC project in SourceForge
  • PL/1 software to print signs, source code in book form, by David Sligar (1977), for IBM PL/1 F compiler.
  • An open source PL/I Compiler for Windows NT

programming, language, redirects, here, process, implementing, programming, languages, programming, language, design, design, implementation, this, article, lead, section, short, adequately, summarize, points, please, consider, expanding, lead, provide, access. New programming language redirects here For the process of implementing new programming languages see Programming language design Design and implementation This article s lead section may be too short to adequately summarize the key points Please consider expanding the lead to provide an accessible overview of all important aspects of the article December 2022 PL I Programming Language One pronounced p iː ɛ l w ʌ n and sometimes written PL 1 1 is a procedural imperative computer programming language initially developed by IBM It is designed for scientific engineering business and system programming It has been in continuous use by academic commercial and industrial organizations since it was introduced in the 1960s 2 PL IParadigmProcedural imperative structuredDesigned byIBM the SHARE Language Development Committee and ISOFirst appeared1964 60 years ago 1964 Websitewww wbr ibm wbr com wbr products wbr pli compiler zosDialectsSee dialectsInfluenced byCOBOL Fortran ALGOL 60InfluencedControl Language PL M PL S PL 6 PL 8 REXX SASPL I at WikibooksThe PL 1 ANSI standard X3 53 1976 was published in 1976 PL I s main domains are data processing numerical computation scientific computing and system programming It supports recursion structured programming linked data structure handling fixed point floating point complex character string handling and bit string handling The language syntax is English like and suited for describing complex data formats with a wide set of functions available to verify and manipulate them Contents 1 Early history 2 Goals and principles 3 Language summary 4 Standardization 5 Implementations 5 1 IBM PL I F and D compilers 5 2 Multics PL I and derivatives 5 3 IBM PL I optimizing and checkout compilers 5 4 DEC PL I 5 5 Teaching subset compilers 5 6 IBM PL I for OS 2 AIX Linux z OS 5 6 1 Data types 5 6 2 Competitiveness on PC and with C 5 6 3 Program readability making intentions explicit 5 6 4 Structured programming additions 5 6 5 Interrupt handling 5 7 Other mainframe and minicomputer compilers 5 8 PL I compilers for Microsoft NET 5 9 PL I compilers for personal computers and Unix 6 PL I dialects 7 Usage 8 Evolution of the PL I language 8 1 Significant features omitted from the standard 8 1 1 Multithreading 8 1 2 Preprocessor 8 1 3 Structured programming additions 8 1 4 Debug facilities 8 2 Significant features developed since the standard 9 Criticisms 9 1 Implementation issues 9 2 Programmer issues 10 Special topics in PL I 10 1 Storage classes 10 2 Storage type sharing 10 3 ON units and exception handling 10 4 GO TO with a non fixed target 11 Sample programs 11 1 Hello world program 11 2 Search for a string 12 See also 13 Notes 14 References 14 1 Textbooks 14 2 Standards 14 3 Reference manuals 15 External linksEarly history editIn the 1950s and early 1960s business and scientific users programmed for different computer hardware using different programming languages Business users were moving from Autocoders via COMTRAN to COBOL while scientific users programmed in Fortran ALGOL GEORGE and others The IBM System 360 3 announced in 1964 and delivered in 1966 was designed as a common machine architecture for both groups of users superseding all existing IBM architectures Similarly IBM wanted a single programming language for all users It hoped that Fortran could be extended to include the features needed by commercial programmers In October 1963 a committee was formed 4 composed originally of three IBMers from New York and three members of SHARE the IBM scientific users group to propose these extensions to Fortran Given the constraints of Fortran they were unable to do this and embarked on the design of a new programming language based loosely on ALGOL labeled NPL This acronym conflicted with that of the UK s National Physical Laboratory and was replaced 5 briefly by MPPL MultiPurpose Programming Language and in 1965 with 6 PL I with a Roman numeral I The first definition appeared in April 1964 7 8 IBM took NPL as a starting point and completed the design to a level that the first compiler could be written the NPL definition was incomplete in scope and in detail 9 Control of the PL I language 10 was vested initially in the New York Programming Center and later at the IBM UK Laboratory at Hursley The SHARE and GUIDE user groups were involved in extending the language and had a role in IBM s process for controlling the language through their PL I Projects The experience of defining such a large language showed the need for a formal definition of PL I A project was set up in 1967 in IBM Laboratory Vienna to make an unambiguous and complete specification 11 This led in turn to one of the first large scale Formal Methods for development VDM Fred Brooks is credited with ensuring PL I had the CHARACTER data type 12 The language was first specified in detail in the manual PL I Language Specifications C28 6571 written in New York in 1965 and superseded by PL I Language Specifications GY33 6003 written by Hursley in 1967 IBM continued to develop PL I in the late sixties and early seventies publishing it in the GY33 6003 manual These manuals were used by the Multics group and other early implementers The first compiler was delivered in 1966 The Standard for PL I was approved in 1976 Goals and principles editThe goals for PL I evolved during the early development of the language Competitiveness with COBOL s record handling and report writing was required The language s scope of usefulness grew to include system programming and event driven programming 13 Additional goals for PL I were 3 Performance of compiled code competitive with that of Fortran but this was not achieved citation needed Extensibility for new hardware and new application areas Improved productivity of the programming process transferring effort from the programmer to the compiler Machine independence to operate effectively on the main computer hardware and operating systemsTo achieve these goals PL I borrowed ideas from contemporary languages while adding substantial new capabilities and casting it with a distinctive concise and readable syntax Many principles and capabilities combined to give the language its character and were important in meeting the language s goals Block structure with underlying semantics including recursion similar to Algol 60 Arguments are passed using call by reference using dummy variables for values where needed call by value A wide range of computational data types program control data types and forms of data structure strong typing Dynamic extents for arrays and strings with inheritance of extents by procedure parameters Concise syntax for expressions declarations and statements with permitted abbreviations Suitable for a character set of 60 glyphs and sub settable to 48 An extensive structure of defaults in statements options and declarations to hide some complexities and facilitate extending the language while minimizing keystrokes Powerful iterative processing with good support for structured programming There were to be no reserved words although the function names DATE and TIME initially proved to be impossible citation needed to meet this goal New attributes statements and statement options could be added to PL I without invalidating existing programs Not even IF THEN ELSE and DO were reserved 14 Orthogonality each capability to be independent of other capabilities and freely combined with other capabilities wherever meaningful Each capability to be available in all contexts where meaningful to exploit it as widely as possible and to avoid arbitrary restrictions Orthogonality helps make the language large clarification needed Exception handling capabilities for controlling and intercepting exceptional conditions at run time Programs divided into separately compilable sections with extensive compile time facilities a k a macros not part of the standard for tailoring and combining sections of source code into complete programs External names to bind separately compiled procedures into a single program Debugging facilities integrated into the language Language summary editThe language is designed to be all things to all programmers vague 15 The summary is extracted from the ANSI PL I Standard 16 and the ANSI PL I General Purpose Subset Standard 17 A PL I program consists of a set of procedures each of which is written as a sequence of statements The INCLUDE construct is used to include text from other sources during program translation All of the statement types are summarized here in groupings which give an overview of the language the Standard uses this organization Category StatementStructural PROCEDURE or PROC ENTRY BEGIN DO ENDDeclarative DECLARE or DCL DEFAULT or DFT FORMATFlow of control CALL IF SELECTGO TO RETURN STOP Null statementCategory StatementInterrupt handling ON SIGNAL REVERTStorage ALLOCATE or ALLOC FREE Assignment statementInput Output OPEN CLOSEStream input output GET PUTRecord input output READ WRITE REWRITE LOCATE DELETE Features such as multi tasking and the PL I preprocessor are not in the Standard but are supported in the PL I F compiler and some other implementations are discussed in the Language evolution section Names may be declared to represent data of the following types either as single values or as aggregates in the form of arrays with a lower bound and upper bound per dimension or structures comprising nested structure array and scalar variables Arithmetic expanded below CHARACTER PICTURE for Arithmetic data PICTURE for Character data AREA BIT ENTRY FILE FORMAT LABEL OFFSET POINTERThe arithmetic type comprises these attributes a base BINARY or DECIMAL and a scale FIXED or FLOAT and a mode REAL or COMPLEX and a PRECISION number of digits and for fixed point numbers a scale factor The base scale precision and scale factor of the Picture for arithmetic type is encoded within the picture specification The mode is specified separately with the picture specification applied to both the real and the imaginary parts Values are computed by expressions written using a specific set of operations and builtin functions most of which may be applied to aggregates as well as to single values together with user defined procedures which likewise may operate on and return aggregate as well as single values The assignment statement assigns values to one or more variables There are no reserved words in PL I A statement is terminated by a semi colon The maximum length of a statement is implementation defined A comment may appear anywhere in a program where a space is permitted and is preceded by the characters forward slash asterisk and is terminated by the characters asterisk forward slash i e This is a comment Statements may have a label prefix introducing an entry name ENTRY and PROCEDURE statements or label name and a condition prefix enabling or disabling a computational condition e g NOSIZE Entry and label names may be single identifiers or identifiers followed by a subscript list of constants as in L 12 2 A 0 A sequence of statements becomes a group when preceded by a DO statement and followed by an END statement Groups may include nested groups and begin blocks The IF statement specifies a group or a single statement as the THEN part and the ELSE part see the sample program The group is the unit of iteration The begin block BEGIN stmt list END may contain declarations for names and internal procedures local to the block A procedure starts with a PROCEDURE statement and is terminated syntactically by an END statement The body of a procedure is a sequence of blocks groups and statements and contains declarations for names and procedures local to the procedure or EXTERNAL to the procedure An ON unit is a single statement or block of statements written to be executed when one or more of these conditions occur a computational condition CONVERSION CONV FIXEDOVERFLOW FOFL OVERFLOW OFL SIZE STRINGRANGE STRG STRINGSIZE STRZ SUBSCRIPTRANGE SUBRG UNDERFLOW UFL ZERODIVIDE ZDIV or an Input Output condition ENDFILE file ENDPAGE file KEY file NAME file RECORD file TRANSMIT file UNDEFINEDFILE file UNDF or one of the conditions AREA CONDITION identifier ERROR FINISHA declaration of an identifier may contain one or more of the following attributes but they need to be mutually consistent Data attributes Input output attributes Other attributesALIGNED DIRECT AUTOMATIC or AUTOAREA area size ENVIRONMENT options or ENV BASED reference BINARY precision or BIN INPUT BUILTINBIT maximum length KEYED CONDITION or CONDCHARACTER maximum length or CHAR OUTPUT CONSTANTCOMPLEX precision or CPLX PRINT CONTROLLED or CTLDECIMAL precision or DEC SEQUENTIAL or SEQL DEFINED reference or DEF dimension attribute STREAM EXTERNAL or EXTENTRY parameter descriptor list UPDATE GENERIC criteria list FILE RECORD INITIAL value list or INIT FIXED precision INTERNAL or INTFLOAT number of digits LIKE unsubscripted referenceFORMAT LOCALLABEL OPTIONS options MEMBER PARAMETER or PARMNONVARYING or NONVAR POSITION expression or POS OFFSET reference STATICPICTURE picture specification or PIC VARIABLEPOINTER or PTRSTRUCTUREUNALIGNED or UNALVARYING or VARCurrent compilers from Micro Focus and particularly that from IBM implement many extensions over the standardized version of the language The IBM extensions are summarised in the Implementation sub section for the compiler later Although there are some extensions common to these compilers the lack of a current standard means that compatibility is not guaranteed Standardization editLanguage standardization began in April 1966 in Europe with ECMA TC10 In 1969 ANSI established a Composite Language Development Committee nicknamed Kludge later renamed X3J1 PL I 18 Standardization became a joint effort of ECMA TC 10 and ANSI X3J1 A subset of the GY33 6003 19 document was offered to the joint effort by IBM and became the base document for standardization The major features omitted from the base document were multitasking and the attributes for program optimization e g NORMAL and ABNORMAL Proposals to change the base document were voted upon by both committees In the event that the committees disagreed the chairs initially Michael Marcotty of General Motors and C A R Hoare representing ICL had to resolve the disagreement In addition to IBM Honeywell CDC Data General Digital Equipment Corporation Prime Computer Burroughs RCA and Univac served on X3J1 along with major users Eastman Kodak MITRE Union Carbide Bell Laboratories and various government and university representatives Further development of the language occurred in the standards bodies with continuing improvements in structured programming and internal consistency and with the omission of the more obscure or contentious features As language development neared an end X3J1 TC10 realized that there were a number of problems with a document written in English text Discussion of a single item might appear in multiple places which might or might not agree It was difficult to determine if there were omissions as well as inconsistencies Consequently David Beech IBM Robert Freiburghouse Honeywell Milton Barber CDC M Donald MacLaren Argonne National Laboratory Craig Franklin Data General Lois Frampton Digital Equipment Corporation and editor D J Andrews of IBM undertook to rewrite the entire document each producing one or more complete chapters The standard is couched as a formal definition 16 using a PL I Machine 20 to specify the semantics It was the first programming language standard to be written as a semi formal definition A PL I General Purpose Subset Subset G standard was issued by ANSI in 1981 17 and a revision published in 1987 21 The General Purpose subset was widely adopted as the kernel for PL I implementations Implementations editIBM PL I F and D compilers edit 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 22 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 23 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 24 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 25 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 26 It was shipped within a year of PL I F Multics PL I and derivatives edit 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 27 Initially it was developed using the TMG compiler compiler 28 The influential Multics PL I compiler 27 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 29 IBM PL I optimizing and checkout compilers edit The PL I Optimizer and Checkout compilers produced in Hursley support a common level of PL I language 30 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 22 The performance objectives set for the compilers are shown in an IBM presentation to the BCS 22 The compilers had to produce identical results the Checkout Compiler is used to debug programs that would then be submitted to the Optimizer Given that the compilers had entirely different designs and were handling the full PL I language this goal was challenging it was achieved IBM introduced new attributes and syntax including BUILTIN case statements SELECT WHEN OTHERWISE loop controls ITERATE and LEAVE and null argument lists to disambiguate e g DATE The PL I optimizing compiler took over from the PL I F compiler and was IBM s workhorse compiler from the 1970s to the 1990s Like PL I F it is a multiple pass compiler with a 44 kilobyte design point but it is an entirely new design Unlike the F compiler it has to perform compile time evaluation of constant expressions using the run time library reducing the maximum memory for a compiler phase to 28 kilobytes A second time around design it succeeded in eliminating the annoyances of PL I F such as cascading diagnostics 31 It was written in S 360 Macro Assembler by a team led by Tony Burbridge most of whom had worked on PL I F Macros were defined to automate common compiler services and to shield the compiler writers from the task of managing real mode storage allowing the compiler to be moved easily to other memory models The gamut of program optimization techniques developed for the contemporary IBM Fortran H compiler were deployed the Optimizer equaled Fortran execution speeds in the hands of good programmers Announced with IBM S 370 in 1970 it shipped first for the DOS 360 operating system in August 1971 and shortly afterward for OS 360 32 and the first virtual memory IBM operating systems OS VS1 MVS and VM CMS The developers were unaware that while they were shoehorning the code into 28 kb sections IBM Poughkeepsie was finally ready to ship virtual memory support in OS 360 It supported the batch programming environments and under TSO and CMS it could be run interactively This compiler went through many versions covering all mainframe operating systems including the operating systems of the Japanese plug compatible machines PCMs The compiler has been superseded by IBM PL I for OS 2 AIX Linux z OS below The PL I checkout compiler 33 34 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 edit 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 35 36 It originally used a compiler backend named the VAX Code Generator VCG created by a team led by Dave Cutler 37 The front end was designed by Robert Freiburghouse and was ported to VAX VMS from Multics 38 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 39 Kednos marketed the compiler as Kednos PL I until October 2016 when the company ceased trading 40 Teaching subset compilers edit 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 41 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 42 PL C was a very fast compiler SL 1 Student Language 1 Student Language One or Subset Language 1 43 44 was a PL I subset initially available late 1960s that ran interpretively on the IBM 1130 instructional use was its strong point PLAGO created at the Polytechnic Institute of Brooklyn used a simplified subset of the PL I language 45 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 46 Other examples are PL0 by P Grouse at the University of New South Wales PLUM by Marvin Victor Zelkowitz at the University of Maryland 47 and PLUTO from the University of Toronto IBM PL I for OS 2 AIX Linux z OS edit 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 48 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 49 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 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 EnvironmentThe 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 edit ORDINAL is a new computational data type The ordinal facilities are like those in Pascal e g DEFINE ORDINAL Colour red yellow green blue violet 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 DEFINE statement see below allows additional TYPEs to be declared composed from PL I s built in attributes The HANDLE data structure locator data type is similar to the POINTER data type but strongly typed to bind only to a particular data structure The gt operator is used to select a data structure using a handle The UNION attribute equivalent to CELL 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 edit 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 amp 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 edit The VALUE attribute declares an identifier as a constant derived from a specific literal value or restricted expression Parameters can have the BYADDR pass by address or BYVALUE pass by value attributes The ASSIGNABLE and NONASSIGNABLE attributes prevent unintended assignments DO FOREVER obviates the need for the contrived construct DO WHILE 1 B The DEFINE statement introduces user specified names e g INTEGER for combinations of built in attributes e g FIXED BINARY 31 0 Thus DEFINE ALIAS INTEGER FIXED BINARY 31 0 creates the TYPE name INTEGER 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 TYPE name for a set of structure attributes and corresponding substructure member declarations for use in a structure declaration a generalisation of the LIKE attribute Structured programming additions edit A LEAVE statement to exit a loop and an ITERATE to continue with the next iteration of a loop UPTHRU and DOWNTHRU 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 STATIC BASED or CONTROLLED storage Procedure names used in the package also are local but can be made external by means of the EXPORTS option of the PACKAGE statement Interrupt handling edit The RESIGNAL 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 INVALIDOP condition handles invalid operation codes detected by the PC processor as well as illegal arithmetic operations such as subtraction of two infinite values The ANYCONDITION condition is provided to intercept conditions for which no specific ON unit has been provided in the current procedure The STORAGE condition is raised when an ALLOCATE statement is unable to obtain sufficient storage Other mainframe and minicomputer compilers edit 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 50 UNIVAC released a UNIVAC PL I 51 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 amp AOS VS II operating systems 52 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 53 CDC delivered an optimizing subset PL I compiler for Cyber 70 170 and 6000 series 54 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 55 IBM Series 1 PL I 56 57 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 edit 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 edit 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 Personal Computers with DOS 58 It was based on Subset G of PL I 58 and was written in PL M Micro Focus implemented Open PL I for Windows 59 and UNIX Linux systems 60 which they acquired from Liant IBM delivered PL I for OS 2 48 in 1994 and PL I for AIX in 1995 61 Iron Spring PL I for OS 2 and later Linux was introduced in 2007 62 PL I dialects editPL S a dialect of PL I initially called BSL was developed in the late 1960s and became the system programming language for IBM mainframes Almost all IBM mainframe system software in the 1970s and 1980s was written in PL S It differed from PL I in that there were no data type conversions no run time environment structures were mapped differently and assignment was a byte by byte copy All strings and arrays had fixed extents or used the REFER option PL S was succeeded by PL AS and then by PL X which is the language currently used for internal work on current operating systems OS 390 and now z OS It is also used for some z VSE and z VM components IBM Db2 for z OS is also written in PL X PL C is an instructional dialect of the PL I computer programming language developed at Cornell University in the 1970s Two dialects of PL I named PL MP Machine Product and PL MI Machine Interface were used by IBM in the system software of the System 38 and AS 400 platforms 63 64 65 PL MP was used to implement the so called Vertical Microcode of these platforms and targeted the IMPI instruction set PL MI targets the Machine Interface of those platforms and is used in the System 38 Control Program Facility and the XPF layer of OS 400 66 The PL MP code was mostly replaced with C when OS 400 was ported to the IBM RS64 processor family although some was retained and retargeted for the PowerPC Power ISA architecture 67 The PL MI code was not replaced and remains in use in IBM i 68 PL 8 so called because it was about 80 of PL I 69 was originally developed by IBM Research in the 1970s for the IBM 801 architecture 70 It later gained support for the Motorola 68000 and System 370 architectures 71 It continues to be used for several IBM internal systems development tasks e g millicode and firmware for z Architecture systems and has been re engineered to use a 64 bit gcc based backend 70 72 Honeywell Inc developed PL 6 for use in creating the CP 6 operating system Prime Computer used two different PL I dialects as the system programming language of the PRIMOS operating system PL P starting from version 18 and then SPL starting from version 19 XPL is a dialect of PL I used to write other compilers using the XPL compiler techniques XPL added a heap string datatype to its small subset of PL I HAL S is a real time aerospace programming language best known for its use in the Space Shuttle program It was designed by Intermetrics in the 1970s for NASA HAL S was implemented in XPL IBM and various subcontractors also developed another PL I variant in the early 1970s to support signal processing for the Navy called SPL I SabreTalk a real time dialect of PL I used to program the Sabre airline reservation system Usage editPL I implementations were developed for mainframes from the late 1960s mini computers in the 1970s and personal computers 58 in the 1980s and 1990s Although its main use has been on mainframes there are PL I versions for DOS Microsoft Windows OS 2 AIX OpenVMS and Unix It has been widely used in business data processing 73 and for system use for writing operating systems on certain platforms Very complex and powerful systems have been built with PL I The SAS System was initially written in PL I the SAS data step is still modeled on PL I syntax The pioneering online airline reservation system Sabre was originally written for the IBM 7090 in assembler The S 360 version was largely written using SabreTalk a purpose built subset PL I compiler for a dedicated control program The Multics operating system was largely written in PL I PL I was used to write an executable formal definition 74 to interpret IBM s System Network Architecture Some components of the OpenVMS operating system were originally written in PL I but were later rewritten in C during the port of VMS to the IA64 architecture 75 PL I did not fulfill its supporters hopes that it would displace Fortran and COBOL and become the major player on mainframes It remained a minority but significant player There cannot be a definitive explanation for this but some trends in the 1970s and 1980s militated against its success by progressively reducing the territory on which PL I enjoyed a competitive advantage First the nature of the mainframe software environment changed Application subsystems for database and transaction processing CICS and IMS and Oracle on System 370 and application generators became the focus of mainframe users application development Significant parts of the language became irrelevant because of the need to use the corresponding native features of the subsystems such as tasking and much of input output Fortran was not used in these application areas confining PL I to COBOL s territory most users stayed with COBOL But as the PC became the dominant environment for program development Fortran COBOL and PL I all became minority languages overtaken by C Java and the like Second PL I was overtaken in the system programming field The IBM system programming community was not ready to use PL I instead IBM developed and adopted a proprietary dialect of PL I for system programming PL S 76 With the success of PL S inside IBM and of C outside IBM the unique PL I strengths for system programming became less valuable Third the development environments grew capabilities for interactive software development that again made the unique PL I interactive and debugging strengths less valuable Fourth features such as structured programming character string operations and object orientation were added to COBOL and Fortran which further reduced PL I s relative advantages On mainframes there were substantial business issues at stake too IBM s hardware competitors had little to gain and much to lose from success of PL I Compiler development was expensive and the IBM compiler groups had an in built competitive advantage Many IBM users wished to avoid being locked into proprietary solutions With no early support for PL I by other vendors it was best to avoid PL I Evolution of the PL I language editThis article uses the PL I standard as the reference point for language features But a number of features of significance in the early implementations were not in the Standard and some were offered by non IBM compilers And the de facto language continued to grow after the standard ultimately driven by developments on the Personal Computer Significant features omitted from the standard edit Multithreading edit Multithreading under the name multitasking was implemented by PL I F 77 the PL I Checkout and Optimizing compilers 78 and the newer AIX and Z OS compilers It comprised the data types EVENT and TASK the TASK option on the CALL statement Fork the WAIT statement Join the DELAY delay time EVENT options on the record I O statements and the UNLOCK statement to unlock locked records on EXCLUSIVE files Event data identify a particular event and indicate whether it is complete 1 B or incomplete 0 B task data items identify a particular task or process and indicate its priority relative to other tasks Preprocessor edit Further information PL I preprocessor The first IBM Compile time preprocessor was built by the IBM Boston Advanced Programming Center located in Cambridge Mass and shipped with the PL I F compiler The INCLUDE statement was in the Standard but the rest of the features were not The DEC and Kednos 40 PL I compilers implemented much the same set of features as IBM with some additions of their own IBM has continued to add preprocessor features to its compilers The preprocessor treats the written source program as a sequence of tokens copying them to an output source file or acting on them When a token is encountered the following compile time statement is executed when an identifier token is encountered and the identifier has been DECLAREd ACTIVATEd and assigned a compile time value the identifier is replaced by this value Tokens are added to the output stream if they do not require action e g as are the values of ACTIVATEd compile time expressions Thus a compile time variable PI could be declared activated and assigned using PI 3 14159265 Subsequent occurrences of PI would be replaced by 3 14159265 The data type supported are FIXED DECIMAL integers and CHARACTER strings of varying length with no maximum length The structure statements are label list DO iteration statements label list END procedure name PROCEDURE parameter list RETURNS type statements label list END label list IF THEN ELSE and the simple statements which also may have a label list ACTIVATE identifier list and DEACTIVATE assignment statement DECLARE identifier attribute list GO TO label INCLUDE null statementThe feature allowed programmers to use identifiers for constants e g product part numbers or mathematical constants and was superseded in the standard by named constants for computational data Conditional compiling and iterative generation of source code possible with compile time facilities was not supported by the standard Several manufacturers implemented these facilities Structured programming additions edit Structured programming additions were made to PL I during standardization but were not accepted into the standard These features were the LEAVE statement to exit from an iterative DO the UNTIL option and REPEAT option added to DO and a case statement of the general form SELECT expression WHEN expression group OTHERWISE group These features were all included in IBM s PL I Checkout and Optimizing compilers 30 and in DEC PL I 79 Debug facilities edit PL I F had offered some debug facilities that were not put forward for the standard but were implemented by others notably the CHECK variable list condition prefix CHECK on condition and the SNAP option The IBM Optimizing and Checkout compilers added additional features appropriate to the conversational mainframe programming environment e g an ATTENTION condition Significant features developed since the standard edit Several attempts had been made to design a structure member type that could have one of several datatypes CELL in early IBM With the growth of classes in programming theory approaches to this became possible on a PL I base UNION TYPE etc have been added by several compilers PL I had been conceived in a single byte character world With support for Japanese and Chinese language becoming essential and the developments on International Code Pages the character string concept was expanded to accommodate wide non ASCII EBCDIC strings Time and date handling were overhauled to deal with the millennium problem with the introduction of the DATETIME function that returned the date and time in one of about 35 different formats Several other date functions deal with conversions to and from days and seconds Criticisms editImplementation issues edit Though the language is easy to learn and use implementing a PL I compiler is difficult and time consuming A language as large as PL I needed subsets that most vendors could produce and most users master This was not resolved until ANSI G was published The compile time facilities unique to PL I took added implementation effort and additional compiler passes A PL I compiler was two to four times as large as comparable Fortran or COBOL compilers and also that much slower supposedly offset by gains in programmer productivity This was anticipated in IBM before the first compilers were written 9 Some argue that PL I is unusually hard to parse 80 The PL I keywords are not reserved so programmers can use them as variable or procedure names in programs Because the original PL I F compiler attempts auto correction when it encounters a keyword used in an incorrect context it often assumes it is a variable name This leads to cascading diagnostics 31 a problem solved by later compilers The effort needed to produce good object code was perhaps underestimated during the initial design of the language Program optimization needed to compete with the excellent program optimization carried out by available Fortran compilers is unusually complex owing to side effects and pervasive problems with aliasing of variables Unpredictable modification can occur asynchronously in exception handlers which may be provided by ON statements in unseen callers Together these make it difficult to reliably predict when a program s variables might be modified at runtime In typical use however user written error handlers the ON unit often do not make assignments to variables In spite of the aforementioned difficulties IBM produced the PL I Optimizing Compiler in 1971 32 PL I contains many rarely used features such as multitasking support an IBM extension to the language which add cost and complexity to the compiler and its co processing facilities require a multi programming environment with support for non blocking multiple threads for processes by the operating system Compiler writers were free to select whether to implement these features An undeclared variable is by default declared by first occurrence thus misspelling might lead to unpredictable results This implicit declaration is no different from FORTRAN programs For PL I F however an attribute listing enables the programmer to detect any misspelled or undeclared variable Programmer issues edit Many programmers were slow to move from COBOL or Fortran due to a perceived complexity of the language and immaturity of the PL I F compiler Programmers were sharply divided into scientific programmers who used Fortran and business programmers who used COBOL with significant tension and even dislike between the groups PL I syntax borrowed from both COBOL and Fortran syntax So instead of noticing features that would make their job easier Fortran programmers of the time noticed COBOL syntax and had the opinion that it was a business language while COBOL programmers noticed Fortran syntax and looked upon it as a scientific language Both COBOL and Fortran programmers viewed it as a bigger version of their own language and both were somewhat intimidated by the language and disinclined to adopt it Another factor was pseudo similarities to COBOL Fortran and ALGOL These were PL I elements that looked similar to one of those languages but worked differently in PL I Such frustrations left many experienced programmers with a jaundiced view of PL I and often an active dislike for the language An early UNIX fortune file contained the following tongue in cheek description of the language citation needed Speaking as someone who has delved into the intricacies of PL I I am sure that only Real Men could have written such a machine hogging cycle grabbing all encompassing monster Allocate an array and free the middle third Sure Why not Multiply a character string times a bit string and assign the result to a float decimal Go ahead Free a controlled variable procedure parameter and reallocate it before passing it back Overlay three different types of variable on the same memory location Anything you say Write a recursive macro Well no but Real Men use rescan How could a language so obviously designed and written by Real Men not be intended for Real Man use On the positive side full support for pointers to all data types including pointers to structures recursion multitasking string handling and extensive built in functions meant PL I was indeed quite a leap forward compared to the programming languages of its time However these were not enough to persuade a majority of programmers or shops to switch to PL I The PL I F compiler s compile time preprocessor was unusual outside the Lisp world 81 in using its target language s syntax and semantics e g as compared to the C preprocessor s directives Special topics in PL I editStorage classes edit PL I provides several storage classes to indicate how the lifetime of variables storage is to be managed STATIC AUTOMATIC CONTROLLED and BASED The simplest to implement is STATIC which indicates that memory is allocated and initialized at load time as is done in COBOL working storage and early Fortran This is the default for EXTERNAL variables PL I s default storage class for INTERNAL variables is AUTOMATIC similar to that of other block structured languages influenced by ALGOL like the auto storage class in the C language and default storage allocation in Pascal and local storage in IBM COBOL Storage for AUTOMATIC variables is allocated upon entry into the BEGIN block procedure or ON unit in which they are declared The compiler and runtime system allocate memory for a stack frame to contain them and other housekeeping information If a variable is declared with an INITIAL attribute code to set it to an initial value is executed at this time Care is required to manage the use of initialization properly Large amounts of code can be executed to initialize variables every time a scope is entered especially if the variable is an array or structure Storage for AUTOMATIC variables is freed at block exit STATIC CONTROLLED or BASED variables are used to retain variables contents between invocations of a procedure or block CONTROLLED storage is also managed using a stack but the pushing and popping of allocations on the stack is managed by the programmer using ALLOCATE and FREE statements Storage for BASED variables is managed using ALLOCATE FREE but instead of a stack these allocations have independent lifetimes and are addressed through OFFSET or POINTER variables The AREA attribute is used to declare programmer defined heaps Data can be allocated and freed within a specific area and the area can be deleted read and written as a unit 82 pp 235 274 Storage type sharing edit There are several ways of accessing allocated storage through different data declarations Some of these are well defined and safe some can be used safely with careful programming and some are inherently unsafe or machine dependent 82 pp 262 267 178 180 Passing a variable as an argument to a parameter by reference allows the argument s allocated storage to be referenced using the parameter The DEFINED attribute e g DCL A 10 10 B 2 9 2 9 DEFINED A allows part or all of a variable s storage to be used with a different but consistent declaration The language definition includes a CELL attribute later renamed UNION to allow different definitions of data to share the same storage This was not supported by many early IBM compilers These usages are safe and machine independent Record I O and list processing produce situations where the programmer needs to fit a declaration to the storage of the next record or item before knowing what type of data structure it has Based variables and pointers are key to such programs The data structures must be designed appropriately typically using fields in a data structure to encode information about its type and size The fields can be held in the preceding structure or with some constraints in the current one Where the encoding is in the preceding structure the program needs to allocate a based variable with a declaration that matches the current item using expressions for extents where needed Where the type and size information are to be kept in the current structure self defining structures the type defining fields must be ahead of the type dependent items and in the same place in every version of the data structure The REFER option is used for self defining extents e g string lengths as in DCL 1 A BASED 2 N BINARY 2 B CHAR LENGTH REFER A N etc where LENGTH is used to allocate instances of the data structure For self defining structures any typing and REFERed fields are placed ahead of the real data If the records in a data set or the items in a list of data structures are organised this way they can be handled safely in a machine independent way PL I implementations do not except for the PL I Checkout compiler keep track of the data structure used when storage is first allocated Any BASED declaration can be used with a pointer into the storage to access the storage inherently unsafe and machine dependent However this usage has become important for pointer arithmetic typically adding a certain amount to a known address This has been a contentious subject in computer science In addition to the problem of wild references and buffer overruns issues arise due to the alignment and length for data types used with particular machines and compilers Many cases where pointer arithmetic might be needed involve finding a pointer to an element inside a larger data structure The ADDR function computes such pointers safely and machine independently Pointer arithmetic may be accomplished by aliasing a binary variable with a pointer as in DCL P POINTER N FIXED BINARY 31 BASED ADDR P N N 255 It relies on pointers being the same length as FIXED BINARY 31 integers and aligned on the same boundaries With the prevalence of C and its free and easy attitude to pointer arithmetic recent IBM PL I compilers allow pointers to be used with the addition and subtraction operators to giving the simplest syntax but compiler options can disallow these practices where safety and machine independence are paramount ON units and exception handling edit When PL I was designed programs only ran in batch mode with no possible intervention from the programmer at a terminal An exceptional condition such as division by zero would abort the program yielding only a hexadecimal core dump PL I exception handling via ON units allowed the program to stay in control in the face of hardware or operating system exceptions and to recover debugging information before closing down more gracefully As a program became properly debugged most of the exception handling could be removed or disabled this level of control became less important when conversational execution became commonplace Computational exception handling is enabled and disabled by condition prefixes on statements blocks including ON units and procedures e g SIZE NOSUBSCRIPTRANGE A I B I C Operating system exceptions for Input Output and storage management are always enabled The ON unit is a single statement or BEGIN block introduced by an ON statement Executing the ON statement enables the condition specified e g ON ZERODIVIDE ON unit When the exception for this condition occurs and the condition is enabled the ON unit for the condition is executed ON units are inherited down the call chain When a block procedure or ON unit is activated the ON units established by the invoking activation are inherited by the new activation They may be over ridden by another ON statement and can be reestablished by the REVERT statement The exception can be simulated using the SIGNAL statement e g to help debug the exception handlers The dynamic inheritance principle for ON units allows a routine to handle the exceptions occurring within the subroutines it uses If no ON unit is in effect when a condition is raised a standard system action is taken often this is to raise the ERROR condition The system action can be reestablished using the SYSTEM option of the ON statement With some conditions it is possible to complete executing an ON unit and return to the point of interrupt e g the STRINGRANGE UNDERFLOW CONVERSION OVERFLOW AREA and FILE conditions and resume normal execution With other conditions such as SUBSCRIPTRANGE the ERROR condition is raised when this is attempted An ON unit may be terminated with a GO TO preventing a return to the point of interrupt but permitting the program to continue execution elsewhere as determined by the programmer An ON unit needs to be designed to deal with exceptions that occur in the ON unit itself The ON ERROR SYSTEM statement allows a nested error trap if an error occurs within an ON unit control might pass to the operating system where a system dump might be produced or for some computational conditions continue execution as mentioned above The PL I RECORD I O statements have relatively simple syntax as they do not offer options for the many situations from end of file to record transmission errors that can occur when a record is read or written Instead these complexities are handled in the ON units for the various file conditions The same approach was adopted for AREA sub allocation and the AREA condition The existence of exception handling ON units can have an effect on optimization because variables can be inspected or altered in ON units Values of variables that might otherwise be kept in registers between statements may need to be returned to storage between statements This is discussed in the section on Implementation Issues above 82 pp 249 376 GO TO with a non fixed target edit PL I has counterparts for COBOL and FORTRAN s specialized GO TO statements Syntax for both COBOL and FORTRAN exist for coding two special two types of GO TO each of which has a target that is not always the same ALTER COBOL ASSIGN FORTRAN ALTER paragraph name xxx TO PROCEED TO para name zzz 83 There are other helpful restrictions on these especially in programs RECURSIVE attribute in methods or THREAD option 83 ASSIGN 1860 TO IGOTTAGO 84 GO TO IGOTTAGO One enhancement which adds built in documentation isGO TO IGOTTAGO 1860 1914 1939 which restricts the variable s value to one of the labels in the list 84 dd GO TO based on a variable s subscript like value GO TO 1914 1939 2140 MYCHOICE 85 GO TO para One para Two para Three DEPENDING ON IDECIDE 86 PL I has statement label variables with the LABEL attribute which can store the value of a statement label and later be used in a GOTO statement 87 30 54 30 23 LABL1 LABL2 MY DEST LABL1 GO TO MY DEST GO TO HERE LUCKY NUMBER minus 1 zero or HERE 1 PUT LIST I O U GO TO Lottery HERE 0 PUT LIST No Cash GO TO Lottery HERE 1 PUT LIST Dollar Bill GO TO Lottery HERE 2 PUT LIST TWO DOLLARS GO TO Lottery Statement label variables can be passed to called procedures and used to return to a different statement in the calling routine Sample programs editHello world program edit Hello2 proc options main put list Hello World end Hello2 Search for a string edit Read in a line which contains a string and then print every subsequent line that contains that string find strings procedure options main declare pattern character 100 varying declare line character 100 varying declare line no fixed binary on endfile sysin stop get edit pattern L line no 1 do forever get edit line L if index line pattern gt 0 then put skip list line no line line no line no 1 end end find strings See also edit nbsp Computer programming portalList of programming languages Timeline of programming languagesNotes edit Changes at I B M The New York Times June 20 1984 Sturm Eberhard 2009 The New PL I Vieweg Teubner ISBN 978 3 8348 0726 7 a b Pugh Emerson W Johnson Lyle R Palmer John H 1991 IBM s 360 and early 370 systems Cambridge Mass MIT Press ISBN 978 0 262 16123 7 The committee actually had 8 members at the time the report was released They were citation needed Hans Berg Lockheed Burbank George Radin IBM James Cox Union Carbide Bruce Rosenblatt Standard Oil of California Chair Douglas McIlroy Bell Laboratories Robert Sheppard Procter amp Gamble From the GUIDE organization C W Medlock IBM Bernice Weitzenhoffer IBM Datamation in Business amp Science MPPL IN FOR NPL PDF Datamation Vol 11 no 4 FRANK D THOMPSON April 1965 p 17 Datamation in Business amp Science ANOTHER NEW NAME MORE COMPILERS FOR NPL PDF Datamation Vol 11 no 6 FRANK D THOMPSON June 1965 p 17 Report II of the SHARE Advanced Language Development Committee June 25 1964 Radin G H Paul Rogoway January 1965 Highlights of a New Programming Language Communications of the ACM 8 1 9 17 doi 10 1145 363707 363708 S2CID 17133703 a b Radin G August 1978 The Early History and Characteristics of PL I ACM SIGPLAN Notices 13 8 227 241 doi 10 1145 960118 808389 S2CID 13925251 Control of the language was vested in a dedicated Language Control group and a Language Control Board that included representatives of the compiler groups 6 by 1973 in three countries Daily communication was by telex Changes and extensions were made through a Language Log that reached several thousand detailed points A management level Language Review Board resolved issues escalated to it by the Control Board The Universal Language Document ULD Technical reports TR25 081 TR25 082 TR25 083 TR25 0S4 TR25 085 TR25 086 and TR25 087 IBM Corp Vienna Austria June 1968 Frederick P Brooks Jr IEEE Computer Society IEEE Computer Society 1989 Chapter 1 Introduction PDF NPL Technical Report PDF Report IBM December 1964 p 11 Retrieved January 1 2024 NPL is designed to serve the needs of an unusually large group of programmers including scientific business real time and systems programmers Some compilers chose to reserve these identifiers or issue warnings if they found them used as identifiers But the subsequent introduction of a case statement shows the value of the principle Vowels Robin 2001 Introduction to PL I R A Vowels p x ISBN 978 0 9596384 9 3 PL I is the first language to provide adequate facilities for scientific computations business data processing and systems programming in a single language Jean Sammet Some Approaches to and Illustrations of Programming Language History a b ANS Programming Language PL I X3 53 1976 a b ANSI X3 74 1981 R1998 Information Systems Programming Language PL I General Purpose Subset Reacting to IBM s involvement a number of manufacturers had been reluctant to endorse an effort on a Standard The initial remit of CLDG X3J1 was to investigate whether PL I was a suitable candidate for standardization The joint effort processed over 3500 proposals for language or textual changes PL I Language Specifications GY33 6003 The PL I machine defined in the standard is covered in The Definition Mechanism for Standard PL I Michael Marcotty Frederick G Sayward 1987 PL I General Purpose Subset ANSI X3 74 1987 a b c Krasun Andy The first 35 years of Hursley software 1958 1993 with some hardware asides a personal account PDF Retrieved May 5 2020 IBM System 360 Operating System PL I F Compiler Program Logic Manual PDF IBM December 1966 SECTION 2 COMPILER PHASES Y28 6800 1 These were designed in 1966 for an early Optimizing compiler written in PL I and to be bootstrapped starting with the PL I F compiler There were many delays in shipping these so a common PL I joke at the time was that Gen de Gaulle forbade La Gaude from shipping them until the Concorde had its first flight IBM System 360 PL I Subset Reference Manual PDF IBM 1967 C28 8202 0 a b R A Frieburghouse The Multics PL 1 Compiler Multicians org Tom Van Vleck ed The Choice of PL I Multicians org Series 60 Level 66 6000 PL I Reference Manual Honeywell 1976 Order No DE05 a b c d OS PL I Checkout and Optimizing Compilers Language Reference Manual PDF IBM October 1976 GC33 0009 04 a b Microsoft CodeAnalysis CSharp A Binder converts names permanent dead link a b A Endres 2013 Early Language and Compiler Developments at IBM Europe R N Cuff May 1972 A Conversational Compiler for Full PL I The Computer Journal 15 2 99 104 doi 10 1093 comjnl 15 2 99 B L Marks 1973 The design of a checkout compiler IBM Systems Journal 12 3 315 327 doi 10 1147 sj 123 0315 VAX 11 PL I Version 1 0 PDF Digital October 1980 Retrieved 2023 10 31 Uniprise PL I for UNIX Reference Manual Uniprise Systems Inc Irvine California 1995 p xxi Tom Linden 2004 05 21 RE Dave Cutler and VMS 2 Newsgroup comp os vms Archived from the original on June 14 2021 Retrieved 2021 02 26 a href Template Cite newsgroup html title Template Cite newsgroup cite newsgroup a CS1 maint unfit URL link Cutler Dave 2016 02 25 Dave Cutler Oral History youtube com Interview Interviewed by Grant Saviers Computer History Museum Archived from the original on 2021 12 11 Retrieved 2021 02 26 Robin Vowels 2010 04 01 PL I Frequently Asked Questions FAQ Newsgroup comp answers a b Kednos PL I for OpenVMS and Tru64 kednos com 2016 11 02 Archived from the original on 2021 03 14 Retrieved 2021 03 30 Richard C Holt November 5 1972 Teaching the Fatal Disease or Introductory Computer Programming Using PL I Archived from the original on April 15 2011 Retrieved May 30 2010 Department of Computer Science User s Guide to PL C The Cornell Compiler for PL I Cornell University Ithaca 1977 SL 1 Student Language One The IBM 1130 BobsPixels com PLAGO 360 User s Manual Polytechnic Institute of Brooklyn J N P Hume and R C Holt Structured Programming using PL I and SP k Reston Reston 1975 Marvin Victor Zelkowitz PL I Programming with PLUM 2nd Ed Paladin House Geneva Ill 1978 a b Robin A Vowels March 1996 PL I for OS 2 ACM SIGPLAN Notices 31 3 Association for Computing Machinery 22 27 doi 10 1145 227717 227724 S2CID 24441291 IBM PL I Compiler Family IBM Retrieved 5 July 2021 Burroughs Corporation B 6700 B 7700 PL I Language Reference Manual Reference 5001530 Detroit 1977 Sperry Univac Computer Systems SPERRY UNIVAC 1100 Series PL I Programmer Reference Reference UP 8277 1976 Data General Corporation AOS PL I Reference Manual Order No 093 000204 c 1978 Paul W Abrahams The CIMS PL I compiler 1979 SIGPLAN symposium on Compiler construction pp 107 116 doi 10 1145 800229 806960 ISBN 0 89791 002 8 Control Data Corporation PL I Reference Manual 1978 Publication No 60388100A OpenVOS PL I Language Manual R009 Marlboro Massachusetts Stratus Computer Inc 1995 OpenVOS PL I IBM Series 1 PL I Introduction Program Numbers 5719 PL1 5719 PL3 PDF First ed IBM February 1977 GC34 0084 0 IBM Series 1 PL I Language Reference Manual IBM GC34 0085 0 a b c Peter Norton May 15 1984 The Norton chronicles PC Magazine Archived from the original on July 6 2011 Retrieved January 25 2010 What s New in Studio and Server Enterprise Edition 6 0 Service Pack 2 Wrap Pack 1 PDF Micro Focus p 1 Archived from the original PDF on November 7 2017 Enterprise gt Micro Focus Studio Enterprise Edition for UNIX gt Welcome gt Product Information gt Installing Studio Enterprise Edition for UNIX gt System Requirements Micro Focus Archived from the original on 2017 11 07 Retrieved 2017 11 05 IBM PL I Set for AIX Version 1 19 September 1995 Retrieved 13 May 2019 Iron Spring PL I Compiler Programming Guide ironspring com 2020 09 15 Retrieved 2021 02 26 Frank G Soltis 1997 Inside the AS 400 Second Edition Duke Press ISBN 978 1 882419 66 1 Berg William Cline Marshall Girou Mike October 1995 Lessons learned from the OS 400 OO project Communications of the ACM 38 10 54 64 doi 10 1145 226239 226253 S2CID 7492851 Pigott Diarmuid PL MP Online Historical Encyclopaedia of Programming Languages Archived from the original on August 2 2020 Retrieved Feb 24 2021 Leif Svalgaard 2003 10 08 Re Re MI emulator MI400 Mailing list Retrieved 2021 02 26 Dave McKenzie 2004 09 01 RE Dave McKenzie s UNDELete utility a LifeSaver Midrange Archive MI400 Retrieved 2021 05 24 Dan Hicks 1998 08 21 UNIX vs AS 400 Newsgroup comp sys ibm as400 misc Cocke John Markstein Victoria January 1990 The evolution of RISC technology at IBM PDF IBM Journal of Research and Development 34 1 4 11 doi 10 1147 rd 341 0004 Retrieved 2022 10 05 The result was the PL 8 language the 8 implying that it had about 80 percent of the richness of PL I a b W Gellerich T Hendel R Land H Lehmann M Mueller P H Oden H Penner May 2004 The GNU 64 bit PL8 compiler Toward an open standard environment for firmware development PDF IBM Journal of Research and Development 48 3 4 IBM 543 556 doi 10 1147 rd 483 0543 S2CID 19020943 Archived from the original PDF on 2021 01 24 Retrieved 2021 02 26 Marc Auslander Martin Hopkins June 1982 An overview of the PL 8 compiler PDF SIGPLAN 82 Proceedings of the 1982 SIGPLAN symposium on Compiler construction ACM pp 22 31 doi 10 1145 872726 806977 Retrieved 2021 02 26 J von Buttlar H Bohm R Ernst A Horsch A Kohler H Schein M Stetter K Theurich July 2002 z CECSIM An efficient and comprehensive microcode simulator for the IBM eServer z900 PDF IBM Journal of Research and Development 46 4 5 IBM 607 615 doi 10 1147 rd 464 0607 S2CID 12745372 Archived from the original PDF on 2020 02 11 Retrieved 2021 02 26 Pearkins Jon E December 1 1995 Open PL I Liant addresses PL I legacy applications Enterprise Systems Journal Archived from the original on November 3 2012 Open PL I estimated that in 1995 20 of mainframe legacy applications were in PL I with 60 in COBOL there were 300 000 PL I programmers worldwide Schultz G D Rose C West J Gray April 1980 Executable description and validation of SNA IEEE Transactions on Communications 28 4 661 677 doi 10 1109 TCOM 1980 1094695 Clair Grant June 2005 Porting OpenVMS to HP Integrity Servers PDF OpenVMS Technical Journal 6 In his slides on IBM Operating System 360 Fred Brooks says OS 360 should have been written in PL I not PL S and Assembler The article is a great summary of the OS 360 program The 360 Architecture and Its Operating System Archived 2020 07 28 at the Wayback Machine 2001 IBM System 360 Operating System PL I F Language Reference Manual PDF Fifth ed December 1972 Chapter 15 Multitasking GC28 8201 4 OS PL I Checkout and Optimizing Compilers Language Reference Manual PDF Fifth ed October 1976 Chapter 17 Multitasking GC33 0009 4 Chapter 8 Program Control Kednos PL I for OpenVMS Systems Reference Manual January 2007 Archived from the original on 2016 08 18 Retrieved 2017 11 05 The compiler cannot tell whether a statement is a declaration or a multiple assignment statement until encountering the of the assignment or of the DECLARE which can be several lines later The fact that DECLARE DCL were not reserved is the proximate cause in this example consider the fragment DECLARE I J K L vs DECLARE I J K L Hart Timothy P October 1963 MACRO Definitions for LISP Artificial Intelligence Memos No 57 hdl 1721 1 6111 a b c Enterprise PL I for z OS PL I for AIX Rational Developer for System z PL I for Windows Language Reference PDF Third ed IBM September 2012 SC14 7285 02 Retrieved July 9 2023 a b ALTER statement IBM 24 September 2021 a b GO TO Assigned GO TO Computed GO TO Statement in COBOL Digital Research PL I Language Programmer s Guide p 103 References editTextbooks edit Neuhold E J amp Lawson H W 1971 The PL I Machine An Introduction to Programming Addison wesley ISBN 978 0 2010 5275 6 Barnes R A 1979 PL I for Programmers North Holland Hughes Joan K 1973 PL I Programming 1st ed Wiley ISBN 0 471 42032 8 Hughes Joan K 1986 PL I Structured Programming 3rd ed Wiley ISBN 0 471 83746 6 Groner G F 1971 PL I Programming in Technological Applications Books on Demand Ann Arbor MI Anderson M E 1973 PL I for Programmers Prentice Hall Stoutemyer D R 1971 PL I Programming for Engineering amp Science Prentice Hall Ziegler R R amp C 1986 PL I Structured Programming and Problem Solving 1st ed West ISBN 978 0 314 93915 9 Sturm E 2009 The New PL I for PC Workstation and Mainframe Vieweg Teubner Wiesbaden Germany ISBN 978 3 8348 0726 7 Vowels R A 1997 Introduction to PL I Algorithms and Structured Programming 3rd ed R A Vowels ISBN 978 0 9596384 9 3 Abrahams Paul 1979 The PL I Programming Language PDF Courant Mathematics and Computing Laboratory New York University Standards edit ANSI ANSI X3 53 1976 R1998 Information Systems Programming Language PL I ANSI ANSI X3 74 1981 R1998 Information Systems Programming Language PL I General Purpose Subset ANSI ANSI X3 74 1987 R1998 Information Systems Programming Language PL I General Purpose Subset ECMA 50 Programming Language PL I 1st edition December 1976 ISO 6160 1979 Programming languages PL I ISO IEC 6522 1992 Information technology Programming languages PL I general purpose subsetReference manuals edit Burroughs Corporation B 6700 B 7700 PL I Language Reference 5001530 Detroit 1977 CDC R A Vowels PL I for CDC Cyber Optimizing compiler for the CDC Cyber 70 series Digital Equipment Corporation decsystem10 Conversational Programming Language User s Manual DEC 10 LCPUA A D Maynard 1975 Fujitsu Ltd Facom OS IV PL I Reference Manual 70SP5402E 1 1974 579 pages PL I F subset Honeywell Inc Multics PL I Language Specification AG94 02 1981 IBM IBM Operating System 360 PL I Language Specifications C28 6571 1965 IBM OS PL I Checkout and Optimizing Compilers Language Reference Manual GC33 0009 1976 IBM IBM NPL Technical Report December 1964 IBM Enterprise PL I for z OS Version 4 Release 1 Language Reference Manual Archived 2020 07 28 at the Wayback Machine SC14 7285 00 2010 IBM OS 2 PL I Version 2 Programming Language Reference 3rd Ed Form SC26 4308 San Jose 1994 Kednos PL I for OpenVMS Systems Reference Manual Archived 2004 03 04 at the Wayback Machine AA H952E TM Nov 2003 Liant Software Corporation 1994 Open PL I Language Reference Manual Rev Ed Framingham Mass Nixdorf Computer Terminalsystem 8820 Systemtechnischer Teil PL I Subset 05001 17 8 93 01 1976 Ing C Olivetti Mini PL I Reference Manual 1975 No 3970530 V Q1 Corporation The Q1 LMC Systems Software Manual Farmingdale 1978 External links edit nbsp Wikibooks has more on the topic of PL I IBM PL I Compilers for z OS AIX MVS VM and VSE Iron Spring Software PL I for Linux and OS 2 Micro Focus Mainframe PL I Migration Solution OS PL I V2R3 grammar Version 0 1 Pliedit PL I editor for Eclipse Power vs Adventure PL I and C a side by side comparison of PL I and C Softpanorama PL 1 page The PL I Language PL1GCC project in SourceForge PL 1 software to print signs source code in book form by David Sligar 1977 for IBM PL 1 F compiler An open source PL I Compiler for Windows NTPortal nbsp Computer programming Retrieved from https en wikipedia org w index php title PL I amp oldid 1216996854, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.