A virtual machine is an emulation of a particular computer system. Virtual machines operate based on the computer architecture and functions of a real or hypothetical computer, and their implementations may involve specialized hardware, software, or a combination of both.
IBM create the CP/CMS, which were the first systems that actually allowed full virtualization for machine. Their first version, the CP-40, was really the first step in this direction. They worked on this in 1967, and between ’67 and ’72, they created the CP/CMS. These were the first in a long line of virtual machines for IBM, and they were the first part of the VM family, which is still going strong. They are in use on a number of IBM systems including the System/370, System/390, zSeries, and System Z.
Both system virtual machines and process virtual machines date to the 1960s, and continue to be areas of active developement.
System virtual machines grew out of time-sharing, as notably implemented in the Compatible Time-Sharing System (CTSS). Time-sharing allowed multiple users to use a computer concurrently: each program appeared to have full access to the machine, but only one program was executed at the time, with the system switching between programs in time slices, saving and restoring state each time. This evolved into virtual machines, notably via IBM's research systems: the M44/44X, which used partial virtualization, and the CP-40 and SIMMON, which used full virtualization and were early examples of hypervisors. The first widely available virtual machine architecture was the CP-67/CMS. An important distinction was between using multiple virtual machines on a single host system for time-sharing, as in M44/44X and CP-40, and using a single virtual machine on a host system for prototyping, as in SIMMON. Emulators, with hardware emulation of earlier systems for compatibility, date back to the IBM 360 in 1963,while the software emulation (then-called "simulation") predates it.
While the emulators have continued to be used for compatibility and to combat obsolescence, time-sharing and virtualization fell relatively out of fashion since the late 1970s through early 1990s due to the personal computing revolution, which shifted attention to individual microcomputers. With the rise of the Internet from the mid-1990s and client-server computing, attention returned to virtualization in server farms and cloud computing. A significant player has been VMware, since 1998, which virtualized the x86 architecture, allowing programs targeting personal computers to run inside virtual machines.
Process virtual machines arose originally as abstract platforms for an intermediate language used as the intermediate representation of a program by a compiler; early examples date to around 1966. An early 1966 example was the O-code machine, a virtual machine which executes O-code (object code) emitted by the front end of the BCPL compiler. This abstraction allowed the compiler to be easily ported to a new architecture by implementing a new back end that took the existing O-code and compiled it to machine code for the underlying physical machine. The Euler language used a similar design, with the intermediate language known as P (portable).This was popularized around 1970 by Pascal, notably in the Pascal-P system (1973) and Pascal-S compiler (1975), in which it was known as p-code and the resulting machine as a p-code machine. This has been influential, and virtual machines in this sense have been often generally called p-code machines. In addition to being an intermediate language, Pascal p-code was also executed directly by an interpreter implementing the virtual machine, notably in UCSD Pascal (1978); this influented later interpreters, notably the Java virtual machine (JVM).
Significant advances occurred in the implementation of Smalltalk, particularly Smalltalk-80, in the Squeak Virtual Machine, VisualWorks, and later implementations such as Strongtalk and the Self dialect. These included important performance techniques such as just-in-time (JIT) compilation and adaptive optimization, which in 1999 proved commercially successful in the HotSpot Java virtual machine. Other innovations include having a register-based virtual machine, to better match the underlying hardware, rather than a stack-based virtual machine, which is a closer match for the programming language; in 1995, this was pioneered by the Dis virtual machine for the Limbo language.
Modern uses of virtual machines, either as an intermediate target for compilation or as a platform to implement directly in an interpreter, continue as seen in the Android Runtime (ART) released in 2013, which compiles bytecode to native code, and the earlier Dalvik virtual machine, which interprets bytecode.