Today, it is a widely accepted thesis amongst historians and computer scientists that the modern notion of computer programs has its roots in the work of John von Neumann. This is symptomatic of a general tendency amongst academic computer scientists to search for the foundations of their field in logic and mathematics and, accordingly, also its historical roots. This is a distorted view of what happened: at best, the modern computer was driven by concerns of applied mathematics and developed by a collective of people (mathematicians, engineers, physicists, (human) computers, and so forth). We will not repeat why, in computing, history is reshaped in function of disciplinary identity.2,15 Instead, we will revisit the origins of the word "program" and argue for the need of a deeper historical understanding, not just for the sake of academic history, but for the sake of the field itself.
The notion of "program" is a fundamental one. In the flux of historical time and space, "program" underwent significant changes and has different connotations today when compared to the 1950s. Indeed, today, other words are often used instead: "software," "apps," or "algorithms" (as in "ethics of algorithms"). Moreover, "program" means different things to different people: a logically minded computer scientist will have a different understanding than a software engineer. Nonetheless, as soon as one starts to speak about the historical origins of the term, this plurality of meanings disappears to be replaced by only one, namely, the "stored program." This is anchored in another historical narrative: the modern computer originates in the "stored-program" computer. While this latter notion has been historically scrutinized,7 the origins of "program" have hardly been looked at independently of that notion.a So what is the classical story here?
In the mid-1940s, a group of engineers of the Moore School of Electrical Engineering, led by John Mauchly and Presper J. Eckert, designed and constructed ENIAC, a large-scale and high-speed machine that would become one of the first computers. Originally, it was a parallel and electronic machine with loops and conditionals, and could, essentially, compute any problem provided that its memory would have been unlimited.b However, unlike some other large-scale calculators of the time, like the relay-based ASCC/Harvard Mark I or the Bell Lab machines, problems were not set up via coded instructions on punched cards or tape but were directly wired on the machine. In a sense, one had to reconfigure the whole machine every time it had to compute another problem. By consequence, setting up a problem was a time-consuming and error-prone process. In order to deal with such efficiency issues, ENIAC was converted to emulate a "stored-pro-gram" machine. However, unlike ED-SAC for instance, instructions could not be modified since programs were executed from preset switches (or, alternatively, punched cards).
It is here that von Neumann enters the story. A few months after he got involved with ENIAC, in the spring of 1945, he wrote the famous "The first draft of a report on the EDVAC," which is considered the blueprint of the modern computer. It is then often assumed that the first "modern" programs must be those that ran on EDVAC-like machines, that is, machines like the converted ENIAC.5,7,8 This goes hand-in-hand with the idea that the roots of our modern conception of program should be sought with von Neumann.
But of course, just as "code" was already in use before it was introduced in the computing context (for example, Morse code), "program" (or in British spelling "programme")c also was an already existing word. No new term was invented at the time. It was used as a generic term to refer to a planned series of future events: an advance notice, an itinerary, something that is written before some activity happens, orders it and, so, pre-(in)scribes (programma) it. Typical examples are: a theater program, a training program, a research program, or a production plan.6,7 This notion was then picked up in the context of radio broadcasting to refer to radio programs. Presupposedly, Mauchly transposed this common term to the more specific engineering discourse of ENIAC and it was only with the introduction of "stored-programs" that the term really gained its current meaning.5,7,8 Von Neumann himself, however, hardly really used it—he preferred the terminology of preparing, planning, setting up, and coding a problem.
We have found that "program" was already part of an extensive engineering discourse, going beyond that mentioned in the existing literature. First of all, in the context of radio engineering, the growing complexity of the broadcasting network increased the need for automation. This concerned in particular the scheduling of radio programs on different networks for different stations at different times and which had to be handled at so-called "switching points." This resulted in a discourse in which "program" steadily transposed from radio programs to the technology itself and so one sees the emergence of terms like "program circuits," "program trunks," "program switching," "program line," "program loop," "program selection," and so forth.d These are exactly the kind of terms appearing in the ENIAC context.
More importantly, we have found there is yet another engineering discourse originating in so-called "programme clocks" or "program clocks," a device first developed in the 19th century and used to "furnish a convenient and practical clock, that may be set to strike according to any required programme."e This was very handy, for instance, for a factory work floor, railway stations, or a school. In other words, they automated time schedules and production plans. From the first clocks onward, one sees the steady development of a more general technology of "program devices" or "program machines" used in a variety of applications: a paper-cutting machine, a washing machine, a calculator, and so forth.f Here "program" comes to stand for the automatic carrying out of a sequence of operations or as an automated scheduler.
This technology came to be used also for calculating machines in the late 1930s and early 1940s, for instance, in the context of the IBM ASCC/Harvard Mark I machine. This electromechanical large-scale calculator is mostly associated with Howard Aiken, a Harvard physicist, but was designed and built by IBM engineers. The operations of that machine were controlled by the "control tape" where the sequences of operations were coded with punched holes. But while "control tape" was the standard term used once the machine was put into operation at Harvard, the original IBM patents show traces of another terminology where the control tape was also called a "program tape" and where the sequences of operations, at some points, were called "programs" instead of "sequences" (see the figure here). This terminology is due to the IBM engineers involved with the design of the machine, notably, James W. Bryce and Claire D. Lake. In fact, Bryce already had a patent in which a "program device" was introduced (U.S. patent number 2,244,241) that was capable of automatic transfer of control and other operations. Also for the ENIAC, Mauchly's original short proposal for an "electronic computer" refers to a "program device."12 It is from there that the term in ENIAC developed.
Some have claimed that earlier uses of "program" in relation to ENIAC were much more restricted and referred only to specific programming circuitry in a (control) unit.8 This does not take into account this more general discourse which, by that time, had become common among engineers working on automatic control, both within and outside the context of large-scale calculators. This explains why, in ENIAC, "program" had different semantic extensions and referred to individual (control) units (as in "program switches"); smaller pieces of an entire program (as in "program sequences"); or the complete schedule that organizes program sequences (as in a "complete program [for which] it is necessary to put [the] elements together and to assign equipment in detail").1 "Program" then refers to how automatic control, locally or globally, is organized. The semantics of the "program device" discourse is still at play here, but generalizes from the sequencing of operations to include also the scheduling of sequences of operations.
This is still evident in Hartree's later definition (1949) of "programming" where this notion is used with reference to any "large automatic digital machine": "programming is the process of drawing up a schedule of the sequence of individual operations required to carry out the calculation."10 The main difference between programming ENIAC before and after its conversion to an EDVAC-like machine is that in the second case the set-up is automated through "a 100-way switch"10 where each position of the switch corresponded to a different "computing sequence."g
To put it differently, the general understanding of "program" was first grafted onto the existing discourse on program devices, not on specific techniques for implementing them. Whether a program uses coded instructions stored externally on cards or tape, or, internally, on flipflops or other circuits, or whether a program is set up by wiring plugboards or by flipping switches is, from that perspective, non-essential for the meaning of "program." The "stored program" that will become commonplace later, is but one specific technique for materializing a program, that of storing a coded program internally in the computer. This, in a sense, should not be surprising: While "programs" were very much determined and dependent on the computational technology on which they are ultimately implemented and ran, that need not mean that understandings of "program" should be reduced to a specific technology. If we would have done that, we would have never had, say, concurrent programs, virtual machines or Docker containers.
The 2012 Turing centenary made clear the academic computing field tends to construct a storyline where the presumed theoretical foundations of the field coincide with its historical foundations (the "first" computers and the "first" programs). This strengthens a computing discipline where one often cares more about formalism than about actual programming13 and contributes to a growing "communication gap" between different communities. This affects not just research and education policies, but also how we understand this field we call computing.3
As we showed, "program" did not coincide with the "stored-program" concept, rather it naturally evolved from an engineering context. Program devices for automatic control of operations were developed first for scheduling activities or communications, but were then applied to computing machines as well. In this context, a transfer of meaning happened, preparing the ground for our modern notions of program. Should we derive from this that, actually, computing should be understood first of all as an engineering discipline? No. This would miss out on the subsequent evolution of the term, when it met up again with practices of coding, of planning (manual or mechanical) calculations or of industrial process planning. If one confines oneself to one perspective only, one lacks a basic understanding: computing is not mathematics, it is not engineering, it is not logic, it is not science, it is not process control but a field on its own and one which should, perhaps, not be reduced to the confines of disciplinary thinking (which is, itself, a construction of the 19th century). Abiding by such confinement may lead to errors and failed opportunities, as Hennessy and Patterson pointed out11 with respect to software design and hardware architecture.
"[W]hen experience is not retained [… ] infancy is perpetual. Those who cannot remember the past are condemned to repeat it"14 History can and has been used to reinforce confines but it can also be used against them. We must not see our historical legacy as a burden, but as the natural environment to think about the future.
4. Eckert, P.J. et al. Description of the ENIAC and comments on electronic digital computing machines, Contract W 670 ORD 4926, Moore School of Electrical Engineering, University of Pennsylvania, November 30, 1945.
a. It should be noted that recently the notion of programmability was investigated for the Colossus.9
b. For instance, in Eckert et al.:4 "[t]here is no essential or fundamental restriction imposed by the ENIAC design on the character or complication of the problems which it can do."
c. Note that in contemporary American spelling, "program" refers both to computer programs and, say, radio programs. In the British spelling, an explicit distinction was made between "programs" to refer to computer programs, and "programme" as used in the context of radio or theater programs.
g. Of course, subsequent programming practices would impact later definitions. So, for instance, in the EDSAC, an EDVAC-like and so serial machine with a symbolic assembly system, the definition of programs shortened to: "A sequence of orders for performing some particular calculation."16 In other contexts, where flowcharting played an important role, emphasis was more on the planning aspects of programming, partially referencing back to earlier practices of human computation (see the 1954 ACM Glossary by Grace Hopper).
This research was supported by the ANR PROGRAMme project ANR-17-CE38-0003-01.
The Digital Library is published by the Association for Computing Machinery. Copyright © 2021 ACM, Inc.
No entries found