The recent update on the project reported that we have taken a strategic step away from the nuts and bolts of the mechanical drawings and are concentrating on marshalling all known archival sources that bear on the design of the Analytical Engines in its various forms.
Why we took this step had an unforeseen prompt.
Last year, 2015, marked the 200th anniversary of the birth of Augusta Ada, Countess of Lovelace, who, in 1843, wrote in collaboration with Babbage a much-debated account of the Analytical Engine. The bicentennial year focused attention on Lovelace’s life and work: symposia, colloquia, conferences, exhibitions and publications invited perspectives on the significance of Lovelace’s role. This required amongst other efforts a new and detailed look at her famous article.
A celebrated feature of Lovelace’s article was the inclusion of a description of how an Analytical Engine would automatically calculate Bernoulli numbers. The sequence of instructions, the presentational format of the procedures, and the representation of the changing internal states of the Engine have what we now recognise as program-like features. Nowhere does Lovelace or Babbage use the word ‘program’ but for convenience the procedures she described will continue to be referred to in what follows as ‘programs’ on the understanding that to do so is anachronistic.
Rainer Glaschick in Germany was invited to create a simulation of Lovelace’s Bernoulli example for public display in an exhibition at the Heinz Nixdorf MuseumsForum in Paderborn, Germany, and he embarked on the most detailed analysis to date of the algorithmic and instructional content of the example.
Rainer consulted with several others, Bernard Sufrin in Oxford, Tim Robinson in the US, me in the UK and others, to explore and clarify programming structure, underlying and implicit concepts, and hardware capability.
In the course of this Rainer raised searching questions about the computational requirements of the Bernoulli calculation and this prompted further questions about whether the Analytical Engine as designed by the early 1840s would have been capable of calculating the Bernoulli series as Lovelace described.
What emerged from Rainer’s analysis was a clearer understanding of Lovelace’s program. However, the question of whether or not the Analytical Engine of the early 1840s was capable of executing the calculation, and managing the results, pushed to the limits our understanding of the internal control of the Analytical Engine, specifically the question of the basic control arrangements between the punched cards of which there are several types, the processor (‘the Mill’) and memory (the ‘Store’).
Our inability to definitively answer aspects of the control arrangements was partly what prompted us to change our investigative strategy.
Why is Lovelace’s Bernoulli example so difficult?
A taster of what Rainer’s exploration raised for us was the question of memory management.
The Bernoulli numbers form a series in which each new term is generated by a repeated set of operations.
Instructions are coded on Operation Cards – punched cards that specify the instruction to be performed. Associated with each Operation Card are Variable Cards that indicate where the operand is to be found in the Store, and where in the Store a result is to be placed. The relationship between an Operation Card and its Variable Cards is ‘hardwired’ i.e. the association between them is fixed and unalterable.
The Analytical Engine could automatically wind back the set of Operation Cards and rerun them in a loop a prescribed number of times. Since the Variable Cards contain a form of absolute addressing, rerunning the same physical set of Operation Cards will place each new result in the same location in memory i.e. each new result overwrites each last result and, unless printed as they are generated, intermediate results are lost.
For the Bernoulli calculation all prior results in the series are required for the computation of each new result. So results need to be retained in separate locations in the Store for later systematic retrieval.
Lovelace’s Bernoulli program describes looped iteration that does not overwrite the results register i.e. each new result is placed in a separate incremented location in the Store. Without a form of indexed or relative addressing it is not evident how this could have been done by rerunning the same set of cards and we have found no evidence in the design drawings for a relative or indexed addressing capability. The late Allan Bromley, whose work on the designs is the most detailed and penetrating to date, surmised that this is something that Babbage did not resolve.
One way of automatically computing a recurrent series and retaining all intermediate results would be to repeat the sequence of operations by feeding in physically repeated sets of cards but associate with each set a different Variable Card to direct each new result to a new location in the Store. This would allow automatic calculation of the Bernoulli sequence. But it is clear that Lovelace wished for a general solution as a demonstration of the complete generality of the Analytical Engine’s capabilities – enter n as the number of Bernoulli numbers needed and press ‘Go’ for the automatic generation of all n Bernoulli numbers in the series using the same looped set of Operation Cards.
Between 1837 and 1840 Babbage wrote some two dozen programs at least two of which involve recurrence relationships of this kind i.e. the calculation of series requiring the repetition of the same sequence of operations to generate each next term. In the two main examples each new result is generated only from the immediately prior result, and each new result overwrites its immediate predecessor. So if the nth term of a series is required the instruction set would be repeated n times and prior results, other than the (n-1)th are not material. If the prior intermediate results are needed they can be printed as they are generated, but they do not need to be retained internally in the Store to continue the series. Such recurrence relations can be computed by rerunning the same physical set of Operations and Variable Cards and overwriting each last result with each new one.
So while Babbage had described how the Engine would deal with some recurrence relationships he provided no example of a recurrence relationship that required the internal retention and reuse of all prior results. Without a systematic form of incremental addressing it is unclear that Lovelace’s Bernoulli program could run on an Analytical Engine of the early 1840s. This is part of the reason why Lovelace’s Bernoulli example is a more challenging example than any of Babbage’s earlier examples of programs.
Being unable to definitively resolve the arrangements for memory management in a decisive response to Rainer’s questions prompted us to realign our immediate objectives and to redirect our attentions to systematically master what was knowable about the Analytical Engine design – this by establishing a comprehensive database for all known technical sources, ensure that the database searchable and, perhaps most importantly given Babbage’s sometimes fragmented way of working, to internally cross-reference the material. This is a substantial task given the size of the archive but the outcome will allow a systematic analysis and reveal to what extent existing sources constitute a coherent description of a buildable machine.
Rainer Glaschick has made public his analysis of Lovelace’s Bernoulli example. His full account, Ada Lovelace's Calculation of Bernoulli's Numbers, can be found here.
October 6, 2016