FREE HISTORICAL FIGURES OF COMPUTING PROFILE
Maurice Wilkes
1913–2010 · Computer scientist and laboratory director
Maurice Wilkes
Computer scientist and laboratory director · 1913–2010 · United Kingdom
Maurice Wilkes led the Cambridge laboratory that developed EDSAC and made stored-program computing a usable research service. His work also introduced microprogramming as a systematic way to organize a processor's control. These contributions belong to a team history: David Wheeler, Stanley Gill, William Renwick, operators, engineers, and scientific users helped turn a machine into a working programming environment.
From a working machine to a computing service
EDSAC first ran a logged program on 6 May 1949. The Manchester Baby had already demonstrated electronic stored-program execution in 1948; EDSAC's importance includes its early practical service for scientific users. Cambridge's institutional chronology credits Wheeler with the Initial Orders and closed subroutines, and describes the subroutine library as collective work. Wilkes, Wheeler, and Gill published The Preparation of Programs for an Electronic Digital Computer in 1951, one of the earliest programming books. Cambridge laboratory history
A computing service has requirements beyond executing an instruction correctly. Users need conventions for loading code, representing numbers, supplying arguments, interpreting answers, and diagnosing failures. A routine that computes a useful mathematical function is not reusable merely because its instruction tape survives. Another programmer must know its input range, storage requirements, numerical error, entry point, and effects on machine state.
This distinction remains useful when evaluating a library today. A routine may be correct for normalized positive inputs and fail on zero, overflow on large values, or silently destroy a caller's temporary value. Documentation and tests describe a contract; they are not proof that every possible calling context is safe.
Worked mechanism: relocation and return addresses
The following is an original simplified machine model, not a transcription of EDSAC instructions. Suppose a routine occupies offsets 0 through 9 and has an internal branch to offset 7. If the loader places the routine at address 400, that branch must target 407. Moving it to address 700 changes the target to 707. A literal constant 7, however, must remain 7. Relocation therefore needs to distinguish an address from a number that happens to have the same bit pattern.
Now suppose the caller executes CALL 400 at address 120 and expects to continue at 121. Our model defines CALL to save 121 in a return slot and transfer control to 400. RETURN jumps to the saved address. The return convention is part of the interface, just as much as the routine's mathematical result.
A single return slot fails for nested calls. Routine A saves its caller's return address 121. A then calls B from address 406, overwriting the slot with 407. B returns successfully to 407, but A has lost 121. A stack solves this problem by storing one return address per active call: push 121, push 407, pop 407, pop 121. A stack is one possible design; saving addresses in distinct activation records also expresses the essential requirement. This teaching example explains the problem without attributing a modern CALL instruction or stack convention to the original EDSAC.
Microprogramming: implementing the instruction contract
Wilkes proposed microprogramming in 1951. EDSAC 2, in service in 1958, implemented microprogrammed control. A control store can select internal operations and determine the next control step, allowing a machine instruction to be implemented by a sequence of smaller actions. Cambridge laboratory history
Consider another deliberately simplified model. An instruction ADD address promises to update accumulator A to A + memory[address]. A possible internal sequence is:
- Copy the instruction's address field into the memory-address register.
- Start a memory read and wait until the data is ready.
- Place the returned word in a data register.
- Select addition in the arithmetic unit and write the result into A.
- Transfer control to the instruction-fetch sequence.
These steps expose constraints hidden by the instruction's short name. A memory request cannot safely be treated as completed merely because one clock tick passed. Two registers sharing a single bus may not both drive it simultaneously. Overflow behavior must agree with the instruction specification.
A hardwired controller can implement the same externally visible instruction. Microprogramming is an implementation technique, not a prerequisite for stored programs or a synonym for all internal micro-operations. A microcoded design is not automatically slower or easier to change: control-store technology, sequencing, parallelism, and verification costs matter. Some control stores are read-only; software cannot necessarily replace their contents.
Historical claims and evidence
Wilkes's leadership does not establish that he personally invented every component of EDSAC's programming system. Likewise, the 1951 book documents early organized programming practice; it does not show that all later compilers descend directly from it. Cambridge records his knighthood in 2000, not 1980. University obituary
The productive connection between the library and microprogramming is a teaching interpretation: both establish a useful operation above a more detailed implementation. Their interfaces and costs differ. A numerical subroutine is visible to a programmer and may use many machine instructions; a microprogram normally implements machinery beneath the instruction set.
Exercises
- Relocation. A routine loaded at 250 contains an internal reference to offset 12, the integer constant 12, and a reference to a fixed device register at address 12. It moves to 900. Give all three resulting values and explain what metadata a loader needs.
- Nested calls. Main calls A with return address 81. A calls B with return address 305. B calls C with return address 712. Trace a stack through all calls and returns. Explain why one globally shared return slot is insufficient even if every routine is individually correct.
- Control versus specification. In the simplified ADD sequence, memory takes either one or four cycles. An implementer always advances after one cycle. Give a failing execution and a repair. Explain whether changing hardwired control to microcode would itself repair the bug.
Compare your reasoning with the worked solutions
- The internal reference becomes
900 + 12 = 912. The integer stays 12 because its meaning is numeric rather than positional. The fixed device address also stays 12, but for a different reason: the device remains at an absolute address outside the relocated routine. The loader needs relocation information identifying which operands are relative addresses, their base, and which references must remain absolute. Adding the relocation delta to every word would corrupt both constants and fixed external references. - Writing the top on the right, the stack is initially
[], then[81],[81,305], and[81,305,712]. C pops 712 and resumes B; B pops 305 and resumes A; A pops 81 and resumes Main. A global slot would retain only 712 after the last call. Each outstanding invocation needs its own preserved continuation. A bounded stack additionally needs an overflow policy; the abstract solution does not give a finite machine unlimited recursion. - On a four-cycle read, advancing after one cycle consumes stale or undefined data. If A is 5, the intended operand is 7, and the old data register contains 2, the faulty controller can produce 7 instead of 12. It must wait for a valid ready condition or use a timing contract that guarantees completion. Microcode can contain the same faulty assumption as hardwired logic. Correctness depends on the sequencing protocol and its verified timing conditions.
Sources and further study
- Cambridge laboratory history: institutional retrospective with named contributors; useful for chronology and collaborative credit.
- Cambridge obituary of Wilkes: institutional biographical record.
- EDSAC 2 microprogramming reconstruction: later technical reconstruction, to be distinguished from an original 1950s specification.