Iterations – Norberg – Software Development at EMCC
11
Over
the next few years, coding or programming became a burgeoning
area of activity in university computer projects and in the few companies
focused on machine developments. As Knuth and Pardo summarized in
1977, the first important programming tools were developed, focused
initially on “general-purpose subroutines for such commonly needed
processes as input-output conversions, floating-point arithmetic, and
transcendental functions.”
30
In their brief summary of the history of
compilers, Knuth and Pardo drew attention to two developments of the
early 1950s: assembly routines and interpretive routines.
31
The publication
of the Maurice Wilkes, David Wheeler, and Stanley Gill volume on
programming in 1951 became a classic in the training of programmers
over the next decade at least.
32
An early version of the book reached
programmers around the world in September 1950. Over the next few
years, a range of interpretive routines appeared, perhaps the most notable
for its influence being John Backus’ IBM 701 Speedcoding System,
published in 1954.
The EMCC group investigated the development of assembly routines for
use with BINAC and UNIVAC in the late 1940s. Indeed,
Knuth and Pardo
credited Mauchly with development of the first “high-level” programming
language that he implemented in a program called Short Code,
33
a
program that could accept algebraic equations as written and the program
would perform the indicated operations. William F. Schmitt coded this
type of problem for BINAC. In 1950, he and Albert B. Tonik recoded the
program for UNIVAC I, and in 1951 Robert Logan took the task a step
further.
34
In this program, the twelve-digit word was broken into six two-
digit packets. This can be illustrated with a simple example.
Evaluate x = a + b
In Short Code:
00 S0 03 S1 07 S2
S0, S1, and S2 represent the memory locations of the quantities x, a, and
b, and 03 stands for the operation of equality and 07 for addition. Read
from right to left S2 is added to S1, which is placed in S0. Thirty
operations were provided, including bracket indicators for evaluation of
expressions, floating point arithmetic operations, finding integral roots, the
basic mathematical functions, use of routines from a library, such as
trigonometric and logarithm calculations, and input/output operations.
35
This program was an effort to introduce more flexibility into problem
solving. And as long as the problems were small scale in which computer
time was efficiently used, the code worked well. As the scale of problems
grew, a point of diminishing returns arose where it was more efficient to
code in the regular way.
From 1947 on, coders at EMCC developed a number of subroutines for
both mathematical and business use. By 1951, this number had increased
to the point where they needed to put some order into them to increase
Iterations – Norberg – Software Development at EMCC
12
efficiency of use. Hopper took on this task in October 1951, and between
then and May 1952 she and her associates wrote the first Remington Rand
compiler A-0.
36
As Jean Sammet pointed out, “a compiler must perform at
least the following functions:
Analysis of the source code, retrieval of
appropriate routines from a library, storage allocation, and creation of
actual machine code.”
37
From Sammet’s perspective, A-0, developed for
UNIVAC I does exactly this, and she claimed that A-0 was the first
compiler. Hopper, however, speaking in 1978, commented on A-0 in the
following way.
It wasn’t what you’d call [a compiler] today, and it wasn’t what you’d call a
‘language’ today. It was a series of specifications. For each subroutine you
wrote some specs. The reason it got called a compiler was that each subroutine
was given a ‘call word,’ because the subroutines were in a library, and when you
pull stuff out of a library you compile things. It’s as simple as that.
38
While the other members of the Applications Department continued their
work on programs and routines, including diagnostic routines, for
UNIVAC I, Hopper assumed an interest in what she called “automatic
programming.” She attempted to meld the operations of the computer
system and its programs with the use of subroutines. This idea of
subroutines was exploited at EMCC before she arrived, as we saw above
in the work of Betty Snyder. Hopper’s contribution was to make it
possible not just to call up a routine from memory, but, if necessary,
actually construct a subroutine program from basic mathematical
information supplied to the system by a mathematician or programmer,
insert it into a program, and carry out the computation of the needed
values of the function. After the needed information was inserted into
memory, it could be delivered at any later time directly by UNIVAC.
UNIVAC delivered the information necessary to program the computation
of a function and its derivatives or values. Just as in the case of the
differentiator, the actual derivation of the function was done by the
computer system, not by the programmer as before. The process of
translating a subroutine into a program received the name “compiler.”
When coding the compiling routine A-0 (and A-1), the coder needed to
keep in mind three sets of memory locations.
39
(1) those locations used by the compiler, concerned with compilation, input of
information and subroutines, and output of running tape and record.
(2) those locations used by the running tape, concerned with numerical
computation, input of numerical data, and output of results.
(3)
those locations of the individual subroutines.
Thus, at any given instant during compilation, a particular word usually
had at least three addresses associated with it. For a given problem, it was
assumed there would be four tapes (UNISERVOs) available. Tape number
1 contained the instructions for compilation and data handling; number 2