The imaginary computers that let programs run anywhere
Long before Java promised write once, run anywhere, computer scientists in the late 1950s dreamed of a universal in-between language that every machine could understand. That dream rests on the abstract machine: a computer defined purely by its inputs, outputs and permitted operations, with no wires or chips required at all.
An abstract machine behaves a little like a mathematical function. It takes input, applies fixed rules one step at a time and produces output, while ignoring almost everything about real hardware. The Turing machine is the classic example: a pointer moving along a tape of symbols, rewriting them. A machine with the single rule write a 1 and step right would simply churn out an endless row of ones. Deterministic machines always give the same output for the same start, whereas non-deterministic ones may follow different paths on different runs, which can help when an exact answer is too costly.
Such a design can be built in three ways. Wired directly into circuits, it becomes something like a processor, fast but nearly impossible to alter afterwards. Written as a software program, it becomes a virtual machine, easy to change. Between the two sits firmware, where microcode lets engineers define machine instructions without fabricating new circuitry.
Programming languages lean on these designs as a halfway house between human-readable code and the bare metal. The Association for Computing Machinery pursued the universal language idea, called UNCOL, but the code it produced ran too slowly to catch on. More modest versions worked: the UCSD P-machine of 1977 and Forth in 1970, and later Smalltalk-80, Self and Java, whose object-oriented machines often tidy memory automatically with a garbage collector.
Each family of languages got its own specialised engine. Functional languages began with the SECD machine of 1964, which evaluated every argument before a call; later designs such as the Krivine machine of 1985 evaluated arguments only when needed. For the logic language Prolog, the Warren Abstract Machine of 1983 became the de facto standard compiler target, with dedicated instructions for backtracking through possible proofs.
Source: Abstract machine