91自拍

The APL Programming Language Source Code

By Leonard J. Shustek | October 10, 2012

Software Gems: The 91自拍 Historical Source Code Series

Ken Iverson at Harvard University

Thousands of programming languages were invented in the first 50 years of the age of computing. Many of them were similar, and many followed a traditional, evolutionary path from their predecessors.

But some revolutionary languages had a slant that differentiated them from their more general-purpose brethren. LISP was for list processing. SNOBOL was for string manipulation. SIMSCRIPT was for simulation. And APL was for mathematics, with an emphasis on array processing.

What eventually became APL was first invented by Harvard professor Kenneth E. Iverson in 1957 as a mathematical notation, not as a computer programming language. Although other matrix-oriented symbol systems existed, including the concise tensor notation invented by Einstein, they were oriented more towards mathematical analysis and less towards synthesis of algorithms. Iverson, who was a student of Howard Aiken鈥檚, taught what became known as 鈥淚verson Notation鈥 to his Harvard students to explain algorithms.

Iverson was hired by IBM in 1960 to work with Adin Falkoff and others on his notation. In his now famous 1962 book 鈥淎 Programming Language鈥 1, he says the notation is for the description of 鈥減rocedures鈥alled algorithms or programs鈥, and that it is a language because it 鈥渆xhibits considerable syntactic structure鈥. But at that point it was just a notation for people to read, not a language for programming computers. The book gives many examples of its use both as a descriptive tool (such as for documenting the definition of computer instruction sets) and as a means for expressing general algorithms (such as for sorting and searching). Anticipating resistance to something so novel, he says in the preface, 鈥淚t is the central thesis of this book that the descriptive and analytical power of an adequate programming language amply repays the considerable effort required for its mastery.鈥 Perhaps he was warning that mastering the language wasn鈥檛 trivial. Perhaps he was also signaling that, in his view, other notational languages were less than 鈥渁dequate鈥.

The team, of course, soon saw that the notation could be turned into a language for programming computers. That language, which was called APL starting in 1966, emphasized array manipulation and used unconventional symbols. It was like no other computer program language that had been invented.

APL became popular when IBM introduced 鈥淎PL\360鈥 for their System/360 mainframe computer. Unlike most other languages at the time, APL\360 was also a complete interactive programming environment. The programmer, sitting at an electromechanical typewriter linked to a timeshared computer, could type APL statements and get an immediate response. Programs could be defined, debugged, run, and saved on a computer that was simultaneously being used by dozens of other people.

Written entirely in 360 assembly language, this version of APL took control of the whole machine. It implemented a complete timesharing operating system in addition to a high-level language.

With the permission of IBM, the 91自拍 is pleased to make available the source code to the 1969-1972 鈥淴M6鈥 version of APL for the System/360 for non-commercial use.

The text file contains 37,567 lines, which includes code, macros, and global definitions. The 90 individual files are separated by 鈥./ ADD鈥 commands. To access this material, you must agree to the terms of the license displayed here, which permits only non-commercial use and does not give you the right to license it to third parties by posting copies elsewhere on the web.

Download APL\360 Source Code

J眉rgen Winkelmann at ETH Z眉rich has done an amazing job of turning this source code into a runnable system. For more information, see .

Creating the APL Programming Language

Iverson鈥檚 book 鈥淎 Programming Language鈥 1 uses a graphical notation that would have been difficult to directly use as a programming language for computers. He considered it an extension of matrix algebra, and used common mathematical typographic conventions like subscripts, superscripts, and distinctions based on the weight or font of characters. Here, for example, is a program for sorting numbers:

To linearize the notation for use as a computer programming language typed at a keyboard, the APL implementers certainly had to give up the use of labeled arrows for control transfers. But one feature that they were able to retain, to some extent, was the use of special symbols for primitive functions, as illustrated in this program that creates Huffman codes:

APL uses symbols that are closer to standard mathematics than programming. For example, the symbol for division is 梅, not /. To support the unconventional symbols, APL\360 used a custom-designed keyboard with special symbols in the upper case.

APL\360 used a custom-designed keyboard

Even so, there were more special characters than could fit on the keyboard, so some were typed by overstriking two characters. For example, the 鈥済rade up鈥 character 鈲, a primitive operator used for sorting, was created by typing 鈭 (shift H), then backspace, then 鈭 (shift M). There was no room left for both upper- and lower-case letters, so APL supported only capital letters.

