From the earliest times computers had taken instructions, one by one, from somewhere to know what to do next. Before 1950 there was no agreement among designers where the source of instructions should be. Alan Turing had realized that a program in “random memory” could contain conditional branches so that the program could take action X if some number that it had computed was positive, and action Y otherwise. He also pointed out that “subroutines” would be possible because the point to continue after the routine had finished could itself be kept in memory. The code to compute the square root of a number could thus be reused at several places in a larger program without copying the routine, which had been necessary when the program was performed from cards or paper tape as the medium was read. Indeed subroutines could use other subroutines.

Alas hardware of his era was not up to his vision. Machines of his era fetched their instructions from punched paper tape, cards, or even more exotic media. Machines such as these seldom had more than a few dozen words in their address space. (At that time an address was for a word of perhaps 36 bits, rather than for a byte.) Perhaps the tape came in a loop or perhaps an operator would be required to feed yet more punched cards to the machine. His vision proved largely valid a few years later.

The need and the technology for larger memories soon pushed the memory size to the point where it was feasible to keep the program in the memory itself. When Princeton committed to build an entirely electronic computer, John von Neumann filled in many details on how to store the instructions in memory, thus realizing Turing’s vision. The time was about 1951.


The stack had not been invented. Łukasiewicz had indeed already invented “Polish notation” but there seems to have been no cross fertilization. I knew them both then and saw no connection—damn.