Buenas,
Solo por completar la excelente respuesta de Eferion.
Cita: El código, como habrás notado, viene precompilado en vez de, simplemente, compilado. ¿cual es la diferencia? los compiladores de Java y .Net no generan código ejecutable, sino que procesan el código fuente y lo "traducen" a un lenguaje intermedio ( en el caso de .Net se llama MSIL, en Java lo desconozco ). Este lenguaje intermedio es el que se almacena en el "ejecutable". Como el código del ejecutable no tiene instrucciones que pueda reconocer el ordenador, se hace necesario el uso de la máquina virtual. Ésta incorpora un compilador a medida que coge ese código intermedio y genera código ejecutable.
Esto no es siempre asi. Actualmente tanto Java como C# incluyen, entre sus optimizationes, compiladores Just In Time (JIT).
http://en.wikipedia.org/wiki/Just-in-time_compilation
Gracias al JIT, cuando la maquina virtual detecta una parte del codigo que necesita mas velocidad (ya sea por su complejidad o porque es muy utilizada) realiza una compilacion super-optimizada a lenguaje maquina de dicha parte del codigo y la almacena en una cache. De esta forma, cada vez que ese codigo vuelve a ser invocado, se ejecuta el codigo nativo en lugar de interpretar y compilar al vuelo el lenguage intermedio.
En Java, por ejemplo, un fragmento de codigo se compila y cachea una vez ejecutado 1500 veces, aunque este valor de threshold es configurable. Hay que destacar que este codigo compilado esta tan optimizado que resulta algunas veces incluso mas rapido que si lo desarrollamos en C/C++.
http://www.javacodegeeks.com/2013/07...-buzzword.html http://programmers.stackexchange.com...-faster-than-c
En el caso de C# el JIT es mas configurable que en Java y se permite incluso pre-compilar directamente todo el codigo fuente.
http://www.c-sharpcorner.com/UploadF...time-compiler/
Un saludo