For printing programs, Iverson and Falkoff got IBM to design a special type ball for their 1050 and 2741 terminals, which used the IBM Selectric typewriter mechanism.

Now programs could be both typed in and printed. Here, for example, is the printed version a program from the APL Language manual 2 that computes the mathematical determinant of a matrix:

A Taste of APL

APL is a concise high-level programming language that differs from most others developed in the 1960s in several respects:

Order of evaluation: Expressions in APL are evaluated right-to-left, and there is no hierarchy of function precedence. For example, typing the expression

2脳4+3

causes the computer to immediately type the resulting value

14

The value is not, as in many other languages that have operator precedence, 11. Of course, parentheses can be used to group a subexpression to change the evaluation order. The general rule is that the right argument of any function is the value of the expression to its right.

Automatic creation of vectors and arrays: A higher-dimensional structure is automatically created by evaluating an expression that returns it, and scalars can be freely mixed. For example,

A 鈫 2 + 1 2 3

creates the vector 鈥1 2 3鈥, add the scalar 2 to it, and creates the variable A to hold the vector whose value is

3 4 5

Variables are never declared; they are created automatically and assume the size and shape of whatever expression is assigned to them.

A plethora of primitives: APL has a rich set of built-in functions (and 鈥渙perators鈥 that are applied to functions to yield different functions) that operate on scalar, vectors, arrays, even higher-dimensional objects, and combinations of them. For example, the expression to sum the numbers in the vector 鈥淎鈥 created above is simply

+/A

where / is the 鈥渞eduction鈥 operator that causes the function to the left to be applied successively to all the elements of the operand to the right. The expression to compute the average of the numbers in A also uses the primitive function 蟻 to determine how many elements there are in A:

(+/A) 梅 蟻A

Here are some tables from the 1970 鈥淎PL\360 User鈥檚 Manual鈥 3 that give a flavor of the power and sophistication of the built-in APL functions and operators.听

APL encourages you to think differently about programming, and to use temporary high-dimensional data structures as intermediate values that are then reduced using the powerful primitives. A famous example is the following short but complete program to compute all the prime numbers up to R.

(词罢鈭奣鈭.脳罢)/罢鈫1鈫撯嵆搁

Here is how this expression is evaluated:

subexpression

meaning

value if R is 6

鈲砇

Generate听a vector of numbers from 1 to R.

听1 2 3 4 5 6

T1鈫

Drop听the first element of the vector and assign the rest to the temporary vector T.

2 3 4 5 6

T.脳罢

Create the multiplication outer product: a table that holds the result of multiplying each element of T by each element of T.

4

6

8

10

12

6

9

12

15

18

8

12

16

20

24

10

15

20

25

30

12

18

24

30

36

T

Use the 鈥渟et membership鈥 operator to find which elements of T are in the table.

0 0 1 0 1

~

Negate the result to identify which elements of T are not in the table.听 These are the integers which do not have听any multiples in the table.

1听1 0 1 0

( )/T

Select听the elements of T which we have identified.听 听 These are all the primes less than R.

2听3 5

Note that there are no loops in this program. The power of APL expressions means that conditional branches and loops are required far less often than in more traditional programming languages.

APL operators can be used in easy ways for all sorts of computations that would usually require loops. For example, an expression that computes the number of elements of the vector X that are greater than 100 is

+/X>100

It works because X>100 returns a bit vector of 0鈥檚 and 1鈥檚 showing which elements of X are greater than 100, and +/ adds up all the bits in that vector.

But conditional execution and loops are, of course, sometimes needed. In the light of later developments in structured programming, APL鈥檚 only primitive for control transfer, the 鈥淕O TO LINE x鈥 statement 鈫, is particularly weak. Here is an example of a function that computes the greatest common divisor of its two arguments. The last statement creates a loop by branching to the beginning. In line 2, conditional transfer of control to line 0 causes the function to exit and return the value last assigned to G.

To learn more about the 1960鈥檚 APL language, see the 鈥淎PL Language鈥 reference manual 2 and Paul Berry鈥檚 1969 鈥淎PL\360 Primer鈥 4.

The language has of course evolved over the years, and more recent versions include control structures such as IF-THEN-ELSE.

