John Von Neumann was an Hungarian-born American mathematician that ...
If you are interested in learning more about Ada Lovelace’s story i...
#### Complex Number Calculator The Complex Number Calculator desig...
### Delay lines Delay lines are a form of computer memory. Delay l...
Here is a nicely formatted version of the [“First Draft of a Report...
The ENIAC was about 300 times faster than the Mark 1 at addition. A...
The sorting algorithm described by von Neumann would eventually be ...
Von Neumann's First Computer Program
DONALD E. KNUTH
Stanford University,* Stanford, California
An analysis of the two earliest sets of instruction codes planned for stored
program computers, and the earliest extant program for such a computer, gives
insight into the thoughts of John yon Neumann, the man who designed the
instruction sets and wrote the program, and shows how several important aspects
of computing have evolved. The paper is based on previously unpubhshed
documents from the files of Herman H. Goldstine.
Key words and phrases:
electronic computers, computer history, stored program
computers, machine organization and architecture, sorting, latency time, ENIAC,
EDVAC, order code, programming techniques
CR categories:
1.2, 6.0
INTRODUCTION
A handwritten document now in the posses-
sion of Dr. Herman H. Goldstine contains
what is probably the earliest extant program
for a stored program digital computer. Its
author, the remarkably talented mathema-
tician John von Neumann (1903-1957), was
in the process of refining the stored program
concept as he was writing this code; so his
program represents a significant step in the
evolution of computer organization as well
as of programming techniques. In this paper
we will therefore investigate the contents of
yon Neumann's manuscript in some detail,
attempting to relate its ideas to other de-
velopments in the early history of high
speed computing.
The program we will study is not what we
might expect an "ordinary" mathematician
to have written; it does not solve a partial
differential equation! Instead, it deals with
what was considered at that time to be the
principal example of a nonnumeric applica-
tion for computers, namely, the problem of
sorting data into nondecreasing order.
Von Neumann chose this application for
good reason. He had sketched out an order
* Computer Science Department
code for a stored program computer, with
numerical applications uppermost in his
mind; there was no question that his pro-
posed device could do the requisite arith-
metic operations. The key question was
whether or not the proposed instruction set
provided a satisfactory means of logical
control for complex processes, and so he felt
that a sorting program would be a most
instructive test case. Furthermore, the
existence of IBM's special purpose machines
for sorting gave him a standard against
which he could measure the proposed com-
puter's speed.
Before we start to study yon Neumann's
program, a few disclaimers are
in
order. In
the first place, he probably never intended to
have this program published and subjected
to such scrutiny; although his manuscript
is carefully documented, he probably wanted
only to circulate it among a few interested
colleagues. So when we find a few errors and
a few instances of clumsy coding, we should
realize that it was an early effort that was
not supposed to represent a polished product.
Second, we should realize that the histori-
cal interest of this program is in great
measure due to its connection with the de-
velopment of instruction codes for stored
Computing Surveys, Vol. 2, No. 4, December 1970
248
D. E. Knuth
CONTENTS
Introduction 247-249
The Early
EDVAC
249-251
The Next EDVAC 252-253
The Sorting Program 253-257
Storage Allocation and Timing 257-258
The Sequel 258-259
References 259-260
Computing Surveys, Vol. 2, No. 4, December 1970
program computers; it is not the earliest in-
stance of a computer program. We have
Lady Lovelace's description of a program for
calculating Bernoulli numbers that Babbage
wrote for his Analytical Engine [1, Note G];
A. M. Turing's construction [16] of his
abstract Universal Machine, which involves
many important programming concepts;
Eckert and Mauchly's first sample program
for the ENIAC [4]; and a collection of
numerical programs, dating from 1944,
written by H. H. Aiken, G. M. Hopper,
R. V. D. Campbell, R. M. Bloch, B. J. Lock-
hart, and others, for the Harvard Mark I
[10, Chs. 4, 6].
A third precaution: The notation used in
this paper differs considerably from that
used by von Neumann, so that modern
readers can more easily understand what he
did. Where he would write, for instance,
15) c -}- (m' -- 1)(p ~- 1) ~-~ 14 [ p ~- 2,
we will use an equivalent assembly-like
language form,
MOVEIN PIK p~- 1, BUFFER, [YPTR].
This new notation isn't completely trans-
parent, but it seems to be an improvement
which doesn't go so far that the machine is
obscured. (For further information about
yon Neumann's original notation, see the
section on Storage Allocation and Timing.)
To set the stage for our story, let us con-
sider briefly the developments prior to 1945
when yon Neumann wrote his sorting pro-
gram. Several electromechanical calculators
were essentially operational in the late 1930s
and early 1940s: those of Stibitz [15] and
Aiken [10] in America, and Zuse [3] in
Germany. Another machine, which had
electronic circuitry for arithmetic although
it was slowed down by mechanical memory
elements, was also developed in the late
1930s at Iowa State College, by John V.
Atanasoff and Clifford E. Berry [see 12];
this machine was designed to solve sets of
simultaneous linear equations.
In August 1942, John W. Mauchly of the
Moore School of Electrical Engineering in
Philadelphia wrote a memorandum to his
colleagues summarizing briefly the ad-
Von Neumann's First Computer Program * 249
vantages which could be expected from an
electronic high speed computer such as he
felt could reasonably be developed. He was
familiar with previous American develop-
ments in computing, and he was also aware
of the extensive calculations needed by the
Ballistic Research Laboratory (BRL) in
connection with World War II; many of
these calculations were currently being done
on a Differential Analyzer at the Moore
School. It was by no means obvious that a
useful electronic computer could be built;
but Mauchly and a young electrical engineer
named J. P. Eckert, Jr., drew up a tentative
technical outline of a suitable machine, and
Prof. J. G. Brainerd decided it was worth the
risk of committing the Moore School to a
major effort in this direction. A technical
proposal was submitted to Col. Leslie E.
Simon, Col. Paul N. Gillon, and Lt. Herman
H. Goldstine of the BRL in the spring of
1943, and in a remarkably short time the US
government entered into a contract with the
Moore School for research and development
of high speed electronic calculating devices,
beginning July 1, 1943. The project, super-
vised by Brainerd, had Eckert as chief
engineer, Mauchly as principal consultant,
and Goldstine in charge of technical liaison
with BRL. A first machine, the ENIAC
(Electronic Numerical Integrator And Com-
puter), was soon designed, and its design was
frozen at an early stage so that future efforts
could be concentrated on its production and
testing; it was dedicated on February 15,
1946. (For further details about the develop-
ment of the ENIAC, see [6].)
The ENIAC was a highly parallel com-
puter; weighing over 30 tons, it involved
over 19,000 vacuum tubes, 1500 relays, etc.
Because of its electronic circuitry, it was
considerably faster than any computing
machine previously built. But it had only 20
words of internal memory, and it required
complicated manual operations for setting
up a program on plugboards. Long before
ENIAC was completed, it became clear to
the designers that they could utilize the
equipment more efficiently if they would
adopt serial methods instead of so much
parallelism; so in January 1944 they sketched
out a "magnetic calculating machine" in
which successive digits of numbers were
transmitted serially from a memory device
to central electronic computing circuits and
back again. Early in 1944, Eckert and
Mauchly invented an acoustic delay-line
memory device which made it possible to
obtain a fairly large storage capacity with
comparatively little hardware; so it became
evident that great improvements over
ENIAC could be made, at considerably less
cost. "Therefore, by July, 1944, it was
agreed that when work on the ENIAC
permitted, the development and construc-
tion of such a machine should be undertaken.
This machine has come to be known as the
EDVAC (Electronic Discrete VAriable
Computer)" [5].
In the latter part of 1944, John yon Neu-
mann (a consultant to BRL) became a
consultant to the EDVAC project. He con-
tributed to many discussions on logical
circuitry, and he designed the order code
which was to be used. In the spring of 1945,
he wrote a preliminary report [17] which
gives a detailed discussion of arithmetic
circuitry and the motivation for various
design decisions which were made as EDVAC
evolved. This takes us to the beginning of
our story.
THE EARLY EDVAC
VOD Neumann's first draft report [17, 18] on
the EDVAC proposed building a serial
computer with three 32-bit registers and
8192 32-bit words of auxiliary memory. The
three registers were called i and j (for inputs
to the arithmetic circuitry) and o (for out-
put) ; for convenience in what follows we will
denote these registers by the upper-case
letters I, J, and A. The EDVAC memory
was to be divided into 256 "tanks" of 32
words each, operating in a cyclic fashion.
Word 0 of each tank would pass a reading
station one bit at a time, then (32 bit-times
later) word 1 would be available,..., finally
word 31, then word 0 again, etc. Thus the
accessing of information from tanks is essen-
tially the same as we now have from drums
or head-per-track disks. A bit-time was to be
1 #sec, so the cycle time for each tank came
Computing Surveys, Vol 2, No. 4, December 1970
250 D. E. Knuth
to 32 × 32 = 1024 ~sec. The tanks were to
be constructed from Eckert and Mauchly's
mercury delay lines; this concept was later
used in the memory of the UNIVAC I
computer (1951). Although yon Neumann
realized that faster operation could be
achieved with a random-access memory, the
only known way of building such memories
economically was the "iconoscope" (like a
TV tube, with light or dark spots created and
sensed by an electron beam), and he tem-
porarily rejected it since its reliability was
still unproved.
Each 32-bit word was either a number or
an instruction code; the first bit was 0 for
numbers and 1 for instructions. Von Neu-
mann suggested writing binary numbers in
reverse order, with the least significant
digits at the left, since binary notation was
unfamiliar anyway and since the serial
circuitry found it most convenient to process
least significant digits first. The last bit of a
number, following the most significant bit,
was its sign; numbers were represented in
two's complement notation. Thus the word
boblb2b3 ... b3ob31 , bo = O,
denoted the number
2-~°bl +
2-2962 -}- 2-2Sb3 +4- "''
+ 2-1b30 -- b31,
and 30-bit fractions in the range --1 _~
x < 1 were representable. For addition,
subtraction, and conversion operations, the
number could also be regarded as the integer
bl + 2b2 + 4b3 + ... + 229b30 - 23°b31,
so that integers in the range -230 ~ x < 23°
were representable. Binary coded decimal
integers (abcdefg)lo were also allowed, in the
form
0 0 0 0 ala2a3a4blb2b3b4 glgsgag4,
where
ala2aaa4
was the code for digit a, and
blb2b3b4 was the code for digit b, etc., in
reverse binary order. (Thus 0000 = 0,
1000 = 1, 0100 = 2,---, 0001 = 8,
1001
= 9.)
Instruction words were to have the form
I aoa~aaa3a4bob~b2OOOOOOOOOOyoyly2y, y.xcx~xaxax, xtX6XT,
where a = aoala2a3a4 denoted an operation
code, b = boblb2 denoted a variant, y --
y0 + 2yl + 4y2.+ 8y3 Jr 16y4 denoted a
word position within a tank, and x =
x0 + 2Xl -4- .'. + 128x7 denoted a tank
number. The following arithmetic operation
codes were proposed, affecting the registers
I, J, and A :
AD (a = 00000). SetA (--IA-J.
SB (a = 00001). SetA ~--I- J
*ML (a = 00010). Set A (-- A -4- I X J
(rounded).
DV (a = 00011). Set A ~-- I/J (rounded).
SQ (a = 00100). Set A ~-- ~/I (rounded).
II (a = 00101). SetA~--l.
JJ (a = 00110). SetA ~--J.
SL (a = 00111). if A > 0, set A ~-- I; if
A < 0, setA~--J
DB (a = 01000). Set A ~-- binary equivalent
of decimal number I.
BD (a = 01001) Set A ~- decimal equiva-
lent of binary number I.
(As stated in the Introduction, we are
changing von Neumann's notation; the
mnemonic symbols for these codes are ad hoc
symbols contriv0d solely for the purposes of
the present paper. Note that multiplication,
division, and square root were to produce
rounded results. Not all details of these
operations were fully specified by yon
Neumann; division and square root would
change the contents of I, but it is not clear
that a valid remainder would be left there.
The decimal-to-binary and binary-to-deci-
mal operations were not worked out. Ap-
parently overflow conditions caused no
special action.)
Each of the above arithmetic operations
was to be used with one of several variants
specified by b = boblb2 :
H (b = 111). Do the operation as described
above, holding the result in A.
A (b = 100) Do the operation as described
above, then set J *-- I, I ~-- A, A <-- 0.
S (b = 000). Do the operation as described
above, then store the result A in memory location
yx and set A ~-- 0.
F (b = 101). Do the operation as described
above, then store the result into the word immedi-
ately following this instruction, set A ~ 0, and
perform the altered instruction.
N (b = 110) Do the operation as described
above, then store the result into the word immedi-
Computing Surveys, Vol. 2, No. 4, December 1970
Von Neumann's First Computer Program
251
ately following this instruction, set A ~-- 0, and
skip
the altered instruction.
Thus, for example, ADS
yx
would have the
effect of setting location
yx
to I -{- J, and
clearing A to zero; JJA would interchange
the contents of I and J, and clear A; SLH
would set A to either I or J, according as the
previous sign of A was 0 or 1. (The memory
specification
yx
was ignored on all variants
except S.)
Besides arithmetic operations, the ma-
chine could do the following:
JMP (a --- "11000, b -- 000). Take the next
instruction from location
yx
(then 1 W
yx,
ete ).
LOD (a--- 10000, b = 000). SetJ~I, then
set I to the contents of memory location
yx.
Further codes a = 01010, 01011, 01100,
01101, 01110, 01111 were reserved for input
and output operations (which were not yet
specified) and stopping the machine.
There was an important exception to the
operations as we have described them: Only
numbers (not instructions) ever appeared ill
the registers I, J, and A. When the LOD
operations specified a memory address con-
taining an instruction, only the
yx
part of
that instruction was to be loaded into I;
the other bits were cleared. Conversely, when
storing into memory by means of variants
S, F, and N, only the least significant 13
bits of the number in A were to be stored
in the
yx
part, if the memory location con-
tained an instruction word.
Instructions were to be executed from
consecutive locations, unless the sequence of
control was modified by a JMP order. If
the control sequence would come across a
number (not an instruction word), the effect
would be as if an LOD instruction were per-
formed referring to this number.
Most instructions would be performed in
one word-time, so that the machine could
keep up with the speed of the long tanks
where instructions were stored. But multi-
plication, division, square root, and radix
conversion took 33 word-times (1056 ~sec).
References to memory, by means of LOD
operations and the S variant, would require
an additional 1024 ~sec unless the memory
address was perfectly synchronized to match
the following word of instructions. (For
multiplication, division, and square root
extraction, there was a little more leeway,
since those operations actually were com-
pleted in about 950 ~sec.)
The reader will note that much of the
space in instruction words is wasted. Von
Neumann realized this, but did not think it
important at the time, since [17, p. 96] the
programming problems he had considered
required only a small fraction of the memory
for instruction storage. But we will see that
he changed his mind later.
The machine we have considered here
differs slightly from yon Neumann's de-
scription iD [17], since the modifications
stated in his letter [18] have been included.
He wrote, from Los Alamos to Philadelphia,
"The contents of this letter belong, of course,
into the manuscript [17], and I will continue
the manuscript and incorporate these things
also, after I get it back from you--if possible
with comments.., from you, Pres Eckert,
John Mauchly, and the others." But the
manuscript was never completed, nor were
the modifications inserted when it was typed
a month later, presumably because there
were so many other things to be done. It is
interesting to note that yon Neumann's
letter [18] also proposed the design of a
special typewriter for preparing programs
from partially mnemonic input. Pushing a
key marked -[- would cause the bits 100000
to be assembled (the first six bits of an addi-
tion instruction); then a key marked H
would insert the subsequent bits 111000...00,
forming a complete instruction word on a
magnetic tape.
The differences between [17] and the
machine described here are chiefly concerned
with improvements in the logistics of instruc-
tion modification. (a) There was no variant
N; instead, variant F would not treat the
altered word as an instruction if it turned
out to be a number. (b) The convention on
loading only 13 bits of instructions was not
present (although the convention about
storing only 13 bits into instruction words
was). (c) Three other variants, like S, A, F
but not clearing register A, were originally
included.
Computing Surveys, Vol. 2, No. 4, December 1970
252
D. E. Knuth
THE NEXT EDVAC
Von Neumann's letter says, "I have also
worked on sorting questions .... I will
write you about the details very soon." He
said that he had written an internal sorting
program requiring about 130 words of in-
structions; it could sort 500 p-word items
on a one-word key in about 1 + .425 (p -- 1)
minutes.
"I
suspect that these arrangements,
which represent only a first attempt, could
be improved ....
"At
any rate the moral seems to be that
the EDVAC, with the logical controls as
planned for 'mathematical' problems, and
without any modifications for 'sorting'
problems, is definitely faster than the
[contemporary IBM sorters, about 400
cards/minute] .... Since the IBM's are
really very good in sorting, and since accord-
ing to the above, sorting can be meshed with
the other operations of the EDVAC without
human intervention or need for additional
equipment, etc., the situation looks reason-
ably satisfactory to me .... It is legitimate
to conclude already on the basis of the now
available evidence, that the EDVAC is
very nearly an 'all-purpose' machine, and
that the present principles for the logical
controls are sound."
But von Neumann's code for this sorting
program does not seem to have survived; we
can only say that his timing estimates look
reasonable, since for large p they come to
slightly over 5 msec per pass per word
transferred. The program which now is in
Dr. Goldstine's files is roughly 80 times
faster, due to important improvements in
machine organization which yon Neumann
considered shortly afterward. This second
EDVAC design was apparently never de-
fined in as much detail as the previous one,
but a brief summary of its instruction codes
appears in [5, p. 76] and we can deduce other
properties by studying yon Neumann's
program. Therefore we can reconstruct the
main features of the machine.
The chief improvement incorporated into
this version of EDVAC was the introduction
of "short tanks" whose capacity was one
word each; this provided a small fast-access
memory which essentially increased the
number of registers, and the old I and J
disappeared. Block transfer operations be-
tween the short and the long tanks made
many processes faster. The tentative plans
in [5] call for 32 short tanks, and 2048 addi-
tional words in 64 long tanks. "Combining
this with the almost unlimited memory
capacity of the magnetic tape (even though
the numbers are not available here so
quickly) it seems that very few problems
will exceed this capacity" [5, p. 81].
Here are the basic operations allowed by
the new EDVAC code, exclusive of multi-
plication and division [let
C(s)
denote the
contents of short tank number s]:
*PIK
s,t,x
Transfer s consecutive words,
starting at long tank location x, to s consecutive
short tanks, starting at short tank number t. If x
is unspecified, the next s words following this
instruction are used, and the (s + 1)-th is the next
instruction
*PUT
s,t,x
Transfer s consecutive words,
starting at short tank number t, to s consecutive
long tank positions starting at location x. If x is
unspecified, the next s words following this instruc o
tion are used, and the (s + 1)-th is the next in-
struction.
*ADD
s,t. SetA (--C(s) + C(t).
-SUB
s,t.
SetA
~-C(s) - C(t).
*SEL s,/ IrA ~
O, setA~--C(s);ifA ~ O,
set
A ~-- C(t)
TRA x. Go to long tank location x (then x +
1. etc.) for subsequent instructions
JMP s. Go to short tank number s (then
s + 1, etc ) for subsequent instructions.
STOs. Set
C(s) ~--A.
SET s,t
SetC(s)(--C(t)
As before, operations which did not refer to
long tank addresses took just one word-
time (32 t~sec), with the exception of "long"
arithmetic operations like multiplication and
division. When a long tank location was
specified, the machine waited until the
desired word was accessible; at least two
word-times were needed for the instruction
TRAx, due to "long tank switching," if
the instruction was executed from a short
tank.
A distinction was made, as before, be-
tween numbers and instruction words: When
STO or SET attempted to store a new value
into an instruction word, only that part of
the instruction which specified a long tank
Computing Surveys, Vol. 2, No. 4, December 1970
Von Neumann's First Computer Program 253
location x was to be affected, and the value
in A was regarded as an integer•
Tentative plans for representing the
instructions in memory are discussed briefly
in [5, pp. 83-86].
THE SORTING PROGRAM
Now we are ready to discuss von Neumann's
program• His manuscript, written in ink, is
23 pages long; the first page still shows
traces of the penciled phrase "TOP
SECRET," which was subsequently erased•
(In 1945, work on computers was classified,
due to its connections with military prob-
lems.) A facsimile of page 5, the first page of
the program itself, appears as Figure 1.
Von Neumann begins his memo by de-
fining the idea of sorting records into order,
and of merging two strings of records that
have been sorted separately into a single
sorted sequence. Then he states the purpose
of the program: "We wish to formulate
code instructions for sorting and for mesh-
ing [i.e. merging], and to see how much
control-capacity they tie up and how much
time they require."
He never actually gets around to coding
the entire sorting routine in this document;
only the merging process is described. For
the merging problem, we assume that n
records Xo, xx, •, x,_x are given, consist-
ing of p words each; the first word of each
record is called its "key," and we have
key(xo) _< key(x1) _< .-. < key(x,_l). An
additional m p-word records y0, yl, "",
ym-1 are also given, with key(y0) _< key(yl) g
.- < key(y~_l); the problem is to put the
x's and y's together into the merged se-
quence go, zl, ... , z,+,~-i, in such a way
that key(zo) _< key(z1) g ..- < key(z,+~_l).
He formulated the merging method as
follows (based on a procedure then used
with the IBM collator): Assume that we
have found the first l records Zo, ...,
z~_l, where 0 _< l _< n + m; and assume
further that these l records consist of Xo,
, x,,_l and Yo, , y~,,-1 in some order,
where0_< n' _< n, 0 < m' < m, andn'-l-
m ~ = l. There are four cases:
(a) n' < n, m' < m. There are two sub-
cases:
(al) key(x,,) _< key(y~,). Let zz = xn,,
and replace (l, n', m') by (l + 1, n' + 1, m').
(a2) key(x,,) > key(y~,). Let zz = y~,,
and replace (/, n', m') by (l + 1, n', m' + 1).
(l~) n' < n, m' = m. Same action as
(al).
(~) n' = n, m' < m. Same action as
(a2).
(6) n' -- n, m' = m. The process has
been completed.
His program is divided up according to
cases in this same way (sort of a "decision
table" arrangement). In order to make his
coding reasonably easy to follow, it is trans-
literated here into a symbolic assembly
language such as people might use with the
machine if it existed today. We use the
pseudo-operation a RST k (RST means
"reserve short tank") to mean that symbol
is to refer to the first of k consecutive short
tank locations. The first RST in a program
reserves short tank number 0, and short
tanks are reserved consecutively thereafter•
The other notations of our assembly lan-
guage are more familiar: "EQU" denotes
"equivalence", "CON" denotes an integer
constant, an asterisk denotes the current
location, and "**" denotes an address
which will be filled in dynamically as the
program runs.
Von Neumann's first step in coding the
program was to consider the four-way divi-
sion into cases; see (A). (Note: All numbers
manipulated in the program are treated as
integers.) This code assumes that the short
tank locations have been set up appropri-
ately; in particular, location SWITCH
contains a TRA instruction. The code in (A)
(line 22) sets the address of that TRA to
either ALPHA, BETA, GAMMA, or
DELTA.
Next comes the code for routines (a), (f~),
(~), and (6); see (B). Here we have a rather
awkward piece of coding; von Neumann
thought of a tricky way to reduce cases (f~)
and (~,) to case (a) by giving artificial
values 0 and -1 to key(y~,) - key(x,,).
But he didn't realize the far simpler approach
of making (8) and (~) identical, respec-
tively, to (al) and (a2). Thus, he could have
Computing
Surveys, Vol. 2, No.
4,
December 1970
254
©
D.E. Knuth
X:,~5 ) ~ ~, , z, , ...
:
¢ ) T Y, o) w'.~'-.~.,.~
~,) ~., 7,, ,,'> ,.: ,~ ,.,., -:/t.....,-
~,) a- -. 7i, ~2) /¢"/r .,o, "d,"," ",'.~ ",-
.- ~.)
... ~ "~
~,.~.
/o,) ~-. ~"
I
Ab/A~I~¢
7~,..,..,, .,~ ,,~ .,.,.,.~.,,-f" ,'¢.~ ~ ~.,:, ~ a, /,,, /,, /,.,
c,~,) ~ co,,.v, --,',.~-~,/-,.~/',-- ~ "~,-~ "I" < ~2.
FIG. 1. The original manuscript.
simply changed line 27 to "SEL BETA,
GAMMA", omitting lines 24, 25, 30, 31, 32,
33, 34, 35 entirely, and then he could have
used BETA and GAMMA instead of
ALPHA1 and ALPHA2 in the remainder of
the program. This would have saved four of
the precious short tank locations, and it
would have made the calculation slightly
faster. Similarly line 36 is unnecessary, since
location EXIT could be stored in LDELTA.
Computing Surveys, Voi. 2, No. 4, December 19T0
Von Neumann's First Computer Program
(A)
255
Line no. Location
Op
I NPRIME RST
2 MPRIME RST
$ XKEY RST
4 YKEY RST
5 N
RST
6 M
RST
7 LALPHA RST
8 LBETA RST
9 LGAMMA RST
10
LDELTA RST
11
SWITCH RST
12 TEMP1 RST
IS TEMP2 RST
14 COMPARE SUB
15
SEL
16
STO
17
SUB
18
SEL
19
STO
20 SUB
21 SEL
22 STO
~S JMP
Address(es) Remarks
1 n'
1 m ~
1 key(x.,)
1 key(y~,,)
1 n
1 m
1 Location ALPHA
1 Location BETA
1 Location GAMMA
1 Location DELTA
1 Instruction TRA **
1 Temporary storage
1 Temporary storage
NPRIME,N
A ,--n' - n.
LGAMMA, LALPHA A ~- if n' ~ n then GAMMA
else
ALPHA.
TEMP1 TEMP1 *-- A.
NPRIME,N A ~-- n' - n.
LDELTA, LBETA A ~-- if n ~ ~ n then DELTA
else
BETA.
TEMP2 TEMP2 ~-- A.
MPRIME,M A (-- m' -- m.
TEMP2,TEMP1 A ~- if m' ~ m then[TEMP2]eise[TEMP1].
SWITCH SWITCH ~-- TRA [A].
SWITCH
(B)
Lint no.
Locat*on Op
24 LALPHAI RST
25 LALPHA2 RST
$6 ALPHA SUB
27 SEL
28 STO
29 JMP
20 ZERO RST
Sl MONE RST
82 BETA SUB
$8 TRA
$4 GAMMA SUB
S5 TRA
$6 DELTA TRA
Address(es)
Rcmarhs
1 Location ALPHA1
1 Location ALPHA2
YKEY,XKEY A ~-- key(y~,) -- key(x~,).
LALPHA1,LALPHA2 ira _~ 0 then ALPHA1
else
ALPHA2.
SWITCH
SWITCH
1 0
1 --1
ZERO, ZERO A *- 0.
ALPHA+I Go to AI PHA+I.
MONE,ZERO A ~-- -I.
ALPHA+I Go co ALPHA+I.
EXIT Merging is complete.
Apparently the idea of making equivalent
program states identical is not a natural con-
cept, since even yon Neumann missed it
here.
(It is perhaps in bad taste to make such
detailed criticism of the programming, since
yon Neumann was not intending to write
an optimum program for sorting; he was
merely experimenting with a tentative order
code. Every great mathematician has a
wastebasket full of things he doesn't want
people to study carefully ! On the other hand,
this particular manuscript was not merely a
rough sketch, it was evidently put together
with some care, so it seems fair to look closely
at it in an attempt to discern which aspects
of programming were most difficult in their
conception. The idea is not to chortle over
the fact that yon Neumann's program isn't
perfect; it is rather to realize that the im-
perfections give some historical insights,
because of when the program was written.)
Computing Surveys, Vol. 2, No. 4, December 1970
256
D. E. Knuth
(C)
Line no. Location Op Address(es)
$7 XPTR RST 1
38 YPTR RST 1
39 ZPTR RST 1
40 SIZE RST 1
41 MOVEIN RST 1
112 MOVEOUT RST 1
]v5 RETURN RST 1
44 ONE RST 1
]~ BUFFER RST p+l
$6 ALPHA1 SET MOVEIN, XPTR
47 SET MOVEOUT, ZPTR
68 PIK 1, RETURN
$9 [ TRA BACK1
5O
JMP MOVEIN
51
BACK1 ADD NPRIME, ONE
52 STO NPRIME
5S SET XKEY, BUFFER+p
54 ADD XPTR,SIZE
55 STO XPTR
56
ADD ZPTR, SIZE
57
STO ZPTR
58
TRA COMPARE
Remarks
Location of x,,
Location of y~,
Location of z,,+m,
P
Instruction PIK p+I,BUFFER,**
Instruction PUT p,BUFFER,**
Instruction TRA BACK1 or BACK2
1
Place for record being transferred
MOVEIN ~- PIK pT1,BUFFER,[XPTR]
MOVEOUT *-- PUT p,BUFFER, [ZPTR].
RETURN *- TRA BACK1
(This line "picked.")
Execute three commands in short tank.
A*---n'+l.
n'*--A.
Update key(x.,).
A *- [XPTR]+p.
Update location of x~,.
A ~-- [ZPTR]+p.
Update location of z,,+m,.
Return to COMPARE.
The sorting program continues with the
routine for case (al): In (C) a block of
p + 1 words (including the key for the next
record) is transferred into short tanks, and
p words are moved into the z area. This is a
good way to avoid the latency problems of
delay-line memories, and it accounts for the
considerable increase in speed in this pro-
gram compared to what was possible with the
first EDVAC code.
A slight improvement could be made here
if ZPTR were omitted, letting MOVEOUT
keep track of tile current z location; a short
tank would be saved, as well as the instruc-
tion in line 47 (and a similar instruction for
case (,2)). However this trick would have
made the setup somewhat less symmetrical.
Line 58 could have been omitted if the code
for COMPARE were placed right after line
57. If line 51 were changed to "SUB
NPRIME,MONE", another short tank
could have been saved. Since yon Neumann
didn't mention these simplifications, while
his work on logic design strongly suggests
that he would have thought of them, it is
plausible to say that he wasn't especially
concerned with saving space in short tanks,
although he does mention that the scarcity of
short tanks places limits on the record size p.
(He says that p _< 8 would be required if
there were only 32 short tanks, while p < 40
if there were 64; perhaps he was purposely
wasting short tanks, in order to convince
other people that at least 64 short tanks are
desirable !)
We need not discuss the code for (a2),
since it is essentially the same as that for
(al). All that is left, therefore, is to write an
initialization routine that gets everything
started properly. For this purpose, yon
Neumann juggled the short tank locations so
that the six which are set up from outside
this routine (namely N, M, XPTR, YPTR,
ZPTR, SIZE) come first; then come two
which are somewhat special (namely XKEY
and YKEY, which must contain key(x0)
and key(y0)); then come 14 which are to be
set to certain constant values; and then
come the remaining "scratch" locations.
Figure 2 shows the resulting complete pro-
gram, including the initialization of the
short tanks. (At this point in his discussion,
yon Neumann apparently forgot about
TEMP1 and TEMP2; Figure 2 assigns them
to the buffer area.)
Like nearly all programs, this one has a
Computing Surveys,
Vol. 2, No. 4, December 1970
Von Neumann's First Computer Program 257
N RST I
M RST 1
XPTR RST 1
YPTR RST 1
ZPTR RST 1
SIZE RST 1
XKEY RST 1
YKEY RST 1
NPRIME RST 1
MPRIME RST 1
LALPHA RST 1
LBETA RST 1
LGAMMA RST 1
LDELTA RST 1
SWITCH RST 1
LALPHA1 RST 1
LALPHA2 RST 1
ZERO RST 1
MONE RST 1
ONE RST 1
MOVEIN RST 1
MOVEOUT RST 1
RETURN RST 1
BUFFER RST p-}-I
TEMPI EQU BUFFER+I
TEMP2 EQU BUFFER+2
COMPARE SUB NPRIME,N e+27
SEL LGAMMA,LALPHA e-F28
STO TEMPI e-{-29
SUB
NPRIME,N e+30
SEL LDELTA,LBETA a+31
STO TEMP2 e+32
SUB MPRIME,M e+33
SEL TEMP2,TEMP1 e-]-34
STO SWITCH e+35
JMP
SWITCH
e+36
ALPHA SUB YKEY,XKEY e+43
SEL LALPHAI,LALPHA2 e+44
STO SWITCH e+45
JMP SWITCH "e+46
BETA SUB ZERO,ZERO e+39
TRA ALPHA+I e+40
GAMMA SUB MONE,ZERO e+41
TRA ALPHA+I e+42
DELTA TRA EXIT e+81
ALPHA1
SET
MOVEIN,XPTR e+47
SET MOVEOUT,ZPTR e+48
BACKI
ALPIdLA2
BACK2
BRING
MERGE
BACK3
PIK I,RETURN 6+49
[ TRA BACKI ¢+50
JMP MOVEIN e-i-51
ADD NPRIME,ONE e-t-56
STO NPRIME e+57
SET XKEY,BUFFER+p e+58
ADD XPTR,SIZE e-i-59
STO XPTR a+60
ADD ZPTR,SIZE e+61
STO ZPTR ¢~+62
TRA COMPARE ~+63
SET MOVEIN,YPTR e+6t
SET MOVEOUT,ZPTR e+65
PIK 1,RETURN ~+66
[ TRA BACK2
e+67
JMP MOVEIN e-F68
ADD MPRIME,ONE ¢+73
STO MPRIME e+74
SET YKEY,BUFFER+p e-t-75
ADD YPTR,SIZE e+76
STO YPTR e+77
ADD ZPTR,SIZE e+78
STO ZPTR
e+79
TRA COMPARE e+80
EQU NPRIME
PIK 3,BRING e÷O
I
PIK I,XKEY,** e-{-I
PIK I,YKEY,** e+2
TRA BACK3 ~-F3
SET BRING,XPTR e+4
SET BRING+I,YPTR e+5
JMP BRING e+6
PIK 14,NPRIME e+ll
I
CON
0
e+12
CON 0 e+13
CON ALPHA e+14
CON BETA e+15
CON GAMMA e+16
CON DELTA e-}-17
TRA ** e+18
CON ALPHA1 e+19
CON ALPHA2 e+20
CON 0 e-}-21
CON --1 e+22
PIK p+I,BUFFER,** e+23
PUT p,BUFFER,** c+24
_CON 1 e+25
TRA COMPARE e+26
FIG. 2
bug: The second-last instruction "CON
1"
actually belongs two lines earlier. If von
Neumann had had an EDVAC on which to
run this program, he would have discovered
debugging i
STORAGE ALLOCATION AND TIMING
Although von Neumann didn't use a sym-
bolic language to express his instructions, as
done here, his notation wasn't completely
Computing Surveys, Vol. 2, No 4, December 1970
258
D. E. Knuth
numeric either. He used il, 21, "" for short
tanks NPRIME, MPRIME, etc. in the first
piece of code, and later is, ~2, "'" for the
short tanks in the second, etc. Long tank
locations were represented by unbarred
numbers with subscripts; for example, lines
32
and 33 in his notation were written as
follows:
"18) ~ -
~ ~)
~ o
2~) 2~-+ ¢
and from here on like (a) with 0,0 for
xn0, y0 .,, This was essentially a "regional"
addressing technique, which was used by
many programmers in the ensuing decade.
After having written the program, he
assigned actual addresses to the subscripted
ones. In order to make the code reloeatable,
for use as a general open subroutine, he
assigned the addresses relative to an un-
specified starting location e. His address
assignments are shown in Figure 2 at the
right of the instructions.
He made an interesting and rather subtle
error of judgment here, regarding latency
time. Since the instruction in location
ALPHA1-}-4 (line 50 of the program in the
preceding section) jumps into the short
tanks to execute three commands and
transfer to BACK1, he didn't want BACK1
to occupy location ALPHAI+5 since the
long tank wouldn't be ready for that instruc-
tion until at least 33 word times after
ALPHAI+4. So he intercalated 4 empty
words between ALPHAI+4 and BACK1,
"in
order to avoid a delay of about one long
tank." But since the instructions in
MOVEIN and MOVEOUT make essen-
tially random references to long tanks, an
elementary argument can be given to prove
that the
average
computation time which
elapses between the execution of instruction
ALPHAI+4 and the execution of instruc-
tion BACK1 is 2p + 49.5 word times, com-
pletely
independent
of the location of
BACKli Therefore BACK1 should really
have been placed so that its
subsequent
instructions are optimally located, i.e. so
that the TRA COMPARE takes the least
amount of time. Von Neumann inserted
extra blank words into the initialization
routine for the same fallacious reason. On
the other hand his allocation of ALPHA,
BETA, and GAMMA vis-a-vis each other
and the COMPARE routine was correctly
handled; the instruction in SWITCH is not
a random memory reference, so his intuition
didn't mislead him here. (ALPHA1 and
ALPHA2 .were placed badly; this was ap-
parently an oversight.)
Von Neumann discussed the relocatability
of this routine by enumerating the nine
instructions which are variable (those whose
codes depend on p, EXIT, or the relocation
factor e). He didn't say exactly how these
instructions were to be changed after they
have been read in from tape; he apparently
did not yet realize that the limited EDVAC
code he had proposed (with no shift instruc-
tions, for example) made it difficult to insert
p into the "PIK" and "PUT" instructions,
since the machine could only store into the
address field of instruction words.
It is perhaps significant that he thought of
this program as an open subroutine, not
closed, since he did not regard EXIT as a
parameter on a par with n, m, location(x0),
etc.
He concludes his memorandum with an
analysis of the running time, leading to a
total time of 2.60
+ (n + m)(p/16 +
2.61)
msec. (His actual figure was 1.61 instead of
2.61, due to a slip in arithmetic.) Some
errors in the calculation of latency times,
related to his misunderstanding cited above,
make this analysis slightly invalid; the
reader may verify that the actual running
time (averaged over all possible placements
of x0, y0, and z0 in the long tanks) is 3056 +
(n + m)(64p +
4016) ~sec. If we incorporate
all of the improvements to the coding that
have been mentioned above, the average
time decreases to 2576
+ (n + m)(64p +
2560) ~sec.
THE SEQUEL
After World War II came to an end, the
original EDVAC group disbanded; Eckert
and Mauehly remained in Philadelphia, to
form their own company, while Goldstine
and yon Neumann went to the Institute for
Advanced Study in Princeton. The veil of
Computing Surveys, Vol. 2, No. 4, December 1970
Von Neumann's First Computer Program
259
secrecy surrounding electronic computers
was lifted when ENIAC was dedicated, and
the great potential for high speed computing
was gradually realized by more and more
people. The principles of EDVAC's design
were very strong influences on all of the
computers constructed during the next
decade (see [14]).
After yon Neumann's first two versions of
instruction codes had been digested by a
number of people, other variations began
to be proposed. In November 1945, Calvin
N. Mooers devised a three-address code as
an alternative to yon Neumann's idea; and
in August 1946, he lectured at the Moore
School about a further development, the
use of flagged data for terminating loops [13,
Vol. 4, lect. 39]. Another interesting three-
address code, due to John Mauchly, was de-
scribed by Eckert in the same series of lec-
tures [13, Vol. 1, lect. 10]. Meanwhile yon
Neumann had developed his ideas somewhat
further; he and Goldstine, in collaboration
with Arthur W. Burks, prepared a mono-
graph which was to be the first widely cir-
culated document about high speed com-
puters, "Preliminary discussion of the logical
design of an electronic computing instru-
ment" [2]. By this time, their proposed ma-
chine had already changed somewhat dras-
tically: It was to have a random-access
(iconoscope) memory of 4096 40-bit words.
Instructions were 20 bits long, packed two
to a word. The operation codes had a differ-
ent flavor, too, resembling today's IBM
7094: "Clear and add x", etc. Left and right
shift operations were included for the first
time.
The EDVAC project itself continued at
the Moore School until August 1949, when
EDVAC was delivered to the BRL. In its
final form, the EDVAC had a four-address
instruction code (the fourth address specify-
ing the location of the next instruction), de-
vised by Samuel Lubkin. Its memory con-
sisted of 128 long tanks, each containing
eight 44-bit words, plus six one-word non-
addressable short tanks, and an auxiliary
drum. One of the only things that remained
unchanged throughout most of its design
was the basic clock rate of one ~sec per bit;
the completed machine processed one word
every 48 ~sec, leaving four "blank" bits be-
tween words. Further development work on
input/output devices was necessary before
EDVAC became operational late in 1951;
then it continued steady and inexpensive
operation for many years, averaging, for
example, 145 hours of useful work per week
in 1961 [11]. It was finally retired from service
in December 1962.
For the story of yon Neumann's other
pioneering contributions to computing, see
Goldstine's recent account [6]. Goldstine and
yon Neumann published three important
supplements to [2] during the next years;
these famous documents [7-9] formed the
foundation for computer programming tech-
niques, covering a wide range of topics from
flowcharts to numerical analysis to reloeat-
able loading routines. Reference [8, Sec. 11]
deals with sorting and merging in consider-
able detail; von Neumann here put the fin-
ishing touches onto the work he had sketched
in 1945.
ACKNOWLEDGMENTS
I wish to thank Drs. Goldstine and Mauehly
for considerable assistance in checking the
historical details presented in this paper,
and for several delightfully informative dis-
cussions.
REFERENCES
1. AUGUSTA, ADA, COUNTESS OF LOVELACE.
Annotated transl, of Menabrea, L. F., Sketch
of the Analytical Engine invented by Charles
Babbage. In Charles Babbage and h~s Cal(ulat-
~ng Engines (Phihp Morrison and Emily Mor-
rison, Eds.), Dover, New York, 1961, pp. 225-
297; see also p. 68.
2. BURKS, ARTHUR W., HERMAN H. GOLDSTINE,
ANn JOHN VON NEUMANN Preliminary discus-
sion of the logical design of an electronic com-
puting instrument. Inst. for Advanced Study,
Princeton, N. J., June 28, 1946; 2nd ed., Sept.
2, 1947 (42 pp). (Reprinted in yon Neumann's
Collected Works, Vol. 5, A. H. Taub, Ed. (Per-
gamon, London, 1963), pp 34-79.
3. DESMONDE, WILLIAM H., AND KLAUS J. BERK o
LING. The Zuse Z-3. Datamation 1~ (Sept.
1966), 30-31
4. ECKERT, J. PRESPER, JR., AND JOHN W.
MAUCHLY. Application of analyzer to a set of
equations for external ballistics. In Proposal
for an electronic difference analyzer (J. G.
Brainerd, Ed ), Moore School of Elec. Eng.,
Computing Surveys, Vol. 2, No. 4,
December 1970
260
* D. E. Knuth
U of Pennsylvania, Philadelphia, Pa., April
1943, App. C (4 pp). (Originally classified
"Confidential.")
5. ECKERT, J. PRESPER, JR.,
AND JOHN
W
MAUCHLY. Automatic high-speed computing-
A progress report on the EDVAC. Moore
School of Elec Eng., U. of Pennsylvania,
Philadelphia, Pa., Sept. 30, 1945 (111 pages)
(Originally classified "Confidential.")
6. GOLDSTINE, HERMAN H. Chapter 3 in Com-
puters and Their Role ~n the Physical Sciences
(S Fernbach and A. H. Taub, Eds ), Gordon
and Breach, New York, 1970.
7. GOLDSTINE, HERMAN H , AND JOHN YON
NEUMANN. Planmng and coding of problems
for an electronic computing instrument, Vol.
1. Inst. for Advanced Study, Princeton, N. J,
Apml 1, 1947 (69 pp.). (Reprinted in von Neu-
mann's Collected Works, Vol 5, A H Taub,
Ed., Pergamon, London, 1963, pp. 80-151.)
8 GOLDSTINE, HERMAN H., AND JOHN YON NEU-
MANN. Planning and coding of problems for
an electromc computing instrument, Vol. 2
Inst. for Advanced Study, Princeton, N. J,
April 15, 1948 (68 pp.). (Reprinted m yon Neu-
mann's Collected Works, Vol. 5, A. H. Taub,
Ed., Pergamon, London, 1963, pp 152-214 )
9. GOLDSTINE, HERMAN H., AND JOHN YON NEU-
MANN. Planning and coding of problems for
an electronic computing instrument, Vol. 3
Inst. for Advanced Study, Princeton, N J.,
Aug. 16, 1948 (23 pp.). (Reprinted in yon
Neumann's Collected Works, Vol. 5, A H
Taub, Ed., Pergamon, London, 1963, pp
215-235 )
10. HARVARD UNIVERSITY, STAFF OF THE COMPU-
TATION LABORATORY. Annals of the Computa-
tion Laboratory, Vol I, A Manual of Operation
for the Automatic Sequence-Controlled Calcu-
lator (H Alken et al , Eds.), Harvard U. Press,
Cambridge, Mass, 1946
11 KEMPF, KARL. Electronic computers within
the Ordnance Corps Aberdeen Proving
Ground, Aberdeen, Md., Nov. 1961 (140 pp.)
12 PANTAGES, ANGELINE Computing's early
years. Datamation 13 (Oct. 1967), 60-65.
13 PATTERSON, GEORGE W. (ED). Theory and
Techniques for the Design of Electronic Digital
Computers, Vol. ~ Moore School of Elec.
Eng., U of Pennsylvania, Philadelphia, Pa.,
1946 (4 vols.)
14 ROSEN, SAUL. Electronic computers: A his-
torical survey Comput Surveys 1, 1 (March
1969), 7-36
15. STIBITZ, GEORGE R., as told to Mrs Evelyn
Loveday The relay computers at Bell Labs.
Datamation 13 (April 1967), 35-44; 13 (May
1967), 45-49.
16 TURING, A. M. On computable numbers,
with an application to the Entscheidungs-
problem. Proc. London Math. Soc. {2} ~i2 (1936),
230-265; {2} 43 (1937), 544-546.
17. YON NEUMANN, JOHN First draft of a report
on the EDVAC. Moore School of Elec Eag,
U. of Pennsylvania, Philadelphia, Pa, June 30,
1945 (101 pp). (This draft was written in
March-April 1945.)
18. VON NEUMANN, JOHN. Letter to Herman H.
Goldstme dated May 8, 1945.
Computing Surveys, Vol. 2, No. 4, December
1970

Discussion

The ENIAC was about 300 times faster than the Mark 1 at addition. As Knuth states, at times it could be quite complicated to reprogram, sometimes taking up to 2 days to set up a program, after having completely worked it out on paper. ![ENIAC](http://www.columbia.edu/cu/computinghistory/eniac1.jpg) The sorting algorithm described by von Neumann would eventually be known as **Merge Sort**. ![Merge sort](https://upload.wikimedia.org/wikipedia/commons/c/cc/Merge-sort-example-300px.gif) ### Delay lines Delay lines are a form of computer memory. Delay lines operate by transforming the electrical signal to be delayed into a mechanical signal in some fluid and then transforming it back again to an electrical one. The delay comes from the fact that transmission of mechanical signals through a fluid is rather slow when compared to that of electricity through a wire. As long as the power stays on you can “hold" signals in the delay line circuit indefinitely. Unlike modern RAM (random access memory) delay line memory is sequential-access (you read the pulses in the same order they were entered). Early delay-line memory systems had capacities of a few thousand bits and provided way of storing data at 1/100 of the cost of doing the same with vacuum tubs. Alan Turing visited von Neumann for a few weeks when mercury lines were being proposed for the EDVAC and he argued that they would never work. Turing’s arguments were based on various signal-to-noise ratio considerations. Experiments eventually proved him wrong. [Here is a video of the EDSAC Project about Mercury delay lines](https://youtu.be/xGEAPVCuwvY) ![delay lines](https://i.imgur.com/XZs8ZAs.jpg) #### Complex Number Calculator The Complex Number Calculator designed by George Stibitz was a machine capable of adding, subtracting, multiplying, and dividing complex numbers. ![complex number calculator](http://history-computer.com/ModernComputer/Relays/images/StibitzTerminal.jpg) #### Harvard Mark I Howard Aiken was an American physicist. During his time as a physics Phd student at Harvard he encountered differential equations that he could only solve numerically. He imagined an electro-mechanical device that could do much of the tedious and repetitive work for him. The device Aiken developed was originally called ASCC (Automatic Sequence Controller Calculator) and it was later renamed Harvard Mark I ![Harvard Mark 1](https://cdn.britannica.com/700x450/93/23593-004-4D70E9A0.jpg) Here is a nicely formatted version of the [“First Draft of a Report on the EDVAC”](https://www.wiley.com/legacy/wileychi/wang_archi/supp/appendix_a.pdf) ![draft](http://images.computerhistory.org/revonline/images/102689072-03-01.jpg?w=600) If you are interested in learning more about Ada Lovelace’s story in computing you should read Stephen Wolfram’s [blogpost](http://blog.stephenwolfram.com/2015/12/untangling-the-tale-of-ada-lovelace/). John Von Neumann was an Hungarian-born American mathematician that made numerous contributions in computing and mathematics. He is generally regarded as one of the most important mathematicians of his time. A child prodigy, Von Neumann grew up in an affluent Jewish family in Budapest. From a very young age he showed a strong aptitude for mathematics. However, upon completing his secondary education his father discouraged him from pursuing a career in mathematics, fearing that there was not enough money in the field. As a compromise, von Neumann simultaneously studied chemistry and mathematics. He earned a degree in chemical engineering (1925) from the Swiss Federal Institute in Zürich and a doctorate in mathematics (1926) from the University of Budapest. In 1933, at the age of 30, von Neumann was offered a lifetime professorship on the faculty of Princeton's Institute for Advanced Study. ![von neumann](https://news.brown.edu/files/styles/horizontal/public/article_images/VonNeumann.jpg?itok=7Yr9wfGI)