Applied mathematics is largely concerned with the design and analysis of explicit procedures for calculating the exact or approximate values of various functions. Such explicit procedures are called algorithms orprograms. Because an effective notation for the description of programs exhibits considerable syntactic structure, it is called aprogramming language.
This notation was used inside IBM for short research reports on computer systems, such as theBurroughs B5000 and its stack mechanism whenstack machines versusregister machines were being evaluated by IBM for upcoming computers.
Iverson also used his notation in a draft of the chapterA Programming Language, written for a book he was writing withFred Brooks,Automatic Data Processing, which would be published in 1963.[9][10]
In 1979, Iverson received theTuring Award for his work on APL.[11]
As early as 1962, the first attempt to use the notation to describe a complete computer system happened after Falkoff discussed with William C. Carter his work to standardize the instruction set for the machines that later became theIBM System/360 family.
In 1963, Herbert Hellerman, working at the IBM Systems Research Institute, implemented a part of the notation on anIBM 1620 computer, and it was used by students in a special high school course on calculating transcendental functions by series summation. Students tested their code in Hellerman's lab. This implementation of a part of the notation was called Personalized Array Translator (PAT).[12]
In 1963, Falkoff, Iverson, andEdward H. Sussenguth Jr., all working at IBM, used the notation for a formal description of theIBM System/360 series machine architecture and functionality, which resulted in a paper published inIBM Systems Journal in 1964. After this was published, the team turned their attention to an implementation of the notation on a computer system. One of the motivations for this focus of implementation was the interest of John L. Lawrence who had new duties withScience Research Associates, an educational company bought by IBM in 1964. Lawrence asked Iverson and his group to help use the language as a tool to develop and use computers in education.[13]
AfterLawrence M. Breed andPhilip S. Abrams of Stanford University joined the team at IBM Research, they continued their prior work on an implementation programmed inFORTRAN IV for a part of the notation which had been done for theIBM 7090 computer running on theIBSYS operating system. This work was finished in late 1965 and later named IVSYS (for Iverson system). The basis of this implementation was described in detail by Abrams in a Stanford University Technical Report, "An Interpreter for Iverson Notation" in 1966. The academic aspect of this was formally supervised byNiklaus Wirth.[14] Like Hellerman's PAT system earlier, this implementation omitted the APL character set, but used special English reserved words for functions and operators. The system was later adapted for atime-sharing system and, by November 1966, it had been reprogrammed for theIBM System/360 Model 50 computer running in a time-sharing mode and was used internally at IBM.[15]
IBM typeballs and typewheel containing APL Greek charactersA programmer's view of the IBM 2741 keyboard layout with the APL typing element print head inserted
A key development in the ability to use APL effectively, before the wide use ofcathode-ray tube (CRT) terminals, was the development of a specialIBM Selectric typewriter interchangeable typing element with all the special APL characters on it. This was used on paper printing terminal workstations using the Selectric typewriter and typing element mechanism, such as theIBM 1050 andIBM 2741 terminal. Keycaps could be placed over the normal keys to show which APL characters would be entered and typed when that key was struck. For the first time, a programmer could type in and see proper APL characters as used in Iverson's notation and not be forced to use awkward English keyword representations of them. Falkoff and Iverson had the special APL Selectric typing elements, 987 and 988, designed in late 1964, although no APL computer system was available to use them.[16] Iverson cited Falkoff as the inspiration for the idea of using an IBM Selectric typing element for the APL character set.[17]
Many APL symbols, even with the APL characters on the Selectric typing element, still had to be typed in by over-striking two extant element characters. An example is thegrade up character, which had to be made from adelta (shift-H) and aSheffer stroke (shift-M). This was necessary because the APL character set was much larger than the 88 characters allowed on the typing element, even when letters were restricted to upper-case (capitals).
The first APL interactive login and creation of an APL workspace was in 1966 by Larry Breed using an IBM 1050 terminal at the IBM Mohansic Labs nearThomas J. Watson Research Center, the home of APL, inYorktown Heights, New York.[16]
IBM was chiefly responsible for introducing APL to the marketplace. The first publicly available version of APL was released in 1968 for theIBM 1130. IBM providedAPL\1130 for free but without liability or support.[18][19] It would run in as little as 8k 16-bit words of memory, and used a dedicated 1 megabyte hard disk.
APL gained its foothold on mainframe timesharing systems from the late 1960s through the early 1980s, in part because it would support multiple users on lower-specification systems that had nodynamic address translation hardware.[20] Additional improvements in performance for selectedIBM System/370 mainframe systems included theAPL Assist Microcode in which some support for APL execution was included in the processor'sfirmware, as distinct from being implemented entirely by higher-level software. Somewhat later, as suitably performing hardware was finally growing available in the mid- to late-1980s, many users migrated their applications to the personal computer environment.
Early IBM APL interpreters for IBM 360 and IBM 370 hardware implemented their own multi-user management instead of relying on the host services, thus they were their own timesharing systems. First introduced for use at IBM in 1966, theAPL\360[21][22][23] system was a multi-user interpreter. The ability to programmatically communicate with the operating system for information and setting interpreter system variables was done through special privileged "I-beam" functions, using bothmonadic anddyadic operations.[24]
In 1973, IBM releasedAPL.SV, which was a continuation of the same product, but which offeredshared variables as a means to access facilities outside of the APL system, such as operating system files. In the mid-1970s, the IBM mainframe interpreter was even adapted for use on theIBM 5100 desktop computer, which had a small CRT and an APL keyboard, when most other small computers of the time only offeredBASIC. In the 1980s, theVSAPLprogram product enjoyed wide use withConversational Monitor System (CMS),Time Sharing Option (TSO),VSPC,MUSIC/SP, andCICS users.
In 1973–1974, Patrick E. Hagerty directed the implementation of the University of Maryland APL interpreter for the 1100 line of the SperryUNIVAC 1100/2200 series mainframe computers.[25] In 1974, student Alan Stebbens was assigned the task of implementing an internal function.[26] Xerox APL was available from June 1975 for Xerox 560 and Sigma 6, 7, and 9 mainframes runningCP-V and forHoneywell CP-6.[27]
In the 1960s and 1970s, several timesharing firms arose that sold APL services using modified versions of the IBM APL\360[23] interpreter. In North America, the better-known ones wereIP Sharp Associates,Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR), andThe Computer Company (TCC). CompuServe also entered the market in 1978 with an APL Interpreter based on a modified version of Digital Equipment Corp and Carnegie Mellon's, which ran on DEC's KI and KL 36-bit machines. CompuServe's APL was available both to its commercial market and the consumer information service. With the advent first of less expensive mainframes such as theIBM 4300, and later the personal computer, by the mid-1980s, the timesharing industry was all but gone.
Sharp APL was available from IP Sharp Associates, first as a timesharing service in the 1960s, and later as a program product starting around 1979.Sharp APL was an advanced APL implementation with many language extensions, such aspackages (the ability to put one or more objects into a single variable), a file system, nested arrays, andshared variables.
On microcomputers, which became available from the mid-1970s onwards,BASIC became the dominant programming language.[29] Nevertheless, some microcomputers provided APL instead – the first being theIntel 8008-basedMCM/70 which was released in 1974[30][31] and which was primarily used in education.[32] Another machine of this time was theVideoBrain Family Computer, released in 1977, which was supplied with its dialect of APL called APL/S.[33]
Starting in the early 1980s, IBM APL development, under the leadership ofJim Brown, implemented a new version of the APL language that contained as its primary enhancement the concept ofnested arrays, where an array can contain other arrays, and new language features which facilitated integrating nested arrays into program workflow. Ken Iverson, no longer in control of the development of the APL language, left IBM and joinedI. P. Sharp Associates, where one of his major contributions was directing the evolution of Sharp APL to be more in accord with his vision.[36][37][38] APL2 was first released forCMS andTSO in 1984.[39] The APL2 Workstation edition (Windows,OS/2,AIX,Linux, andSolaris) followed later.[40][41]
As other vendors were busy developing APL interpreters for new hardware, notablyUnix-basedmicrocomputers, APL2 was almost always the standard chosen for new APL interpreter developments. Even today, most APL vendors or their users cite APL2 compatibility as a selling point for those products.[42][43] IBM cites its use for problem solving, system design, prototyping, engineering and scientific computations, expert systems,[44] for teaching mathematics and other subjects, visualization and database access.[45]
Various implementations of APL by APLX, Dyalog, et al., include extensions forobject-oriented programming, support for.NET, XML-array conversion primitives, graphing, operating system interfaces, andlambda calculus expressions. Freeware versions include GNU APL for Linux and NARS2000 for Windows (which also runs on Linux under Wine). Both of these are fairly complete versions of APL2 with various language extensions.
APL has been criticized and praised for its choice of a unique character set. In the 1960s and 1970s, few terminal devices or even displays could reproduce the APL character set. The most popular ones employed theIBM Selectric print mechanism used with a special APL type element. One of the early APLline terminals (line-mode operation only,not full screen) was the Texas Instruments TI Model 745 (c. 1977) with the full APL character set[48] which featuredhalf and full duplextelecommunications modes, for interacting with an APLtime-sharing service or remote mainframe to run a remote computer job,remote job entry (RJE).
Over time, with the universal use of high-quality graphic displays, printing devices andUnicode support, the APL character font problem has largely been eliminated. However, entering APL characters requires the use ofinput method editors, keyboard mappings, virtual/on-screen APL symbol sets,[49][50] or easy-reference printed keyboard cards which can frustrate beginners accustomed to other programming languages.[51][52][53] With beginners who have no prior experience with other programming languages, a study involving high school students found that typing and using APL characters did not hinder the students in any measurable way.[54]
In defense of APL, it requires fewer characters to type, and keyboard mappings become memorized over time. Special APL keyboards are also made and in use today, as are freely downloadable fonts for operating systems such as Microsoft Windows.[49] The reported productivity gains assume that one spends enough time working in the language to make it worthwhile to memorize the symbols, their semantics, keyboard mappings, and many idioms for common tasks.[citation needed]
Unlike traditionally structured programming languages, APL code is typically structured as chains ofmonadic ordyadicfunctions, andoperators[55] acting onarrays.[56] APL has many nonstandardprimitives (functions and operators) that are indicated by a single symbol or a combination of a few symbols. All primitives are defined to have the sameprecedence, and always associate to the right. Thus, APL isread or best understood fromright-to-left.
Early APL implementations (c. 1970 or so) had no programming loopcontrol flow structures, such asdo orwhile loops, andif-then-else constructs. Instead, they used array operations, and use ofstructured programming constructs was often unneeded, since an operation could be performed on a full array in one statement. For example, theiota function (ι) can replace for-loopiteration: ιN when applied to a scalar positive integer yields a one-dimensional array (vector), 1 2 3 ... N. Later APL implementations generally include comprehensive control structures, so that data structure and program control flow can be clearly and cleanly separated.
The APL environment is called aworkspace. In a workspace the user can define programs and data, i.e., the data values exist also outside the programs, and the user can also manipulate the data without having to define a program.[57] In the examples below, the APL interpreter first types six spaces before awaiting the user's input. Its own output starts in column one.
n←4567
Assignsvector of values, {4 5 6 7}, to variablen, an array create operation. An equivalent yet more concise APL expression would ben←3+⍳4. Multiple values are stored in arrayn, the operation performedwithout formal loops or control flow language.
n4567
Display the contents ofn, currently an array or vector.
n+4891011
4 is now added to all elements of vectorn, creating a 4-element vector {8 9 10 11}. As above, APL's interpreter displays the result because the expression's value was not assigned to a variable (with a←).
+/n22
APL displays the sum of components of the vectorn, i.e.,22 (= 4 + 5 + 6 + 7) using a very compact notation: read +/ as "plus, over..." and a slight change would be "multiply, over..."
m←+/3+⍳4m22
These operations can be combined into one statement, remembering that APL evaluates expressions right to left: first⍳4 creates an array,[1,2,3,4], then 3 is added to each component, which are summed together and the result stored in variablem, finally displayed. In normal mathematical notation, it is equivalent to:. Recall that mathematical expressions are not read or evaluated from right-to-left.
The user can save the workspace with all values, programs, and execution status.
APL uses a set of non-ASCII symbols, which are an extension of traditional arithmetic and algebraic notation. Having single character names for single instruction, multiple data (SIMD) vector functions is one way that APL enables compact formulation of algorithms for data transformation such as computingConway's Game of Life in one line of code.[58] In nearly all versions of APL, it is theoretically possible to express any computable function in one expression, that is, in one line of code.[citation needed]
Due to the unusualcharacter set, many programmers use specialkeyboards with APL keytops to write APL code.[59] Although there are various ways to write APL code using only ASCII characters,[60] in practice it is almost never done. (This may be thought to support Iverson's thesis aboutnotation as a tool of thought.[61]) Most if not all modern implementations use standard keyboard layouts, with special mappings orinput method editors to access non-ASCII characters. Historically, the APL font has been distinctive, with uppercase italic alphabetic characters and upright numerals and symbols. Most vendors continue to display the APL character set in a custom font.
Advocates of APL[who?] claim that the examples of so-calledwrite-only code (badly written and almost incomprehensible code) are almost invariably examples of poor programming practice or novice mistakes, which can occur in any language. Advocates also claim that they are far more productive with APL than with more conventional computer languages, and that working software can be implemented in far less time and with far fewer programmers than using other technology.[citation needed]
They also may claim that because it is compact and terse, APL lends itself well to larger-scale software development and complexity, because the number of lines of code can be reduced greatly. Many APL advocates and practitioners also view standard programming languages such asCOBOL andJava as being comparatively tedious. APL is often found where time-to-market is important, such as with trading systems.[62][63][64][65]
APL makes a clear distinction betweenfunctions andoperators.[55][66] Functions take arrays (variables or constants or expressions) as arguments, and return arrays as results. Operators (similar tohigher-order functions) take functions or arrays as arguments, and derive related functions. For example, thesum function is derived by applying thereduction operator to theaddition function. Applying the same reduction operator to themaximum function (which returns the larger of two numbers) derives a function which returns the largest of a group (vector) of numbers. In the J language, Iverson substituted the termsverb forfunction andadverb orconjunction foroperator.
APL also identifies those features built into the language, and represented by a symbol, or a fixed combination of symbols, asprimitives. Most primitives are either functions or operators. Coding APL is largely a process of writing non-primitive functions and (in some versions of APL) operators. However a few primitives are considered to be neither functions nor operators, most noticeably assignment.
Some words used in APL literature have meanings that differ from those in both mathematics and the generality of computer science.
Terminology of APL operators
Term
Description
function
operation or mapping that takes zero, one (right) or two (left & right) arguments which may be scalars, arrays, or more complicated structures, and may return a similarly complex result. A function may be:
Primitive: built-in and represented by a single glyph;[67]
Defined: as a named and ordered collection of program statements;[67]
Derived: as a combination of an operator with its arguments.[67]
array
data valued object of zero or moreorthogonal dimensions inrow-major order in which each item is a primitive scalar datum or another array.[68]
niladic
not taking or requiring any arguments, nullary[69]
monadic
requiring only one argument; on the right for a function, on the left for an operator, unary[69]
dyadic
requiring both a left and a right argument, binary[69]
ambivalent or monadic
capable of use in a monadic or dyadic context, permitting its left argument to be elided[definition needed][67]
operator
operation or mapping that takes one (left) or two (left & right) function or array valued arguments (operands) and derives a function. An operator may be:
Primitive: built-in and represented by a single glyph;[67]
Defined: as a named and ordered collection of program statements.[67]
APL has explicit representations of functions, operators, and syntax, thus providing a basis for the clear and explicit statement of extended facilities in the language, and tools to experiment on them.[70]
A design theme in APL is to define default actions in some cases that would produce syntax errors in most other programming languages.
The 'Hello, world' string constant above displays, because display is the default action on any expression for which no action is specified explicitly (e.g. assignment, function parameter).
Another example of this theme is that exponentiation in APL is written as2*3, which indicates raising 2 to the power 3 (this would be written as2^3 or2**3 in some languages, or relegated to a function call such aspow(2, 3); in others). Many languages use* to signify multiplication, as in2*3, but APL chooses to use2×3. However, if no base is specified (as with the statement*3 in APL, or^3 in other languages), most programming languages one would see this as a syntax error. APL, however, assumes the missing base to be the natural logarithm constante, and interprets*3 as2.71828*3.
Suppose thatX is an array of numbers. Then(+/X)÷⍴X gives its average. Readingright-to-left,⍴X gives the number of elements in X, and since÷ is a dyadic operator, the term to its left is required as well. It is surrounded by parentheses since otherwise X would be taken (so that the summation would be ofX÷⍴X—each element of X divided by the number of elements in X), and+/X gives the sum of the elements of X. Building on this, the following expression computesstandard deviation:
((+/((X-(+/X)÷⍴X)*2))÷⍴X)*0.5
Naturally, one would define this expression as a function for repeated use rather than rewriting it each time. Further, since assignment is an operator, it can appear within an expression, so the following would place suitable values into T, AV and SD:
This following immediate-mode expression generates a typical set ofPick 6lottery numbers: sixpseudo-randomintegers ranging from 1 to 40,guaranteed non-repeating, and displays them sorted in ascending order:
x[⍋x←6?40]
The above does a lot, concisely, although it may seem complex to a newAPLer. It combines the following APLfunctions (also calledprimitives[71] andglyphs[72]):
The first to be executed (APL executes from rightmost to leftmost) is dyadic function? (nameddeal when dyadic) that returns avector consisting of a select number (left argument: 6 in this case) of random integers ranging from 1 to a specified maximum (right argument: 40 in this case), which, if said maximum ≥ vector length, is guaranteed to be non-repeating; thus, generate/create 6 random integers ranging from 1 to 40.[73]
This vector is thenassigned (←) to the variablex, because it is needed later.
This vector is thensorted in ascending order by a monadic⍋ function, which has as its right argument everything to the right of it up to the next unbalancedclose-bracket or close-parenthesis. The result of⍋ is the indices that will put its argument into ascending order.
Then the output of⍋ is used to index the variablex, which we saved earlier for this purpose, thereby selecting its items inascending sequence.
Since there is no function to the left of the left-most x to tell APL what to do with the result, it simply outputs it to the display (on a single line, separated by spaces) without needing any explicit instruction to do that.
? also has a monadic equivalent calledroll, which simply returns one random integer between 1 and its sole operand [to the right of it], inclusive. Thus, arole-playing game program might use the expression?20 to roll a twenty-sided die.
Build a vector the same length asR with1 in each place where the corresponding number inR is in the outer product matrix (∈,set inclusion orelement of orEpsilon operator), i.e.,0 0 1 0 1
Logically negate (not) values in the vector (change zeros to ones and ones to zeros) (∼, logicalnot orTilde operator), i.e.,1 1 0 1 0
Select the items inR for which the corresponding element is1 (/replicate operator), i.e.,2 3 5
(This assumes the APL origin is 1, i.e., indices start with 1. APL can be set to use 0 as the origin, so thatι6 is0 1 2 3 4 5, which is convenient for some calculations.)
The following function "life", written in Dyalog APL,[74][75] takes a Boolean matrix and calculates the new generation according toConway's Game of Life. It demonstrates the power of APL to implement a complex algorithm in very little code, but understanding it requires some advanced knowledge of APL (as the same program would in many languages).
In the following example, also Dyalog, the first line assigns some HTML code to a variabletxt and then uses an APL expression to remove all the HTML tags:
txt←'<html><body><p>This is <em>emphasized</em> text.</p></body></html>'{⍵/⍨~{⍵∨≠\⍵}⍵∊'<>'}txtThisisemphasizedtext.
APL derives its name from the initials of Iverson's bookA Programming Language,[3] even though the book describesIverson's mathematical notation, rather than the implemented programming language described in this article. The name is used only for actual implementations, starting withAPL\360.
Adin Falkoff coined the name in 1966 during the implementation of APL\360 atIBM:
As I walked by the office the three students shared, I could hear sounds of an argument going on. I poked my head in the door, and Eric asked me, "Isn't it true that everyone knows the notation we're using is called APL?" I was sorry to have to disappoint him by confessing that I had never heard it called that. Where had he got the idea it was well known? And who had decided to call it that? In fact, why did it have to be called anything? Quite a while later I heard how it was named. When the implementation effort started in June of 1966, the documentation effort started, too. I suppose when they had to write about "it", Falkoff and Iverson realized that they would have to give "it" a name. There were probably many suggestions made at the time, but I have heard of only two. A group in SRA in Chicago which was developing instructional materials using the notation was in favor of the name "Mathlab". This did not catch on. Another suggestion was to call it "Iverson's Better Math" and then let people coin the appropriate acronym. This was deemed facetious.
Then one day Adin Falkoff walked into Ken's office and wrote "A Programming Language" on the board, and underneath it the acronym "APL". Thus it was born. It was just a week or so after this that Eric Iverson asked me his question, at a time when the name hadn't yet found its way the thirteen miles up the Taconic Parkway from IBM Research to IBM Mohansic.
British APL Association (BAPLA) conference laptop bag
There has always been cooperation between APL vendors, and joint conferences were held on a regular basis from 1969 until 2010.[78] At such conferences, APLmerchandise was often handed out, featuring APL motifs or collection of vendor logos. Common were apples (as a pun on the similarity in pronunciation ofapple andAPL) and the code snippet⍺*⎕ which are the symbols produced bythe classic APL keyboard layout when holding the APLmodifier key and typing "APL".
Despite all these community efforts, no universal vendor-agnostic logo for the programming language emerged. As popular programming languages increasingly have established recognisable logos,Fortran getting one in 2020,[79] British APL Association launched a campaign in the second half of 2021, to establish such a logo for APL, and after a community election and multiple rounds of feedback, a logo was chosen in May 2022.[80]
APL is well suited toimage manipulation andcomputer animation, where graphic transformations can be encoded as matrix multiplications. One of the first commercial computer graphics houses,Digital Effects, produced an APL graphics product namedVisions, which was used to create television commercials and animation for the 1982 filmTron.[88] Latterly, theStormwindboating simulator uses APL to implement its core logic, its interfacing to the rendering pipeline middleware and a major part of itsphysics engine.[89]
The first implementation of APL using recognizable APL symbols was APL\360 which ran on theIBM System/360, and was completed in November 1966[1] though at that time remained in use only within IBM.[39] In 1973 its implementors,Larry Breed,Dick Lathwell andRoger Moore, were awarded theGrace Murray Hopper Award from theAssociation for Computing Machinery (ACM). It was given "for their work in the design and implementation of APL\360, setting new standards in simplicity, efficiency, reliability and response time for interactive systems."[94][95][96]
In 1975, theIBM 5100 microcomputer offered APL\360[97] as one of two built-in ROM-based interpreted languages for the computer, complete with a keyboard and display that supported all the special symbols used in the language.[98]
Significant developments to APL\360 included CMS/APL, which made use of thevirtual storage capabilities ofCMS and APLSV, which introducedshared variables, system variables and system functions. It was subsequently ported to theIBM System/370 andVSPC platforms until its final release in 1983, after which it was replaced by APL2.[39]
In 1968, APL\1130 became the first publicly available APL system, created by IBM for theIBM 1130.[99] It became the most popularIBM Type-III Library software that IBM released.[100]
APL*Plus and Sharp APL are versions of APL\360 with added business-oriented extensions such as data formatting and facilities to store APL arrays in external files. They were jointly developed by two companies, employing various members of the original IBM APL\360 development team.[101]
The two companies wereI. P. Sharp Associates (IPSA), an APL\360 services company formed in 1964 by Ian Sharp, Roger Moore and others, andSTSC, a time-sharing and consulting service company formed in 1969 by Lawrence Breed and others. Together the two developed APL*Plus and thereafter continued to work together but develop APL separately as APL*Plus and Sharp APL. STSC ported APL*Plus to many platforms with versions being made for the VAX 11,[102] PC and UNIX, whereas IPSA took a different approach to the arrival of thepersonal computer and made Sharp APL available on this platform using additionalPC-XT/360 hardware. In 1993,Soliton Incorporated was formed to support Sharp APL and it developed Sharp APL into SAX (Sharp APL for Unix). As of 2018[update], APL*Plus continues as APL2000 APL+Win.
APL2 was a significant re-implementation of APL by IBM which was developed from 1971 and first released in 1984. It provides many additions to the language, of which the most notable is nested (non-rectangular) array support.[39] The entire APL2 Products and Services Team was awarded the Iverson Award in 2007.[103]
In 2021, IBM sold APL2 to Log-On Software, who develop and sell the product asLog-On APL2.[104]
In 1972, APLGOL was released as an experimental version of APL that added structured programming language constructs to the language framework. New statements were added for interstatement control, conditional statement execution, and statement structuring, as well as statements to clarify the intent of the algorithm.[105] It was implemented for Hewlett-Packard in 1977.[106]
In 1995, two of the development team –John Scholes and Peter Donnelly – were awarded the Iverson Award for their work on the interpreter.[103] Gitte Christensen and Morten Kromberg were joint recipients of the Iverson Award in 2016.[113]
NARS2000 is an open-source APL interpreter written by Bob Smith, a prominent APL developer and implementor fromSTSC in the 1970s and 1980s. NARS2000 contains advanced features and new datatypes and runs natively onMicrosoft Windows, and other platforms underWine. It is named after a development tool from the 1980s, NARS (Nested Arrays Research System).[114]
APLX is across-platformdialect of APL, based on APL2 and with several extensions, which was first released byBritish company MicroAPL in 2002. Although no longer in development or on commercial sale it is now available free of charge from Dyalog.[115]
York APL[116] was developed at theYork University, Ontario around 1968, running on IBM 360 mainframes. One notable difference between it and APL\360 was that it defined the "shape" (ρ) of a scalar as 1 whereas APL\360 defined it as the more mathematically correct 0 — this made it easier to write functions that acted the same with scalars and vectors.
GNU APL is a free implementation of Extended APL as specified in ISO/IEC 13751:2001 and is thus an implementation of APL2. It runs onLinux, macOS, several BSD dialects, and on Windows (either usingCygwin for full support of all its system functions or as a native 64-bit Windows binary with some of its system functions missing). GNU APL usesUnicode internally and can be scripted. It was written by Jürgen Sauermann.[117]
Richard Stallman, founder of theGNU Project, was an early adopter of APL, using it to write a text editor as a high school student in the summer of 1969.[118]
Most APL interpreters supportidiom recognition[130] and evaluate common idioms as single operations.[131][132] For example, by evaluating the idiomBV/⍳⍴A as a single operation (whereBV is a Boolean vector andA is an array), the creation of two intermediate arrays is avoided.[133]
Weak typing in APL means that a name may reference an array (of any datatype), a function or an operator. In general, the interpreter cannot know in advance which form it will be and must therefore perform analysis, syntax checking etc. at run-time.[134] However, in certain circumstances, it is possible to deduce in advance what type a name is expected to reference and then generatebytecode which can be executed with reduced run-time overhead. This bytecode can also be optimised using compilation techniques such asconstant folding orcommon subexpression elimination.[135] The interpreter will execute the bytecode when present and when any assumptions which have been made are met. Dyalog APL includes support for optimised bytecode.[135]
Compilation of APL has been the subject of research and experiment since the language first became available; the first compiler is considered to be the Burroughs APL-700[136] which was released around 1971.[137] In order to be able to compile APL, language limitations have to be imposed.[136][138] APEX is a research APL compiler which was written byRobert Bernecky and is available under theGNU General Public License.[139]
TheSTSC APL Compiler is a hybrid of a bytecode optimiser and a compiler – it enables compilation of functions tomachine code provided that its sub-functions and globals aredeclared, but the interpreter is still used as aruntime library and to execute functions which do not meet the compilation requirements.[140]
^Abrams, Philip S.,An interpreter for "Iverson notation", Technical Report: CS-TR-66-47, Department of Computer Science, Stanford University, August 1966;
^Haigh, Thomas (2005). "Biographies: Kenneth E. Iverson".IEEE Annals of the History of Computing.doi:10.1109/MAHC.2005.4.
^abBreed, Larry,"The First APL Terminal Session",APL Quote Quad, Association for Computing Machinery, Volume 22, Number 1, September 1991, p. 2–4.
^19, 2009 Adin Falkoff – Computer History Museum. "Iverson credited him for choosing the name APL and the introduction of the IBM golf-ball typewriter with the replacement typehead, which provided the famous character set to represent programs."
^Falkoff, Adin; Iverson, Kenneth E.,"APL\360 Users Guide"Archived 2012-02-29 at theWayback Machine, IBM Research, Thomas J. Watson Research Center, Yorktown Heights, NY, August 1968.
^abPakin, Sandra (1968).APL\360 Reference Manual. Science Research Associates, Inc.ISBN978-0-574-16135-2.
^Falkoff, Adin D.; Iverson, Kenneth E.,The Design of APL,IBM Journal of Research and Development, Volume 17, Number 4, July 1973. "These environmental defined functions were based on the use of still another class of functions—called "I-beams" because of the shape of the symbol used for them—which provide a more general facility for communication between APL programs and the less abstract parts of the system. The I-beam functions were first introduced by the system programmers to allow them to execute System/360 instructions from within APL programs, and thus use APL as a direct aid in their programming activity. The obvious convenience of functions of this kind, which appeared to be part of the language, led to the introduction of the monadic I-beam function for direct use by anyone. Various arguments to this function yielded information about the environment such as available space and time of day."
^Robertson, Graeme."A Personal View of APL2010".archive.vector.org.uk. Vector – Journal of the British APL Association. Archived fromthe original on April 2, 2015. RetrievedJanuary 10, 2015.
^Rodriguez, P.; Rojas, J.; Alfonseca, M.; Burgos, J. I. (1989). "An Expert System in Chemical Synthesis written in APL2/PC".ACM SIGAPL APL Quote Quad.19 (4):299–303.doi:10.1145/75144.75185.S2CID16876053.
^Brown, James A.; Hawks, Brent; Trimble, Ray (1993). "Extending the APL character set".ACM SIGAPL APL Quote Quad.24 (1):41–46.doi:10.1145/166198.166203.
^Kromberg, Morten."Unicode Support for APL".archive.vector.org.uk. Vector, Journal of the British APL Association. Archived fromthe original on January 20, 2015. RetrievedJanuary 8, 2015.
^Janko, Wolfgang (May 1987). "Investigation into the efficiency of using APL for the programming of an inference machine".ACM SIGAPL APL Quote Quad.17 (4):450–456.doi:10.1145/384282.28372.
^ab"2017 Annual Report"(PDF). SimCorp. February 1, 2018.Archived(PDF) from the original on 2022-10-09. RetrievedApril 3, 2018.Sofia is a front-to-back investment management platform like SimCorp Dimension. ... Sofia is based on the APL coding language just like some parts of SimCorp Dimension.
^Magnenat-Thalmann, Nadia; Thalmann, Daniel (1985).Computer Animation Theory and Practice.Springer-Verlag. p. 38.ISBN9784431684336. RetrievedApril 3, 2018.Digital Effects is another production house that worked on Tron. They used a laser-scanning system to digitize, store and reproduce images. Judson Rosebush, president of Digital Effects, is the primary designer of APL VISION and FORTRAN VISION, two computer animation packages that are currently used.
^Gutsell, Sam (October 17, 2017)."Stormwind Simulator at Dyalog '16".www.optima-systems.co.uk. Optima Systems. RetrievedApril 3, 2018.Stormwind is a [3D boating simulator] that has gained a huge amount of interest in the APL community.
^"Vi idag" [We today].profdoccare.se (in Swedish). Archived fromthe original on April 7, 2018. RetrievedApril 3, 2018.Through the choice of APL as a technical platform, it is relatively easy to quickly build a solution that can be called a executable prototype (translated from the original)
^"What is APL?".www.sigapl.org. SIGAPL. RetrievedJanuary 20, 2015.
^Ju, Dz-Ching; Ching, Wai-Mee (1991). "Exploitation of APL data parallelism on a shared-memory MIMD machine".Proceedings of the third ACM SIGPLAN symposium on Principles and practice of parallel programming. Vol. 26. pp. 61–72.doi:10.1145/109625.109633.ISBN0-89791-390-6.S2CID8584353.
^Blelloch, Guy E.; Sabot, Gary W. (1990). "Compiling Collection-Oriented Languages onto Massively Parallel Computers".Journal of Parallel and Distributed Computing.8 (2):119–134.CiteSeerX10.1.1.51.5088.doi:10.1016/0743-7315(90)90087-6.Collection oriented languages include APL, APL2
^Jendrsczok, Johannes; Hoffmann, Rolf; Ediger, Patrick; Keller, Jörg."Implementing APL-like data parallel functions on a GCA machine"(PDF).www.fernuni-hagen.de. pp. 1–6. Archived fromthe original(PDF) on January 22, 2015. RetrievedJanuary 22, 2015.GCA – Global Cellular Automation. Inherently massively parallel. 'APL has been chosen because of the ability to express matrix and vector' structures.
^Brenner, Norman (1984). "VLSI circuit design using APL with fortran subroutines".Proceedings of the international conference on APL - APL '84. Vol. 14. pp. 77–79.doi:10.1145/800058.801079.ISBN0-89791-137-7.S2CID30863491.APL for interactiveness and ease of coding •Brenner, Norman (1984). "VLSI circuit design using APL with fortran subroutines".Proceedings of the international conference on APL – APL '84. ACM SIGAPL.ISBN978-0897911375.
^Gamble, D.J.; Hobson, R.F. (1989). "Towards a graphics/Procedural environment for constructing VLSI module generators".Conference Proceeding IEEE Pacific Rim Conference on Communications, Computers and Signal Processing. pp. 606–611.doi:10.1109/PACRIM.1989.48437.S2CID7921438.VLSI module generators are described. APL and C, as examples of interpreted and compiled languages, can be interfaced to an advanced graphics display.
^Strawn, George O. (March 1977). "Does APL really need run-time parsing?".Software: Practice and Experience.7 (2):193–200.doi:10.1002/spe.4380070207.S2CID1463012.
^ab"Compiler User Guide"(PDF).www.dyalog.com. Dyalog Ltd.Archived(PDF) from the original on 2022-10-09. RetrievedMay 7, 2018.
^abDriscoll, Graham C. Jr.; Orth, Donald L. (November 1986). "Compiling APL: The Yorktown APL Translator".IBM Journal of Research and Development.30 (6):583–593.doi:10.1147/rd.306.0583.S2CID2299699.
^Wai-Mee, Ching (November 1986). "Program Analysis and Code Generation in an APL/370 Compiler".IBM Journal of Research and Development.30 (6):594–602.doi:10.1147/rd.306.0594.S2CID17306407.
Wexelblat, Richard L, ed. (1981). "XIV".History of Programming Languages: Proceedings of the History of Programming Languages Conference, Los Angeles, Calif., June 1-3, 1978. Academic Press.ISBN978-0127450407.
Banon, Gerald Jean Francis (1989).Bases da Computacao Grafica. Rio de Janeiro: Campus. p. 141.
LePage, Wilbur R. (1978).Applied A.P.L. Programming. Prentice Hall.