How APL was Implemented

The first computer implementation of APL notation was a batch-oriented language interpreter written in FORTRAN in 1965 for the IBM 7090 mainframe computer, by Larry Breed at the IBM Research Center in Yorktown Heights NY and Philip Abrams, then a graduate student at Stanford University.

The first interactive version was written soon after for the 7093 (an experimental 7090 with virtual memory) by Larry Breed and Roger Moore. It ran under the TSM timesharing system and was whimsically called 鈥淚VSYS鈥, which rhymes with 鈥淚BSYS鈥, the name for the standard 7090 operating system. In a 2012 email Breed says,

IVSYS provided login, logout, immediate execution and function definition; it provided workspaces, both active and stored. Implementation of these was rudimentary; mostly we used whatever the TSM project offered us for login/logout/saving files. We had only a few weeks to use the 7093 before it was decommissioned and Roger and I started planning for a standalone system on System/360. In those weeks, Ken and his group saw for the first time what executable APL would be like.

Another implementation of a subset of the language was done in 1967 for the IBM 1130 minicomputer.

The first implementation of APL to get widespread use outside of IBM was for the IBM System/360. Called 鈥淎PL\360鈥, it went into service first within IBM in November 1966. (The notation 鈥淎PL\360鈥, since the backslash was the APL 鈥渆xpansion鈥 operator, also had a hidden meaning: 鈥淎PL expands the 360鈥).

Breed says of the time just before,

This period, early 1966, was the transitional time from Iverson Notation to APL. (Indeed, Adin [Falkoff] came up with 鈥淎PL鈥 in Spring 鈥66.) Refinement and extension of the language and the environment continued for many years. There was next to no code added to make a commercial version, just paperwork.

By August 1968 APL\360 was available to IBM customers as an unsupported (鈥淭ype III鈥) program in IBM鈥檚 鈥淐ontributed Program Library鈥 5. The principal implementers were Larry Breed, Dick Lathwell, and Roger Moore; others who had contributed were Adin Falkoff and Luther Woodrum.

Early APL developers, from left to right: Dick Lathwell, Ken Iverson, Roger Moore, Adin Falkoff, Phil Abrams, Larry Breed. The photo was taken about 1983.

Because of the dynamic nature of APL variables, APL\360 was implemented as an interpreter, not as a compiler that generated machine code. Programs were stored in an internal form called a 鈥渃odestring鈥 that directly corresponded to what the user had typed. The interpreter would then examine the codestring as the program executed, and dynamically allocate and reconfigure variables as expressions were evaluated.

The first versions of APL\360 took control of the entire machine. It was thus a combination operating system, file system, timesharing monitor, command interpreter, and programming language. Given the limited main memory, user workspaces were swapped out to drum or disk as needed. Performance was impressive, which Larry Breed attributes, in his clear and succinct description of the implementation 6, to the ability to tailor the operating system to the requirements of the language.

APL\360 was a conversational language that provided fast response and efficient execution for as many as 50 simultaneous users. Each user had an 鈥渁ctive workspace鈥 that held programs, variables, and the state of suspended program execution. System commands like 鈥)LOAD鈥, 鈥)SAVE鈥, and 鈥)COPY鈥 maintained the user鈥檚 library of stored workspaces. Other system commands controlled language features; for example, with 鈥)ORIGIN鈥 the programmer could control whether vectors and arrays are numbered starting with 0 or 1.

APL was the first introduction to interactive timesharing for many in the generation of programmers who had suffered through batch programming with punched cards.

Applications of APL

Even before it was a computer programming language, Iverson Notation was useful as a language for documenting algorithms for people. The classic example is the formal definition of the instruction-set architecture of the new IBM System/360 computer, which was published in an article in the IBM Systems Journal by Adin Falkoff, Ken Iverson, and Ed Sussenguth in 1965 7.

The description, which is formal rather than verbal, is accomplished by a set of programs, interacting through common variables, used in conjunction with auxiliary tables鈥 Although the formal description is complete and self-contained, text is provided as an aid to initial study.

But the text provided in the paper is much more than that. It is a line-by-line explanation of the formal description, which means that it is also a demonstration and explanation of APL鈥檚 descriptive power.

