Em vez de compilar o código-fonte para o respectivo SO (no qual está direcionado), você compila uma vez e executa em qualquer lugar.
Para fins de pergunta, eu chamaria VM (por exemplo, para Java e .NET). Portanto, a execução de programas se torna algo como
------------ ---- ----
| Executable | -> | VM | -> | OS |
------------ ---- ----
Faz perfeitamente sentido, o compilador permanece genérico para a respectiva VM. No entanto, a implementação da VM pode variar dependendo da máquina que será instalada, ou seja, (* nix, windows, mac) x (32 bits, 64 bits).
Minha pergunta é, em vez de escrever VM para as respectivas máquinas, por que o compilador não foi escrito para essa máquina específica? Por isso, em vez de fazer o download da respectiva VM, você faz o download do respectivo compilador e esse compilador cuidará do código de máquina + SO dessa máquina específica. Resultado final, a execução do código nativo para qualquer máquina. Definitivamente, cada código-fonte precisaria de compilação para essa máquina específica, mas hoje em dia, os sistemas automatizados, scm builds, podem nos ajudar a fazer isso.
Minhas razões para estar confuso estão corretas ou estou perdendo alguns detalhes técnicos aqui?
Editar:
PORTABILIDADE :
Sim, é um dos motivos, mas a portabilidade é um grande problema nos sistemas automatizados atuais? com que frequência precisamos nos preocupar com o fato de que não precisamos compilá-lo para outras máquinas? Ter um código compilado para uma máquina nativa daria um desempenho muito melhor. Pegue o Java, por exemplo, você não pode fazer programação de baixo nível no Windows e precisa escolher JNI.
Tome sistemas automatizados como TeamCity / Jenkins ou outros. Poderíamos ter uma configuração de sistema automatizada em que o código enviado pelo controle de versão resultasse no executável.