En lugar de compilar el código fuente para el sistema operativo respectivo (en el que está dirigido), compila una vez y se ejecuta en todas partes.
En aras de esta pregunta, lo llamaría VM (por ejemplo, tanto para Java como para .NET). Entonces, la ejecución de programas se convierte en algo así
------------ ---- ----
| Executable | -> | VM | -> | OS |
------------ ---- ----
Tiene mucho sentido, el compilador sigue siendo genérico para la VM respectiva. Sin embargo, la implementación de VM puede variar según la máquina en la que se va a instalar, es decir (* nix, windows, mac) x (32 bits, 64 bits).
Mi pregunta es, en lugar de escribir VM para las máquinas respectivas, ¿por qué el compilador no está escrito para esa máquina específica? Con esto, en lugar de descargar la VM respectiva, descarga el compilador respectivo y ese compilador se encargará del código de máquina + SO para esa máquina específica. Resultado final, la ejecución de código nativo para cualquier máquina. Definitivamente, cada código fuente necesitaría compilación para esa máquina específica, pero hoy en día, los sistemas automatizados, las compilaciones scm pueden ayudarnos a hacer esto.
¿Mis razones para estar confundido son correctas o me faltan algunos detalles técnicos aquí?
Editar:
PORTABILIDAD :
Sí, es una de las razones, pero ¿es la portabilidad un gran problema en los sistemas automatizados de hoy? ¿con qué frecuencia tenemos que preocuparnos por el hecho de que no tenemos que compilarlo para otras máquinas? Tener un código compilado para una máquina nativa daría un rendimiento mucho mejor. Tomemos Java, por ejemplo, no puede hacer programación de bajo nivel en Windows y debe elegir JNI.
Tome sistemas automatizados como TeamCity / Jenkins u otros. Podríamos tener una configuración de sistema tan automatizada donde el código enviado a través del control de versión resultaría en el ejecutable.