The notation used the graphical style for control transfers that was in Iverson鈥檚 book. Here, for example, is the description of a memory access operation.

It was the transition of APL from a notation for publication into an interactive computer programming language that made it flourish. When the APL\360 implementation was available, IBM and others stimulated use by producing diverse applications such as these:

  • Starmap: A set of APL functions to calculate and plot the positions of the stars and planets. 8 9 It was written in 1973 by Paul Berry of IBM and John Thorstensen, then an astronomy student at Bryn Mawr college, now Professor of Physics and Astronomy at Dartmouth College. It uses classical solutions to Kepler鈥檚 equations for a particular date and time and a series of rotations of coordinates to show where the planets and the stars would appear in the bowl of the sky.
  • IBGS: Interactive Business Game Simulation: 鈥淎 general computer management simulation involving decision making and planning in the functional areas of production, marketing and finance.鈥
  • Zeros and Integrals in APL: 鈥淯sing both classical methods such as Newton鈥檚 and Muller鈥檚 and recently developed methods such as Jenkins and Traub鈥檚, it finds reals zeros of a real function, real and complex zeros of a polynomial with real of complex coefficients, and complex zeros of a complex function.鈥
  • Graphpak 鈥 Interactive Graphics Package for APL\360: 鈥溾apabilities which range from graphics interface support at the lowest level to several application areas at higher levels鈥 plotting component鈥inear or logarithmic鈥urve-fitting鈥 A descriptive geometry component allows definition, scaling, magnification, translation, rotation, and projected display of three-dimensional objects.鈥
  • Graphs and Histograms in APL: 鈥減roduces curves and barcharts at a typewriter terminal鈥.
  • APL Coordinate Geometry System: 鈥渟olves coordinate geometry problems interactively at a terminal鈥or use by surveyors, civil engineers, urban planners鈥︹
  • APL/PDTS 鈥 Programming Development Tracking System: 鈥溾o assist managers and planners in monitoring performance against plan on programming development projects.鈥
  • MINIPERT: 鈥淎 Critical Path Method (CPM) system for Project Management鈥
  • APL Econometric Planning Language: 鈥淭he practicing economist, business forecaster or teacher is provided with easy-to-use tools for interactive model building and model solving.鈥
  • APL Financial Planning System: 鈥渓ets the financial analyst and planner design reports, specify calculation statements, enter and change data, and obtain printed reports with immediate turnaround.鈥
  • APL Text Editor and Composer: 鈥淭his program is designed to process text interactively at a terminal鈥unctions are included for entering, revising, composing, printing, and storing text鈥or use by secretaries, scientists, engineers, administrators or any others who produce papers, letters, reports or specifications.鈥

Many of these applications emphasized interactivity, which provided a huge productivity increase compared to the batch-job processing more typical at the time. In addition, APL allowed applications to be developed much more quickly. In a 2012 email, Larry Breed noted,

Across all fields, the speed at which APL programs can be written makes it valuable for modeling and prototyping . 鈥 One example: Around 1973, Continental Can needed an inventory system for its 21 manufacturing plants. Their team of FORTRAN programmers had worked for a year, with no success in sight. One STSC salesman, in one weekend, built a usable working model in APL Plus.

The areas in which APL had the greatest penetration were in scientific, actuarial, statistical, and financial applications. For details about the progression of APL in its first 25 years, see the special 1991 issue of the IBM System Journal 10 with 12 papers and one essay on the subject.

APL Praise and Criticism

APL was not originally designed as a programming language. As Iverson said,

The initial motive for developing APL was to provide a tool for writing and teaching. Although APL has been exploited mostly in commercial programming, I continue to believe that its most important use remains to be exploited: as a simple, precise, executable notation for the teaching of a wide range of subjects.

With so many terse and unusual symbols, APL computer programs, like the mathematical notation that inspired it, has a conciseness and elegance many find appealing. APL attracts fanatic adherents. Alan Perlis (the first recipient of the ACM鈥檚 Turing Award, in 1966) was one:

The sweep of the eye across a single sentence can expose an intricate, ingenious and beautiful interplay of operation and control that in other programming languages is observable only in several pages of text. One begins to appreciate the emergence and significance of style. 12

Many find the freedom of expression in APL liberating.

I used to describe [Pascal] as a 鈥榝ascist programming language鈥, because it is dictatorially rigid. 鈥f Pascal is fascist, APL is anarchist. 13

