Programming language developed at Cornell University
PL/C is an instructional dialect of the programming language PL/I, developed at the Department of Computer Science of Cornell University in the early 1970s in an effort headed by Professor Richard W. Conway and graduate student Thomas R. Wilcox. PL/C was developed with the specific goal of being used for teaching programming. The PL/C compiler, which implemented almost all of the large PL/I language, had the unusual capability of never failing to compile a program, through the use of extensive automatic correction of many syntax errors and by converting any remaining syntax errors to output statements. This was important because, at the time, students submitted their programs on 
IBM punch cards and might not get their output back for several hours. Over 250 other universities adopted PL/C; as one late-1970s textbook on PL/I noted, "PL/C ... the compiler for PL/I developed at Cornell University ... is widely used in teaching programming." Similarly, a mid-late-1970s survey of programming languages said that "PL/C is a widely used dialect of PL/I."
Origins and rationale.
Work on this project was based on a prior Cornell compiler for the programming language CUPL, which in turn was influenced by the earlier Cornell language implementation CORC. Both of these were small, very restricted languages intended for the teaching of beginning programming. CORC had been used at Cornell from 1962 to 1966 and CUPL from 1965 to 1969. Conway's group had been involved in the development of both of those efforts, each of which attempted automatic repair of source code errors.
As the 1970s began, Cornell was attempting to find a teaching language that had general commercial acceptance but also contained modern language features. As another Cornell computer science professor, David Gries, wrote at the time, the first criterion effectively eliminated the ALGOL family of languages and the second criteria argued against FORTRAN and BASIC (with COBOL not even being considered); thus, they chose PL/I. While PL/I did have a foothold in educational use, the decision went against the grain of most universities, where one survey found that some 70 percent of American college students were being taught with FORTRAN. However, Cornell was intent on having a language useful for showing computer science principles and best engineering practices and through which methods such as structured programming and stepwise refinement could be taught, and PL/I was a more expressive vehicle for that than FORTRAN.
For educational institutions that did choose to use the language, the production IBM PL/I F compiler then available was much too slow, in both compile time and execution time, for its use to be practical for student programs. A similar situation existed for FORTRAN, where the IBM FORTRAN IV G compiler was too slow and the University of Waterloo's WATFOR implementation had become a very popular alternate solution. So there was an opening for a student compiler for PL/I; indeed, IBM recognized this and contacted Cornell and suggested they make a 'WATFOR for PL/I'. Indeed, this simile would be made explicit; as one university would explain to their computer center users, "PL/C is to PL/I what WATFOR is to FORTRAN IV, a fast compile-and-go system with some batching capabilities intended primarily for student use."
IBM supplied some of the funding for the initial PL/C development effort, which took place during 1968 and 1969, with the "C" in the name standing for Cornell. PL/C began being used on a regular basis in September 1970.
Dialect and features.
PL/C, a large subset of PL/I, eliminated a few of the more complex features of PL/I – record I/O, list processing, multitasking, and the compile-time preprocessor. It added extensive debugging and error recovery facilities. PL/C was upwardly compatible with PL/I, meaning that a program that runs without error under the PL/C compiler should run under PL/I and produce the same results. The only exception is if certain incompatible diagnostic features of PL/C were used. The PL/C compiler 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.
PL/C provided extensions to PL/I's own codice_1 facility for flow tracing, and additionally provided new facilities, such as the codice_2 and codice_3 statements for printing the values of every scalar and every array variable at that point in the program. PL/C also provided pseudo-comments, which could be used to conditionally turn on code based on options supplied in the PL/C job control card:
The comments value shown here would result in the first codice_4 statement being "uncommented" and invoked during the run, while the second one whose number did not match would still be a comment. Pseudo-comments also provided a way to use PL/C-specific statements in an upwardly compatible way with PL/I, as in the second case, since the PL/I compiler would see them as comments only.
PL/C handles floating point arithmetic by computing all single-precision values as double precision, which can complicate attempts by the programmer to validate rounding behavior of particular computations.
A simple example of PL/C's error repair has been presented as:
While many cases such as this one can be successfully repaired, there are also cases where the repair does not achieve what the programmer likely intended.
There were several other education-related PL/I compilers, including PLAGO from the Polytechnic Institute of Brooklyn and SP/k from the University of Toronto, however they tended to use much more restricted subsets of PL/I, whereas PL/C supported almost the entire language. And PL/C was the only PL/I educational dialect mentioned in languages expert Jean E. Sammet's extensive survey of programming languages in use for 1976–77.
Design and implementation.
The implementation of the PL/C compiler itself was done in IBM 360 Assembly Language, with a heavy use of assembly language macros. It was done as a three-pass compiler, with the first pass doing syntax analysis and error correction of syntactical mistakes, the second pass doing semantic analysis and further error correction, and the third pass doing code generation. PL/C needed to avoid the longstanding problem of "cascading diagnostics", wherein one error is internally but often mistakenly "fixed" by the compiler, resulting in a secondary, tertiary and additional series of unhelpful error messages. The design of the intermediate language used between the passes and of the accompanying symbol table was tailored towards, and key to the achievement of, the error-repair and diagnostic reporting capabilities of PL/C. While a number of these techniques dated from the Cornell CORC and CUPL efforts, here they were being used for the first time on large programming language with a full set of commercial-grade features. This was especially notable given that the PL/I language was notoriously challenging for compilers to deal with.
The compilation speed of PL/C was quite good – some 10,000–20,000 sources lines of code per minute on an IBM System/360 Model 65. The work done on PL/C was described in a paper presented at an AFIPS joint conference in Spring 1971. More prominent was the paper "Design and Implementation of a Diagnostic Compiler for PL/I" by Conway and Wilcox, published in the March 1973 issue of the flagship journal "Communications of the ACM", which gave the project considerable visibility within the computer science world.
PL/C was implemented as a compile and go system, similar to WATFOR. It ran on the IBM System/360 and System/370 under OS and HASP. As such, it was designed to run within a 128K byte partition, where the PL/C software and the generated object code took a maximum of 100K bytes. Error correction was attempted at runtime as well, with the PL/C execution supervisor trapping or otherwise detecting use of uninitialized variables, division by zero, out-of-range array indexes, and the like, by issuing a diagnostic and making some adjustment to allow the program to keep running. Overall, use of PL/C significantly reduced the severity of the wait-times-for-batch-runs problem (although Cornell itself developed a job entry system for turning around most student batch jobs very quickly).
Use and distribution.
As soon as it was ready, PL/C was distributed beyond Cornell itself, in the form of magnetic tapes sent to interested parties. For instance, PL/C was first used at the University of Michigan in the Fall 1970 semester. The PL/C project was considered a research effort, not a commercial endeavor; however, those installations who wanted to use PL/C were asked to pay a "research grant" in exchange. This amount was $1,800 as of 1972, and had risen to $2,400 by 1976. Cornell's further development work on PL/C was partly funded by these payments.
PL/C quickly became the most popular of any education version of PL/I; in 1970–71 alone, it was sent to 100 different institutions, resulting in 60 of them purchasing it. By 1976, there were more than 200 sites around the world that had installed PL/C. Eventually, over 250 universities had used it. There was also some interest in PL/C from non-academic entities, thus resulting in PL/C adding support for some business-oriented features such as PICTURE variables. 
A survey conducted by New Mexico State University in 1972 looked at various possibilities for teaching languages and implementations and concluded regarding PL/C:
"PL/C seems praiseworthy. Its purchase price ($1,800) is probably its biggest drawback. It has all of the built-in functions PL/I has, is much faster in both compilation and execution, and runs in 86K of a 100K partition leaving 14K for the student program. Its only real possible deficiency for student programs is its lack of record I/O capability. The PL/C compiler not only diagnoses errors, but often corrects them properly. It inserts missing parentheses and semicolons and shows both the invalid statement and the corrected statement. If PL/C finds a statement completely unrecognizable it deletes it and attempts execution anyway."
Some universities, including Washington State University, found success in teaching an introductory class that used PL/C first and then Fortran (using WATFIV) second, which was found to be a beneficial order in terms of student learning. Indeed, Cornell at one point restructured their introductory course offering to allow students the option to do that.
PL/C release numbers were to some extent synchronized to releases of the IBM PL/I F compiler, so that for instance Release 4 of PL/C was intended to match Version 4 of the IBM F compiler in terms of upward compatibility. In terms of some instances of PL/C distributions, Release 4 was available by January 1971; Release 6 by August 1971; Release 6.5 by November 1973; Release 7.1 in March 1975; and Release 7.5 in March 1976. The last version of PL/C appears to have been Release 7.6, put out in 1977.
Variants.
Within the computer science department at Cornell there was a sense of pride about PL/C being associated with the university, and there were several variants of PL/C worked on by Conway, other faculty members, and graduate students.
In 1974, the PL/CT variant of PL/C, for use on interactive terminals rather than in batch job submissions, was first made available at Cornell. A second release was made in 1975, and then it was made available to outside institutions in 1976. PL/CT primarily ran on an IBM System/370 under VM/CMS; it could also run in the IBM TSO environment. Somewhat unusually, PL/CT was not interpreted but rather was still implemented as a compiler. 
A variant under development by 1976 was PL/CS, which was a far more restricted subset of PL/I than regular PL/C and which provided direct language support for assertions. The subset was enough, however, that PL/CS would still be suitable for teaching introductory programming classes. It was implemented as an alternate lexical and syntactic analyzer that then plugged into the common PL/C code generator and runtime system. PL/CS was also used in research on the formal semantics of programming languages.
A different implementation of the PL/CS definition came with Professor Tim Teitelbaum and his pioneering Cornell Program Synthesizer work. This early instance of an integrated development environment was developed in 1978 for the PDP-11/60, and contained a structured editor for PL/CS along with an incremental compiler as well as an interpreter. The Cornell Program Synthesizer was soon adapted for the Terak desktop workstation, an early personal computer, which was based on the LSI-11 processor. The Terak computer found popularity for instructional use at Cornell and at other universities, as did the PL/CS available on it. In addition, Cornell built a link between the Terak and their IBM 370 mainframe, that would allow batch-mode execution of programs