The Java Virtual Machine was initially designed as a machine-independent platform for running Java programs. However, as this platform became widely distributed on many different machines, it became attractive to use JVM as a target for other programming languages. A number of different compilers have been developed which generate JVM code (one catalog from Spring 2002 listed about 160 language systems, including those with Java-based interpreters and those which generate JVM code). For languages which are a good match for the JVM, JVM provides many services that would have to be written from scratch for a conventional machine, such as memory management with garbage collection and a rich set of IO, graphics, and networking functions.
Microsoft has also been interested in the possibilities of a common network-wide platform for program distribution. Not wanting to follow the Sun/Java line, they developed their own architecture called the .NET Framework. Like Java, the design is based on a virtual machine which can be implemented on many real machines. Microsoft's machine executes MSIL, Microsoft Intermediate Language. In many ways it is similar to JVM: it is a stack-oriented machine with explicit typing of all operands, explicit object creation, type and instance methods, and memory management (including garbage collection). They provide both an interpreter and a "Just In Time" compiler.
Microsoft emphasized from the start that this would be a common base which could be used with a number of programming languages. Microsoft provided compilers for four languages: C++, C#, Visual Basic, and JScript. .NET includes a Common Type System, shared by the 4 languages, and a Common Language Runtime. This makes is possible to assemble systems in which parts are written in different programming languages.