But APL programs are often cryptic and hard to decode. Some have joked that it is a 鈥渨rite-only language鈥 because even the author of a program might have trouble understanding it later. It inspires programming trickery. The challenge of writing an APL 鈥渙ne-liner鈥 to implement a complete complex algorithm is hard to resist. Here, for example, are two different APL one-liners that implement versions of John Conway鈥檚 鈥溾:

life鈫恵鈫1 蠅鈭.鈭3 4=+/,炉1 0 1鈭.鈯柭1 0 1鈭.鈱解妭蠅}

Not for the faint-hearted, clearly. Dutch computer scientist Edsger Dijkstra said,

APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums. 14

But fans of APL would say that cryptic APL coding is a bad programming style that can be an affliction with any language. APL provides a richer palette for expressing algorithms, the argument goes, so you can solve harder problems faster and with less irrelevant syntactic clutter.

Whatever your view, APL and the languages it inspired, such as and , are still an active part of the diverse programming language universe.

A Short Biography of Ken Iverson

Kenneth Eugene Iverson was born on December 17, 1920 on a farm near Camrose, Alberta, Canada. He was educated in rural one-room schools until the end of 9th grade, when he dropped out of school because it was the height of the Depression and there was work to do on the family farm. He later said the only purpose of continuing his schooling would have been to become a schoolteacher, and that was a profession he decidedly did not want. During the long winter months he studied calculus on his own.

He was drafted in 1942, and during his service he took enough correspondence courses to almost complete high school. After the military service he earned a B.A. in both mathematics and physics from Queen鈥檚 University in Kingston Ontario, and then an M.A. in physics from Harvard University. In 1954 he completed a PhD under computer pioneer Howard Aiken, with a thesis titled 鈥淢achine Solutions of Linear Differential Equations: Applications to a Dynamic Economic Model鈥.

After completing his doctorate, Iverson joined the Harvard faculty to teach in Aiken鈥檚 new automatic data processing program. He was there for one year as an Instructor, and for five years as an Assistant Professor. He became increasingly frustrated with the inadequacy of conventional mathematical notation for expressing algorithms, so he began to invent his own.

In 1960 Iverson joined the new IBM Research Center in Yorktown Heights, New York, on the advice of Frederick Brooks, who had been one of his teaching fellows at Harvard and was now at IBM. The two collaborated on the continuing development of the new notation. In 1962 Ken published the now-classic book 鈥淎 Programming Language鈥 1, the title of which gave the name APL to the notation which had up until then been informally called 鈥淚verson鈥檚 notation鈥.

Iverson continued to work on the development of APL throughout his tenure at IBM. In 1980 he left IBM and returned to Canada to work for I.P. Sharp Associates, which had established an APL-based timesharing service.

In 1987 he 鈥渞etired from paid employment鈥 and turned his full attention to the development of a more modern dialect of APL. APL was successfully being used for commercial purposes, but Iverson wanted to develop a new simple executable notation more suitable for teaching, which would be available at low cost. The first implementation of this language, called J, was announced at the APL90 Users鈥 Conference.

Iverson鈥檚 ability to create such languages came from his 鈥渟heer enjoyment of language and words,鈥 recalls his daughter Janet Cramer. 鈥淗e read dictionaries like people read novels.鈥 Iverson thought it was important that language, both English and mathematics, communicate clearly and concisely.

With collaborators that included his son Eric, Iverson continued to work on the development of J, and he continued to publish prolifically. On Saturday, October 16, 2004 he suffered a stroke 鈥搘hile working on a J tutorial 鈥 and died three days later on October 19, at the age of 83.

There are many stories about Ken Iverson. Here are a few:

Ken didn鈥檛 get tenure at Harvard. He did his five years as an assistant professor and the Faculty decided not to put him up for promotion. I asked him what went wrong and he said, 鈥淲ell, the Dean called me in and said, 鈥榯he trouble is, you haven鈥檛 published anything but the one little book鈥欌. The one little book later got [him] the Turing Award. I think that is a comment on the conventional mindset of promotion procedures rather than a comment on Ken; it鈥檚 a comment on academic procedure and on Harvard.

鈥 Fred Brooks, A Celebration of Kenneth Iverson, 2004-11-30

