When Java was introduced a new concept was born as well. Instead of compiling the source code for the respective OS (on which it is targeted), you compile once and run every where. This approach added a new component in these new language. For the sake of this question, I would call it VM (both for Java and .NET). So this the execution of programs becomes something like ------------ ---- ---- | Executable | -> | VM | -> | OS | ------------ ---- ---- It perfectly make sense, The compiler remain generic for the respective VM. However, the implementation of VM may vary depending on the machine it is going to be installed i.e. (*nix, windows, mac) x (32 bit, 64 bit). My question is, instead of writing VM for respective machines, why isn't the compiler is written for that specific machine. By this, instead of downloading respective VM you download the respective compiler and that compiler will take care of the machine-code+OS for that specific machine. End result, the execution of native code for any machine. Definitely, each source code would need compilation for that specific machine but now a days, the automated systems, scm builds can help us do this thing. Do my reasons of being confused are right or i am missing some bits of technicalities here.