In a physical symbol system, some sort of control is required to select at any given time some operation to apply. An architecture provides a library of primitive functions; a program is a source of control that determines when a primitive function should be applied in order to produce a desired effect.
Perhaps the earliest example of serial control is the 19th century punch cards used to govern the patterns in silk that were woven by Joseph Marie Jacquard’s loom (Essinger, 2004). During weaving, at each pass of the loom’s shuttle holes in a card permitted some thread-controlling rods to be moved. When a rod moved, the thread that it controlled was raised; this caused the thread to be visible in that row of the pattern. A sequence of cards was created by tying cards together end to end. When this “chain” was advanced to the next card, the rods would be altered to create the appropriate appearance for the silk pattern’s next row.
The use of punch cards turned the Jacquard loom into a kind of universal machine: one changed the pattern being produced not by changing the loom, but simply by loading it with a different set of punch cards. Thus not only did Jacquard invent a new loom, but he also invented the idea of using a program to control the actions of a machine. Jacquard’s program was, of course, a sequence of punch cards. There potential for being applied to computing devices in general was recognized by computer pioneer Charles Babbage, who was inspired by Jacquard’s invention (Essinger, 2004).