In an early talk Ken was explaining the advantages of tolerant comparison. A member of the audience asked incredulously, 鈥淪urely you don鈥檛 mean that when A=B and B=C, A may not equal C?鈥 Without skipping a beat, Ken replied, 鈥淎ny carpenter knows that!鈥 and went on to the next question.

鈥 Paul Berry

In a social conversation with Ken, I said, 鈥淵ou know, Ken, you are my favorite language designer and Don Knuth is my favorite programmer.鈥 And Ken said immediately, 鈥淲hat鈥檚 wrong with my programming?鈥

鈥 Joey Tuttle, A Celebration of Kenneth Iverson, 2004-11-30

In 1973 or 1974 Ken and I gave a talk at Kodak in Rochester to a group of 40 to 50 programmers who were required to work in PL/I. In the question period a senior staff member said, 鈥淚f I understand what you people are saying, you are suggesting that we should adopt a new way of thinking.鈥 And Ken jumped up out of his chair and said, 鈥淵es! That鈥檚 exactly what I am saying!鈥

鈥 Joey Tuttle, A Celebration of Kenneth Iverson, 2004-11-30

Acknowledgements

Thanks to Michael Karasick, Yvonne Perkins, Steve Selbst, and Ken Edwards of IBM for ending my ten-year odyssey to get permission to release the APL source code. Thanks to Curtis Jones, Larry Breed, Paul Berry, and Roy Sykes for their comments on an early draft of this article.

鈥 Len Shustek

 

Bibliography

  1. K. E. Iverson, A Programming Language, John Wiley and Sons, Inc., 1962.
  2. L. M. Breed and R. H. Lathwell, 鈥淭he Implementation of APL\360,鈥 in ACM Symposium on Experimental Systems for Interactive Applied Mathematics, 1967.
  3. A. D. Falkoff, K. E. Iverson and E. H. Sussenguth, 鈥淎 Formal Description of SYSTEM/360,鈥 IBM Systems Journal, vol. 3, no. 3, pp. 198-261, 1964.
  4. P. C. Berry and J. R. Thorstensen, 鈥淪tarmap,鈥 1978.
  5. P. C. Berry and J. R. Thorstensen, 鈥淪tarmap,鈥 IBM Systems Development Division, 1975.
  6. IBM Systems Journal, vol. 30, no. 4, 1991.
  7. K. E. Iverson, 鈥淎 Personal View of APL,鈥 IBM Systems Journal, vol. 30, no. 4, 1991.
  8. A. J. Perlis, 鈥淚n Praise of APL: A Language for Lyrical Programming,鈥 SIAM News, June 1977.
  9. B. McCormick, 鈥淎 Programming Language,鈥 2000,2002.
  10. E. W. Dijkstra, 鈥淗ow Do We Tell Truths That Might Hurt?鈥,鈥 SIGPLAN Notices, vol. 17, no. 5, May 1982.
  11. A. D. Falkoff and K. E. Iverson, 鈥淭he Design of APL,鈥 IBM Journal of Research and Development, vol. 17, no. 4, 1973.
  12. A. D. Falkoff and K. E. Iversion, 鈥淭he Evolution of APL,鈥 SIGPLAN Notices, vol. 13, no. 8, pp. 45-57, August 1978.
  13. ACM, 鈥淧roceedings of the APL鈥69 Conference on APL,鈥 SUNY Binghamton, NY, 1969.
  14. 鈥溾; a wonderful interview with the original developers of APL.

Historical Source Code Releases

91自拍 The Author

Len Shustek is the founding chairman emeritus of the board of trustees of the 91自拍.

In 1979, he co-founded Nestar Systems, an early developer of networks for personal computers. In 1986, he cofounded Network General, a manufacturer of network analysis tools including The Sniffer鈩. The company became Network Associates after merging with McAfee Associates and PGP. He has taught Computer Science at Carnegie-Mellon and Stanford Universities, and was a founder of the 鈥渁ngel financing鈥 firm VenCraft. He has served on various for-profit and non-profit boards, including the Polytechnic Institute of Brooklyn, which is now the NYU Tandon School of Engineering.

Shustek has a BS and MS in Physics from the Polytechnic Institute, and an MS and PhD in Computer Science from Stanford University.

Join the Discussion

Share